2013-05-01 69 views
11

問題があります。 Three.jsでは、23.5度の軸を中心に球(地球)を回転させたいと思います。私はsphere.rotation.x、sphere.rotation.yとsphere.rotation.zを見つけましたが、それらを正しい比率で組み合わせると、球の回転は非常に奇妙です。回転軸は永久にありません。私はsphere.rotation.vector(1,0、-1)のような関数が必要だと思います。誰もこの関数がどのように呼び出され、正しい構文がどのようになっているか知っていますか?Three.js - 特定の軸を中心に球を回転する

回答ありがとう!

答えて

17

これにはquaternionsを使用する必要があります。 This videoは、クォータニオンが何であるか、そしてそれらが3Dグラフィックスでどのように使用されるかを説明します。

あなたはこのような四元数を構築することができます。

quaternion = new THREE.Quaternion().setFromAxisAngle(axisOfRotation, angleOfRotation); 

次に、あなたがして、オブジェクトに適用されます:あなたはまた、オブジェクト階層を使用することによって、これを達成することができます

object.rotation.setEulerFromQuaternion(quaternion); 

。たとえば、Object3D()のインスタンスを作成し、23.5度傾けて球(Earth)を作成し、それを傾斜したオブジェクトに追加することができます。球は、傾斜したY軸を中心に回転します。しかし、四元数はこれを解決するための最良のツールです。

+0

ありがとう!それはうまく動作します:) – karlosss

+5

3つのr59 'setEulerFromQuaternion()'が削除されています(https://github.com/mrdoob/three.js/wiki/Migration#r58--r59を参照)。 2番目の行は次のようになります: 'object.rotation = new THREE.Euler().setFromQuaternion(quaternion);' – kontur

19

オイラーアングルまたはクォータニオンがどのように機能するかを理解する必要はありません。あなたはaxisは単位ベクトル(長さ1を持っている)である、とangleはラジアンであることを確認し

Object3D.rotateOnAxis(axis, angle); 

を使用することができます。

Object3D.rotateOnAxis(axis, angle)オブジェクト空間の軸上で回転します。バージョンthree.js

three.js r.67

+0

ありがとう、私はthree.jsの初心者ですが、Object3Dはまだ使用できません...私はあなたがそれがうまくいくと信じていますが、私は四元数を使いました。 – karlosss

+0

@karlosss Object3Dは、Three.jsの多くのオブジェクトが由来する基本クラスです。あなたのオブジェクトにrotation属性がある場合、おそらくObject3Dのサブクラスです。 – Joel

+0

軸の長さは3です。 –

0
var quaternion = new THREE.Quaternion(); 
var object = scene.getObjectByName('xxx'); 
function render(){ 
    quaternion.setFromAxisAngle(new THREE.Vector3(0, 1, 0).normalize(), 0.005); 
    object.position.applyQuaternion(quaternion); 
} 

full example on codepenを参照してください、86です。

+1

'Quaternion'、' Vector3'、 'Euler'を何秒に何回インスタンス化していますか?代わりに、レンダリングループの外側に四元数のインスタンスを1つ作成します。レンダーループでは、次のようにします: 'planet.position.applyQuaternion(quaternion);'また、ループ外でscene.getObjectByName()を呼び出します。 – WestLangley

+0

良い提案。上記のコードを使用してどの軸をどのように回転させるかを表現するのは簡単です。私は[完全な例](https://codepen.io/luics/pen/GEbOYO)で最適化しました。 – luics

+0

是非。あなたは私の提案に従わなかった。レンダリングループの外側で 'quaternion'を一度設定してください。 'オイラー'を取り除く。代わりに 'applyQuaternion()'を呼び出してください。 – WestLangley

関連する問題