news 2026/7/17 17:34:49

《Three.js 可操控3D魔方(键盘转动+打乱+复原)》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Three.js 可操控3D魔方(键盘转动+打乱+复原)》

Three.js 可操控3D魔方(键盘转动+打乱+复原)

直接复制整段HTML打开即可运行,WASD/方向键控层旋转,一键打乱、一键复原

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>Three.js 可玩3D魔方</title><style>*{margin:0;padding:0;box-sizing:border-box;}body{overflow:hidden;background:#121218;font-family:sans-serif;}canvas{display:block;}.btn-box{position:fixed;top:20px;left:20px;z-index:999;}button{padding:8px 16px;margin:0 5px;border:none;border-radius:4px;cursor:pointer;background:#2563eb;color:#fff;}</style></head><body><divclass="btn-box"><buttonid="randomBtn">打乱魔方</button><buttonid="resetBtn">一键复原</button></div><scriptsrc="https://cdn.jsdelivr.net/npm/three@0.158.0/build/three.min.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/three@0.158.0/examples/js/controls/OrbitControls.js"></script><script>// 场景初始化constscene=newTHREE.Scene();scene.background=newTHREE.Color(0x121218);constcamera=newTHREE.PerspectiveCamera(60,innerWidth/innerHeight,0.1,200);camera.position.set(9,9,15);constrenderer=newTHREE.WebGLRenderer({antialias:true});renderer.setSize(innerWidth,innerHeight);document.body.appendChild(renderer.domElement);// 视角控制器constcontrols=newTHREE.OrbitControls(camera,renderer.domElement);controls.enableDamping=true;// 灯光scene.add(newTHREE.AmbientLight(0xffffff,0.5));constdirLight=newTHREE.DirectionalLight(0xffffff,0.7);dirLight.position.set(15,20,10);scene.add(dirLight);// 魔方六色:前、后、左、右、上、下constCOLORS=[0xffffff,// 前白0xffff00,// 后黄0x0000ff,// 左蓝0xff0000,// 右红0x00ff00,// 上绿0xffa500// 下橙];constOFFSET=1.06;letcubies=[];letrubikRoot=newTHREE.Group();// 创建单个魔方小块functioncreateCubie(x,y,z){constgeo=newTHREE.BoxGeometry(1,1,1);constmats=COLORS.map(c=>newTHREE.MeshLambertMaterial({color:c}));constcube=newTHREE.Mesh(geo,mats);cube.userData={ox:x,oy:y,oz:z};cube.position.set(x*OFFSET,y*OFFSET,z*OFFSET);returncube;}// 生成完整3阶魔方functioninitRubik(){cubies=[];rubikRoot.clear();for(letx=-1;x<=1;x++){for(lety=-1;y<=1;y++){for(letz=-1;z<=1;z++){letc=createCubie(x,y,z);cubies.push(c);rubikRoot.add(c);}}}scene.add(rubikRoot);}initRubik();// 旋转指定层functionrotateLayer(axis,idx,dir=1){lettargetGroup=newTHREE.Group();lettargetList=[];cubies.forEach(c=>{letpos=c.position;letval;if(axis==='x')val=Math.round(pos.x/OFFSET);if(axis==='y')val=Math.round(pos.y/OFFSET);if(axis==='z')val=Math.round(pos.z/OFFSET);if(val===idx){targetList.push(c);rubikRoot.remove(c);targetGroup.add(c);}});scene.add(targetGroup);letangle=Math.PI/2*dir;letrotObj={v:0};functionrotateAnimate(){if(rotObj.v>=angle){targetGroup.rotation[axis]=angle;targetList.forEach(item=>{letwp=newTHREE.Vector3();item.getWorldPosition(wp);letq=newTHREE.Quaternion();item.getWorldQuaternion(q);rubikRoot.attach(item);item.position.copy(wp);item.quaternion.copy(q);});scene.remove(targetGroup);return;}rotObj.v+=0.15;targetGroup.rotation[axis]=rotObj.v;requestAnimationFrame(rotateAnimate);}rotateAnimate();}// 键盘控制window.addEventListener('keydown',e=>{switch(e.key.toLowerCase()){case'w':rotateLayer('y',1,1);break;// 上层右转case's':rotateLayer('y',-1,-1);break;// 下层左转case'a':rotateLayer('x',-1,1);break;// 左层顺转case'd':rotateLayer('x',1,-1);break;// 右层逆转case'q':rotateLayer('z',1,1);break;// 前层顺转case'e':rotateLayer('z',-1,-1);break;// 后层逆转}});// 打乱魔方document.getElementById('randomBtn').onclick=()=>{letops=[()=>rotateLayer('y',1,1),()=>rotateLayer('y',-1,-1),()=>rotateLayer('x',1,-1),()=>rotateLayer('x',-1,1),()=>rotateLayer('z',1,1),()=>rotateLayer('z',-1,-1)];lettimes=20;leti=0;functionrandRun(){if(i>=times)return;letfn=ops[Math.floor(Math.random()*ops.length)];fn();i++;setTimeout(randRun,220);}randRun();};// 一键复原document.getElementById('resetBtn').onclick=()=>{initRubik();};// 窗口适配window.onresize=()=>{camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight);};// 渲染循环functionanimate(){requestAnimationFrame(animate);controls.update();renderer.render(scene,camera);}animate();</script></body></html>

操作说明

  1. 鼠标操作
  • 左键拖拽:旋转视角
  • 滚轮:缩放远近
  • 右键拖拽:平移画面
  1. 键盘按键控魔方转动
  • W:顶层向右旋转
  • S:底层向左旋转
  • A:左侧面顺时针转
  • D:右侧面逆时针转
  • Q:前面顺时针转
  • E:后面逆时针转
  1. 按钮功能
  • 打乱魔方:自动随机转动20步打乱
  • 一键复原:瞬间重置回初始完整状态

后续可加功能

  1. 加入魔方还原算法自动求解
  2. 加数字贴纸、边框黑线更逼真
  3. 手机触屏滑动转层
  4. 记录转动步数、计时闯关
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 17:26:52

SteamShutdown:让电脑在Steam下载完成后自动关机的终极指南

SteamShutdown&#xff1a;让电脑在Steam下载完成后自动关机的终极指南 【免费下载链接】SteamShutdown Automatic shutdown after Steam download(s) has finished. 项目地址: https://gitcode.com/gh_mirrors/st/SteamShutdown 还在为熬夜等待Steam游戏下载而烦恼吗&a…

作者头像 李华
网站建设 2026/7/17 17:25:56

NGA论坛终极优化方案:3分钟打造专属高效浏览体验

NGA论坛终极优化方案&#xff1a;3分钟打造专属高效浏览体验 【免费下载链接】NGA-BBS-Script NGA论坛增强脚本&#xff0c;给你完全不一样的浏览体验 项目地址: https://gitcode.com/gh_mirrors/ng/NGA-BBS-Script 你是否每天在NGA论坛上花费数小时&#xff0c;却被冗余…

作者头像 李华
网站建设 2026/7/17 17:24:50

Beyond Compare 5 密钥生成终极指南:3种简单高效的免费激活方案

Beyond Compare 5 密钥生成终极指南&#xff1a;3种简单高效的免费激活方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 当你的Beyond Compare 5软件评估期结束后&#xff0c;面对功能受限的…

作者头像 李华
网站建设 2026/7/17 17:24:48

Umi-OCR终极体验指南:5种高效安装方法与使用技巧

Umi-OCR终极体验指南&#xff1a;5种高效安装方法与使用技巧 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。…

作者头像 李华
网站建设 2026/7/17 17:22:23

多轮对话中的意图漂移检测:Agent 走向跑偏后的自动纠偏

多轮对话中的意图漂移检测&#xff1a;Agent 走向跑偏后的自动纠偏 一、用户还在问东南亚旅游攻略&#xff0c;Agent 已经聊到了月球移民 这是多轮对话 Agent 最常见也最令人无语的失败模式。用户前三轮在问泰国签证的流程&#xff0c;第四轮随口说了句"我也想体验下失重感…

作者头像 李华