// 魔方转动的六个方向 const xLine = new THREE.Vector3(1, 0, 0); // X轴正方向 const xLineAd = new THREE.Vector3(-1, 0, 0); // X轴负方向 const yLine = new THREE.Vector3(0, 1, 0); // Y轴正方向 const yLineAd = new THREE.Vector3(0, -1, 0); // Y轴负方向 const zLine = new THREE.Vector3(0, 0, 1); // Z轴正方向 const zLineAd = new THREE.Vector3(0, 0, -1); // Z轴负方向 /** * 获得旋转方向 * vector3: 鼠标滑动的方向 */ function getDirection(vector3: any) { let direction; // 判断差向量和 x、y、z 轴的夹角 const xAngle = vector3.angleTo(xLine); const xAngleAd = vector3.angleTo(xLineAd); const yAngle = vector3.angleTo(yLine); const yAngleAd = vector3.angleTo(yLineAd); const zAngle = vector3.angleTo(zLine); const zAngleAd = vector3.angleTo(zLineAd); const minAngle = Math.min( ...[xAngle, xAngleAd, yAngle, yAngleAd, zAngle, zAngleAd] ); // 最小夹角 switch (minAngle) { case xAngle: direction = 10; // 向x轴正方向旋转90度(还要区分是绕z轴还是绕y轴) if (normalize.equals(yLine)) { direction = direction + 5; // 绕z轴顺时针 } else if (normalize.equals(yLineAd)) { direction = direction + 6; // 绕z轴逆时针 } else if (normalize.equals(zLine)) { direction = direction + 4; // 绕y轴逆时针 } else if (normalize.equals(zLineAd)) { direction = direction + 3; // 绕y轴顺时针 } break; case xAngleAd: direction = 20; // 向x轴反方向旋转90度 if (normalize.equals(yLine)) { direction = direction + 6; // 绕z轴逆时针 } else if (normalize.equals(yLineAd)) { direction = direction + 5; // 绕z轴顺时针 } else if (normalize.equals(zLine)) { direction = direction + 3; // 绕y轴顺时针 } else if (normalize.equals(zLineAd)) { direction = direction + 4; // 绕y轴逆时针 } break; case yAngle: direction = 30; // 向y轴正方向旋转90度 if (normalize.equals(zLine)) { direction = direction + 1; // 绕x轴顺时针 } else if (normalize.equals(zLineAd)) { direction = direction + 2; // 绕x轴逆时针 } else if (normalize.equals(xLine)) { direction = direction + 6; // 绕z轴逆时针 } else { direction = direction + 5; // 绕z轴顺时针 } break; case yAngleAd: direction = 40; // 向y轴反方向旋转90度 if (normalize.equals(zLine)) { direction = direction + 2; // 绕x轴逆时针 } else if (normalize.equals(zLineAd)) { direction = direction + 1; // 绕x轴顺时针 } else if (normalize.equals(xLine)) { direction = direction + 5; // 绕z轴顺时针 } else { direction = direction + 6; // 绕z轴逆时针 } break; case zAngle: direction = 50; // 向z轴正方向旋转90度 if (normalize.equals(yLine)) { direction = direction + 2; // 绕x轴逆时针 } else if (normalize.equals(yLineAd)) { direction = direction + 1; // 绕x轴顺时针 } else if (normalize.equals(xLine)) { direction = direction + 3; // 绕y轴顺时针 } else if (normalize.equals(xLineAd)) { direction = direction + 4; // 绕y轴逆时针 } break; case zAngleAd: direction = 60; // 向z轴反方向旋转90度 if (normalize.equals(yLine)) { direction = direction + 1; // 绕x轴顺时针 } else if (normalize.equals(yLineAd)) { direction = direction + 2; // 绕x轴逆时针 } else if (normalize.equals(xLine)) { direction = direction + 4; // 绕y轴逆时针 } else if (normalize.equals(xLineAd)) { direction = direction + 3; // 绕y轴顺时针 } break; default: break; } return direction; }
获取方块
紧接着,根据旋转方向对10取余,得到旋转轴,并将对应平面的小方块加入到需要旋转的数组中。
/** * 根据立方体和旋转方向,找到同一平面上的所有立方体 */function getPlaneCubes(cube: any, direction: any) { const cubes = scene.children; let results = []; let orientation = direction % 10; switch (orientation) { case 1: case 2: // 绕x轴 for (let i = 0; i < cubes.length; i++) { let curr = cubes[i]; // console.log("绕x轴", curr.position, cube.position); if (Math.abs(curr.position.x - cube.position.x) < 0.2) { results.push(curr); } } break; case 3: case 4: // 绕y轴 for (let i = 0; i < cubes.length; i++) { let curr = cubes[i]; // console.log("绕y轴", curr.position, cube.position); if (Math.abs(curr.position.y - cube.position.y) < 0.2) { results.push(curr); } } break; case 5: case 6: // 绕z轴 for (let i = 0; i < cubes.length; i++) { let curr = cubes[i]; // console.log("绕z轴", curr.position, cube.position); if (Math.abs(curr.position.z - cube.position.z) < 0.2) { results.push(curr); } } break; } return results;}