大多数关于three.js的教程和问题建议使用three.js绕点旋转对象的方法是创建一个位于旋转中心的父对象,将您的对象附加到该父对象,然后移动子对象。然后当父对象旋转时,子对象就会围绕该点旋转。例如:
//Make a pivot
var pivot = new THREE.Object3D();
//Make an object
var object = new THREE.Mesh( new THREE.BoxGeometry(2,2,2), new THREE.MeshBasicMaterial() );
//Add object to pivot
pivot.add(object);
//Move object away from pivot
object.position.set(new THREE.Vector3(5,0,0));
//rotate the object 90 degrees around pivot
pivot.rotation.y = Math.PI / 2;
这种方法有效,但非常有限-如果您想围绕不同的点旋转对象,则无法实现,因为一个对象不能有两个父级。
下一种可行的方法是将旋转矩阵应用于对象的位置,例如;
//Make an object
var object = new THREE.Mesh( new THREE.BoxGeometry(2,2,2), new THREE.MeshBasicMaterial() );
//Move the object
object.position.set(new THREE.Vector3(5,0,0);
//Create a matrix
var matrix = new THREE.Matrix4();
//Rotate the matrix
matrix.makeRotationY(Math.PI / 2);
//rotate the object using the matrix
object.position.applyMatrix4(matrix);
再次强调,这种方法可行,但似乎没有一种方法可以设置旋转点。 它始终是世界的原点。
另一个选项是在sceneUtils中使用实用程序方法将子对象从父对象中分离出来,并附加新的父对象的方法,但是对此的文档警告不要使用它,并且在任何示例代码中都没有使用它。
最终,我想能够使立方体沿着S形路径移动,但是如果没有(看起来)基本的东西,我会发现这很困难。
tl;dr 我想绕不同点旋转three.js对象。 应该如何处理?