Javascript Three.js-圆环体不绕0z轴旋转

Javascript Three.js-圆环体不绕0z轴旋转,javascript,three.js,rotation,dat.gui,Javascript,Three.js,Rotation,Dat.gui,我尝试沿两个轴旋转圆环体:Ox和Oz。我想用鼠标修改的滑块dat.gui应用此旋转 我通过以下方式定义了圆环体: var geometryTorus = new THREE.TorusGeometry( radius, 2*widthLine, 100, 100 ); var materialLine = new THREE.MeshBasicMaterial( { color: 0xffff00 } ); torus = new THREE.Mesh( geometryTorus, mater

我尝试沿两个轴旋转
圆环体
:Ox和Oz。我想用鼠标修改的滑块
dat.gui
应用此旋转

我通过以下方式定义了
圆环体

var geometryTorus = new THREE.TorusGeometry( radius, 2*widthLine, 100, 100 );
var materialLine = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
torus = new THREE.Mesh( geometryTorus, materialLine );
scene.add(torus);
我的问题是,沿
Ox轴旋转
工作正常,但沿
Oz轴旋转
的情况并非如此

我通过调用以下函数对圆环体进行旋转:

// Change great circle parameters
function changeGreatCircle(thetax, thetaz) {

// Update rotation angles 
torus.rotation.x = thetax;
torus.rotation.z = thetaz; 

}
对于上面的函数,我调用
render('init')
函数来计算相机的位置

如何使该圆环沿
Oz轴旋转
?为什么它是沿着X轴旋转,而不是沿着Oz轴旋转

如果有人能提供线索,这就好了

谢谢

更新1:

我找到了解决方案,因为我没有考虑到
欧拉角
,即两个旋转的顺序(围绕
X
Y
轴)。解决方案是设置
torus.rotation.order='ZXY'

我做了一个演示,演示了所有三个
网格。旋转
组件工作正常。根据源代码中的内容,在设置Object3D(和网格)的旋转时会发生以下情况:

  • 在:
    quaternion.setFromEuler中(旋转,false)发生
  • 在和(我们的mesh.rotation组件是)中,我们可以看到旋转取决于应用程序的顺序。默认旋转顺序为三。Euler为
    'XYZ'
  • 三个标准着色器程序以对象变换为矩阵。在THREE.Object3D中,您可以看到
    this.matrix.compose(this.position,this.quaternion,this.scale)呼叫
  • 此变换应用于对象父对象的变换,以获取用于绘制的object.matrixWorld
  • 说到你的问题:你在环面上应用旋转,相机在不同的轴上应用旋转,这就是为什么相机不跟随环面(环面相对于世界空间不固定,然后你改变
    环面.rotation.z
    )。请记住,旋转是串联应用的

    如果通过插入虚拟对象和调整旋转顺序无法实现所需的行为,您可以构建自己的材质,并将更多参数作为制服传递给着色器程序中使用。在这种情况下,它是不需要的


    如果这没有帮助,请构造一个演示您的问题的最小的示例。

    这样做:帮助?我的理解如下。圆环体围绕其Z轴对称,Z轴最初与“世界”(和相机)的Z轴重合。将环面绕其X轴旋转PI/2后,其Y轴现在在世界坐标系中沿Z轴。这就是为什么当摄像机绕Z轴旋转时,你必须绕Y轴旋转圆环体以保持在屏幕上的固定。康纳斯范:谢谢你的帮助,我想我已经找到了问题所在,但我必须做其他测试来确认。@康纳斯范:请你删除JSFIDLE的链接(在你的评论中),即jsfiddle.net/ztu3bjuu/5。谢谢你的回答。我想我已经发现了问题所在。我将问另一个问题,以获得更精确的结果,更好地理解这个潜在的解决方案。