2

小さな Unity3D プロジェクトに取り組んでおり、別のツールからデータをインポートする必要があります。このツールは 2 つのベクトルを介してオブジェクトの向きを教えてくれるので、それを Unity に移植する必要があります。

例として、次の 2 つのベクトルがあります。

x = Vector( 0.707, 0.707, 0)
y = Vector(-0.707, 0.707, 0)

この情報だけで、オブジェクトを Z 軸上で 45 度回転させる必要があることを理解する必要があります。2 つのベクトルは、オブジェクトの上と右のベクトルを表し、出発点でも目的地でもありません。

編集

よし、単軸回転ができるようになった!うん!この機能を提供します。

function RotationMaster (vx : Vector3, vy : Vector3) {
    var vz = Vector3.Cross(vx, vy);

    var x = Mathf.Atan2(-vz.y, vz.z) * Mathf.Rad2Deg;
    var y = Mathf.Atan2( vx.z, vx.x) * Mathf.Rad2Deg;
    var z = Mathf.Atan2(-vx.y, vx.x) * Mathf.Rad2Deg;

    Debug.Log("x : " + x + "; y : " + y + "; z : " + z);

    transform.rotation = Quaternion.Euler(x,y,z);
}

そのような単純な回転を渡すことができるようになりました:

RotationMaster(Vector3(1,0,0), Vector3(0,0.707,0.707));
RotationMaster(Vector3(1,0,0), Vector3(0,-1,0));

そして、私が複数の軸で遊んでいない限り、それはうまくいきます。しかし、より複雑な回転を試みるとすぐに失敗します...例として;

RotationMaster(Vector3(-0.5,-0.5,0.707), Vector3(-0.707,0.707,0));

これは間違っています... :-(

どんな手掛かり?

4

2 に答える 2

3

完全な行列の x と y の間の外積を取り、それを空間オイラーまたはテイト-ブライアン回転に変換します (変換を正確に行うには、3 番目の軸が必要です)。これはかなりよく理解された変換であり、変換ルーチンを読むと、最初はプレーン ソリューションから始まることがわかるので、必要に応じて他の多くの部分を省略できます。

この一般的な変換を行う方法の一般的な例は、Graphics Gems IV にあります。C ソースはこちらにあります。または、こちらの python ソースとその他のグッズを適応させます

補遺: マトリックスからクォータニオンへの変換を直接行う方法については、同じ著者が Graphics Gems II で説明しています

于 2013-01-09T22:11:27.820 に答える
0
Quaternion.SetLookRotation

(少し微調整して...) 私が探していたものでした! 助けてくれてありがとう!

于 2013-01-11T16:38:28.593 に答える