【发布时间】:2017-01-19 11:43:27
【问题描述】:
我正在创建一个从 Three.js 到 Unity3D 的 Three.js 场景导出器。我的问题是将欧拉角从 Three.js 转换为 Unity。
我知道:
- Three.js 是右手空间,Unity3D 是左手空间;
- 在 Unity3D 中,平面被构建为平放在地板上,而在 Three.js 中,面向正 z 方向站立。
谁能给我一个例子来说明如何做到这一点?
更新
我尝试遵循@StefanDragnev 的建议,但我无法让它发挥作用。这是我获取 Unity 矩阵的 Three.JS 代码:
var originalMatrix = object3D.matrix.clone();
var mirrorMatrix = new THREE.Matrix4().makeScale(1, 1, -1);
var leftHandMatrix = new THREE.Matrix4();
leftHandMatrix.multiplyMatrices(originalMatrix,mirrorMatrix);
var rotationMatrix = new THREE.Matrix4().makeRotationX(Math.PI / 2);
var unityMatrix = new THREE.Matrix4();
unityMatrix.multiplyMatrices(leftHandMatrix,rotationMatrix);
jsonForUnity.object.worldMatrix = unityMatrix.toArray();
我也尝试了 mirrorMatrix (-1,1,1) 或 makeRotationX(Math.PI / 2),但也没有用。 Unity 不允许直接从对象的世界矩阵设置对象变换。我不得不从矩阵中提取四元数。这是我的 Unity 代码:
Vector4 row0 = new Vector4 (threeObject.matrix[0],threeObject.matrix[4],threeObject.matrix[8],threeObject.matrix[12]);
Vector4 row1 = new Vector4 (threeObject.matrix[1],threeObject.matrix[5],threeObject.matrix[9],threeObject.matrix[13]);
Vector4 row2 = new Vector4 (threeObject.matrix[2],threeObject.matrix[6],threeObject.matrix[10],threeObject.matrix[14]);
Vector4 row3 = new Vector4 (threeObject.matrix[3],threeObject.matrix[7],threeObject.matrix[11],threeObject.matrix[15]);
Matrix4x4 matrix = new Matrix4x4();
matrix.SetRow (0,row0);
matrix.SetRow (1,row1);
matrix.SetRow (2,row2);
matrix.SetRow (3,row3);
Quaternion qr = Quaternion.LookRotation(matrix.GetColumn(2), matrix.GetColumn(1));
gameObject.transform.localRotation = qr;
我哪里失败了?
【问题讨论】:
-
您找到解决方案了吗?