2016-10-02 19 views
4

私はtorusを2軸に沿って回転しようとしています:OxとOz。私はマウスで修正されたスライダーdat.guiでこの回転を適用したいと思います。Three.js - Torusは0z軸を中心に回転しません

私はでtorusを定義している:私の問題はOx axisに沿って回転が正常に動作しているが、これはOz axisに沿って回転の場合ではないということです

var geometryTorus = new THREE.TorusGeometry(radius, 2*widthLine, 100, 100); 
var materialLine = new THREE.MeshBasicMaterial({ color: 0xffff00 }); 
torus = new THREE.Mesh(geometryTorus, materialLine); 
scene.add(torus); 

は、私は次の関数を呼び出すことにより、トーラスのための回転を行います。

// Change great circle parameters 
function changeGreatCircle(thetax, thetaz) { 

// Update rotation angles 
torus.rotation.x = thetax; 
torus.rotation.z = thetaz; 

} 

は、上記の機能のために、私はカメラの位置を計算するrender('init')関数を呼び出します。

このトーラスをどのように回転させるかOz axis?なぜOx axisに沿って回転し、Oz axisに沿って回転しないのですか?

誰かが手がかりを与えることができれば、これは問題ありません。

おかげ

UPDATE 1:

を私は(XY軸周りの)2つの回転の順序すなわち、Euler anglesの考慮されていませんでしたので、私は解決策を見つけました。解決策が設定されましたtorus.rotation.order = 'ZXY';

+0

これはありますか?http://stackoverflow.com/questions/11060734/how-to-rotate-a-3d-object-on-axis-three-js help? – ThisIsSparta

+0

私の理解は以下の通りです。トーラスは、Z軸の周りで対称であり、最初は「世界」(およびカメラ)のZ軸と一致する。トーラスをX軸の周りにPI/2回転させた後、そのY軸は今やワールド座標でZ軸に沿っている。そのため、カメラがZ軸を中心にして回転している間、トーラスをY軸のまわりで回転させて画面上に固定しなければなりません。 – ConnorsFan

+0

ConnorsFan:助けてくれてありがとう、私は何が間違っているか分かったと思うが、確認のために他のテストをしなければならない。 – youpilat13

答えて

1

fiddleは3つすべてのコンポーネントが正常に動作することを示しています。

  1. THREE.Object3Dでは:あなたは(それぞれと、メッシュ)Object3Dの回転を設定すると、物事が発生し、次のTHREEソースコードで見つけることができるかに基づいてquaternion.setFromEuler(rotation, false);が起こります。
  2. THREE.QuaternionおよびTHREE.Euler(私たちのメッシュ回転コンポーネントはEuler anglesです)、ローテーションはアプリケーションの順序に依存しています。 THREE.Eulerのデフォルトの回転順序は'XYZ'です。
  3. THREEの標準シェーダープログラムはオブジェクト変換をマトリックスとして取ります。 THREE.Object3Dでは、this.matrix.compose(this.position, this.quaternion, this.scale);が表示されます。
  4. この変換は、オブジェクトの親の変換に適用され、描画に使用されるobject.matrixWorldを取得します。

だからあなたの問題といえば:あなたは、異なる軸にトーラスとカメラの回転を適用し、それはカメラがトーラスに従わない理由(とトーラスはワールド空間に比較的固定ではありません、あなたはtorus.rotation.zを変更)であります。回転は連続して適用されることに注意してください。

ダミーオブジェクトを挿入して回転の順序を微調整することで、目的の動作を達成できない場合は、独自のマテリアルを構築し、シェーダープログラムで使用するためのより多くのパラメータをユニフォームとして渡すことができます。この場合、それは必要ではありません。

問題がある場合は、の例をに設定してください。

+0

mlkn:あなたの答えに感謝します。おそらく何が間違っているのか分かったと思います。もっと精度を上げ、この潜在的な解決策をよりよく理解するために別の質問をします。 – youpilat13

関連する問題