2017-01-19 12 views
0

Three.jsからUnity3DへのThree.jsシーンエクスポータを作成しています。私の問題はオイラー角をThree.jsからUnityに変換することです。オブジェクト回転をThree.jsからUnity3Dに変換

私がことを知っている:

  • Three.jsは、右利きのスペースであるとUnity3Dが左利きです。
  • Unity3Dでは、平面は床上にフラットに構成され、Three.jsでは正のzを向いて立っています。

どうすればいいですか?

UPDATE

私がアドバイスを@StefanDragnev従うことを試みたが、私はそれがwork.This作ることができない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)でも動作しませんでした。ユニティはオブジェクトのワールドマトリックスからオブジェクト変換を直接設定することはできません。行列から四元数を抽出しなければならなかった。これは私のユニティコードです

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; 

私はどこで失敗しましたか?

答えて

0

あなたが変換する必要がある角度だけではありません。また、翻訳を変換する必要があります。オイラー角は、一般的な変換を実行するときに使用するのが非常に難しいわけではありません。オブジェクトのワールドマトリックスを直接操作する方がずっと簡単です。

右利きから左利きへの変換 - オブジェクトの行列を軸に沿って、たとえばあなたのケースではZでミラー化する必要があります。オブジェクトの行列にMatrix4().makeScale(1, 1, -1)を掛けます。

XYからXZをビューポートと平行にするには、オブジェクトをX軸に沿って90度(回転が時計回りの場合は-90度)回転させる必要があります。オブジェクトの行列にMatrix4().makeRotationX(Math.PI/2)を掛けます。

次に、最後の行列をUnityにインポートする必要があります。マトリックスの卸売りをインポートすることはできませんが、まずそれをスケーリング、回転、および変換部品に分解してみることができますが、できるだけそれを避けてください。

関連する問題