質問

私はL-System Interpreterに取り組んでおり、Quaternionを回転の内部表現として使用しています。結果の結果を3JS JavaScriptシーンにエクスポートする必要があり、JSONシーンはそれを行う最善の方法だと感じました。

シーンの1つの例を見つけました https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js しかし、Quaternionの回転については何もありません。

だから私はヘルプを使用しました http://threejs.org/io/s/quaternion そして、それは見つかりました three.object3d プロパティがあります Quaternionusequaternion しかし、それは機能しないようです、エラーはシーンローダーによって発生します(おそらく「回転」属性が欠落しているため、最後に編集を参照):

"obj": {
    ...
    "quaternion": [0.38268343236509,0,0,0.923879532511287],
    "useQuaternion": true
}

また、Quaternionをオイラーの角度に変換しようとしましたが、おそらく角度を適用する他の順序のためには機能しません(Order Y、Z、Xを想定しています)。上記の例では、QuaternionはZ軸(ピッチ)の回転を135度で表しており、オイラー角[PI、PI、PI/4]に変換されますが、シーンでは正しく表示されません。

次の画像ショーは、Z軸によって他の程度よりも11度多く回転したブロックをブロックします。軸はx(赤)、y(緑)、z(青)です。上半分は、誤った変換QuaternionからEuclidに誤って回転します(このページを実装に使用しました。 http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaterniontoeuler/ ).

ilustration of the problem
編集:さらに調べた後、シーンローダーによって発生したエラーは、オブジェクトに「回転」属性が欠落しているためです。フォロー出力はエラーをスローせず、シーンはロードされますが、Quaternionの回転が無視されているため、(表示された画像と同じ方法で)間違っています。

"obj": {
    ...
    "rotation": [3.14159265358979,3.14159265358979,0.785398163397449],
    "quaternion": [0.38268343236509,0,0,0.923879532511287],
    "useQuaternion": true
}
役に立ちましたか?

解決

私は自分の問題を解決したと思います。これは私の質問に対する直接的な答えではなく、私がそれをどのように回避するかだけです。

問題はシーンローダーであり、Quaternionの回転では動作しません。 JSで直接シーンを生成するためにシーン生成スクリプトを書き直しました。

var mesh = new THREE.Mesh(geometry, material);
... set position & scale ...
mesh.rotation.x = 3.141;
mesh.rotation.y = 3.141;
mesh.rotation.z = 0.785;
mesh.updateMatrix();
scene.add(mesh);

それから私は魔法の財産を見つけました eulerorder の上 three.object3d これは、私の問題を引き起こしているデフォルトで「XYZ」に設定されています(問題に添付された画像)、私のQuaternion-Euler変換は「YZX」用に設計されているため、それを変更しました。

mesh.eulerOrder = 'YZX';

それでおしまい。シーンローダーを実験する時間はありませんが、eulerOrderプロパティをシーンローダーで設定することができれば、質問の第2部へのソルトリはありません。

最適なのは、シーンの定義でQuaternionを直接設定することですが、おそらくシーンローダー自体の変更が必要になるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top