Javascript Three.js-围绕特定轴旋转球体

Javascript Three.js-围绕特定轴旋转球体,javascript,vector,rotation,three.js,axis,Javascript,Vector,Rotation,Three.js,Axis,我有个问题。在Three.js中,我想绕倾斜23.5度的轴旋转一个球体(地球)。我找到了sphere.rotation.x,sphere.rotation.y和sphere.rotation.z,但是当我以正确的比例组合它们时,球体的旋转非常奇怪-它没有永久的旋转轴。我想我需要一个像sphere.rotation.vector(1,0,-1)这样的函数。有人知道如何调用此函数以及正确的语法吗 谢谢你的回答 您需要为此使用。解释什么是四元数以及它们如何在三维图形中使用 可以像这样构造四元数: qu

我有个问题。在Three.js中,我想绕倾斜23.5度的轴旋转一个球体(地球)。我找到了sphere.rotation.x,sphere.rotation.y和sphere.rotation.z,但是当我以正确的比例组合它们时,球体的旋转非常奇怪-它没有永久的旋转轴。我想我需要一个像sphere.rotation.vector(1,0,-1)这样的函数。有人知道如何调用此函数以及正确的语法吗

谢谢你的回答

您需要为此使用。解释什么是四元数以及它们如何在三维图形中使用

可以像这样构造四元数:

quaternion = new THREE.Quaternion().setFromAxisAngle( axisOfRotation, angleOfRotation );
然后通过以下方式将其应用于对象:

object.rotation.setEulerFromQuaternion( quaternion );

您还可以通过使用对象层次结构来实现这一点。例如,可以创建一个
Object3D()
实例并将其倾斜23.5度,然后创建一个球体(地球)并将其添加到倾斜的对象中。然后球体将绕倾斜的Y轴旋转。然而,四元数是解决这一问题的最佳工具。

您不必了解欧拉角或四元数是如何工作的。你可以用

Object3D.rotateOnAxis( axis, angle );
Object3D.rotateOnWorldAxis( axis, angle );
确保
是单位向量(长度为1),并且
角度
以弧度为单位

Object3D.rotationAxis(轴,角度)
在对象空间中的轴上旋转

Object3D.rotationWorldAxis(轴,角度)
在世界空间中的轴上旋转

3.js r.104

var quaternion = new THREE.Quaternion();
var object = scene.getObjectByName('xxx');
function render(){
    quaternion.setFromAxisAngle(new THREE.Vector3(0, 1, 0).normalize(), 0.005);
    object.position.applyQuaternion(quaternion);
}

three.js版本为86,请参阅

您可以使用ThreeJS的“ObjectControls”模块旋转球体,该模块允许您旋转单个对象(或组),而不是场景

包括图书馆:

然后

var controls=新的三个.ObjectControls(camera、renderer.doElement、yourMesh)

您可以在这里找到一个现场演示:

这是回购协议:


希望这有帮助

谢谢你的帮助,但我是three.js的初学者,我还不能使用Object3D…我相信它工作得很好,但我使用了四元数。@Karloss Object3D是three.js中许多对象的基类。如果对象具有旋转属性,则它可能是Object3D的子类。@RamyAlZuhouri它是一个规范化向量,因此每个轴的长度为一。虽然3D向量确实有三个轴;)你知道如何在一个本地对象上工作吗?现在它绕着世界轴而不是物体轴旋转。Thanksnce threejs r59
setEulerFromQuaternion()
已被删除(请参阅:)。第二行现在应该是:
object.rotation=new THREE.Euler().setFromQuaternion(四元数)每秒实例化一个
四元数
向量3
欧拉
的次数是多少?而是在渲染循环外部创建一个四元数实例。在渲染循环中,执行以下操作:
planet.position.applyQuaternion(四元数)另外,在循环外部调用scene.getObjectByName()。建议不错。使用上面的代码很容易表达如何绕任意轴旋转。我现在就优化它,来吧。你没有听从我的建议。在渲染循环外部设置一次四元数。移除
euler
。调用
applyQuaternion()