【问题标题】:Three.js - Set rotation of object from normalized directions of the X, Y and Z-AxisThree.js - 从 X、Y 和 Z 轴的标准化方向设置对象的旋转
【发布时间】:2014-05-24 05:09:10
【问题描述】:

根据模型文件对象定义,新对象的放置由 location(空间中的一个点)和 X 轴、Y 轴和 Z 轴的标准化方向给出。

如何将其转换为 THREE.Euler,以便我可以在空间中正确旋转我的对象。

所以轴是关闭类型THREE.Vector3。 如果新对象与world 对齐,则值为:

xAxis = new THREE.Vector3( 1, 0, 0 );

yAxis = new THREE.Vector3( 0, 1, 0 );

zAxis = new THREE.Vector3( 0, 0, 1 );

但是,例如,如果对象的整个局部 UCS 围绕 zAxis 旋转 180 度(或 Math.PI),它们将如下所示:

xAxis = new THREE.Vector3( -1, 0, 0 );

yAxis = new THREE.Vector3( 0, -1, 0 );

zAxis = new THREE.Vector3( 0, 0, 1 );

所以我需要这样做:

var object3D = new THREE.Object3D();

object3D.position = location;

var euler = new THREE.Euler();

euler.setFromNormalizedAxes( xAxis, yAxis, zAxis );

object3D.rotation = euler;

或者从这些轴创建一个旋转矩阵:

var rotationMatrix = new THREE.Matrix4();

rotationMatrix.setFromNormalizedAxes( xAxis, yAxis, zAxis );

object3D.rotation.setFromRotationMatrix( rotationMatrix, "XYZ" );

我还不太擅长这些旋转矩阵和欧拉旋转...

【问题讨论】:

  • 你太离谱了。请参阅lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix 了解什么是法线矩阵以及它的用途。
  • @WestLangley 好吧,你是对的,我完全误解了_normalMatrix 的功能。我改变了问题。当我在挖掘并遇到 normalMatrix 时,它看起来像这样:1 0 0 0 1 0 0 0 1 这与 X、Y 和 Z 轴定义完全相同,这就是为什么我认为它与标准化 UCS 轴有关.

标签: matrix rotation three.js normals euler-angles


【解决方案1】:

在你给出的例子中,答案是

object.quaternion.setFromRotationMatrix(

    new THREE.Matrix4( -1,  0,  0,  0,
                        0, -1,  0,  0,
                        0,  0,  1,  0,
                        0,  0,  0,  1 )

);

Matrix4 的上 3x3 列是新的 x、y 和 z 轴。

您可以改为设置object.rotation。没关系。

three.js r.66

【讨论】:

  • 效果很好。我之前尝试过,但我猜我做错了什么。感谢您的帮助!
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2021-09-27
  • 2016-10-24
相关资源
最近更新 更多