【问题标题】:Three.js - Torus is not rotating around 0z axisThree.js - Torus 不绕 0z 轴旋转
【发布时间】:2017-02-10 14:20:27
【问题描述】:

我尝试沿 2 个轴旋转 torus:Ox 和 Oz。我想用鼠标修改的滑块dat.gui 应用这种旋转。

我已经通过以下方式定义了torus

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 axis 的旋转工作正常,但沿Oz axis 旋转的情况并非如此。

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

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

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

}

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

如何使这个圆环沿Oz axis 旋转?为什么它沿Ox axis 旋转而不是沿Oz axis 旋转?

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

谢谢

更新 1:

我找到了解决方案,因为我没有考虑到 Euler angles,即 2 次旋转的顺序(围绕 XY 轴)。解决方案是设置torus.rotation.order = 'ZXY';

【问题讨论】:

  • 这个:stackoverflow.com/questions/11060734/… 有帮助吗?
  • 我的理解如下。环面围绕其 Z 轴对称,该 Z 轴最初与“世界”(和相机)的 Z 轴重合。在将环面绕其 X 轴旋转 PI/2 后,其 Y 轴现在沿着世界坐标中的 Z 轴。这就是为什么当相机围绕 Z 轴旋转时,您必须围绕其 Y 轴旋转圆环以保持固定在屏幕上。
  • ConnorsFan:感谢您的帮助,我想我已经发现了问题所在,但我必须做其他测试才能确认。
  • @ConnorsFan:您能否删除您的 jsfiddle 的链接(在您的评论上方),即 jsfiddle.net/ztu3bjuu/5 。提前致谢

标签: javascript three.js rotation dat.gui


【解决方案1】:

我制作了一个fiddle,证明所有三个mesh.rotation 组件都可以正常工作。根据在THREE 源代码中可以找到的内容,当您设置 Object3D(以及分别为 Mesh)的旋转时会发生以下情况:

  1. THREE.Object3D:quaternion.setFromEuler( rotation, false ); 发生。
  2. THREE.QuaternionTHREE.Euler(我们的mesh.rotation 组件是Euler angles)中,我们可以看到旋转取决于应用程序的顺序。 THREE.Euler 中的默认轮换顺序为 'XYZ'
  3. THREE 中的标准着色器程序将对象变换作为矩阵。在 THREE.Object3D 中,您可以看到 this.matrix.compose( this.position, this.quaternion, this.scale ); 调用。
  4. 此变换应用于对象父级的变换以获得用于绘图的object.matrixWorld。

说到你的问题:你在不同的轴上对圆环和相机应用旋转,这就是为什么相机不跟随圆环(并且圆环不是相对于世界空间固定然后你改变torus.rotation.z)。请记住,旋转是连续应用的。

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

如果这没有帮助,请构建一个 minimal 示例来说明您的问题。

【讨论】:

  • mlkn:感谢您的回答。我想我已经发现了问题所在。我会问另一个问题以获得更高的精度并更好地理解这个潜在的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-06-15
  • 2012-07-23
  • 2012-05-31
  • 2013-04-25
  • 2015-01-06
  • 1970-01-01
  • 2016-02-29
  • 2013-07-28
相关资源
最近更新 更多