【问题标题】:Convert object rotation from Three.js to Unity3D将对象旋转从 Three.js 转换为 Unity3D
【发布时间】: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;

我哪里失败了?

【问题讨论】:

  • 您找到解决方案了吗?

标签: unity3d three.js


【解决方案1】:

您需要转换的不仅仅是角度。您还需要转换翻译。欧拉角在进行一般变换时使用起来不是很舒服。直接使用对象的世界矩阵要容易得多。

从右手转换为左手 - 您需要沿轴镜像对象的矩阵,例如 Z 轴。将对象的矩阵乘以Matrix4().makeScale(1, 1, -1)

然后从 XY 到平行于视口的 XZ,您需要将对象沿 X 轴旋转 90 度(或 -90 度,如果顺时针旋转)。将对象的矩阵乘以Matrix4().makeRotationX(Math.PI / 2)

然后,您需要将最终矩阵导入 Unity。如果您不能只批量导入矩阵,您可以尝试先将其分解为缩放、旋转和平移部分,但如果可能的话,请避免这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2013-08-06
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2015-01-06
    相关资源
    最近更新 更多