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。谢谢你的回答。我想我已经发现了问题所在。我将问另一个问题,以获得更精确的结果,更好地理解这个潜在的解决方案。