2017-11-22 16 views
0
私は(私自身の3Dエンジンでは)JavaScriptでY軸上 を回転させるようにしようとしていますし、私はこの機能を試してみました

3D回転の新しい点位置を計算

function rotateY(amount) { 
    for (var i = 0; i < points.length; i++) { 
    points[i].z = Math.sin(amount) * points[i].x + Math.cos(amount) * points[i].z; 
    points[i].x = Math.cos(amount) * points[i].x - Math.sin(amount) * points[i].z; 
    } 
} 

それが回転しているのが、すべての時間は、それが回転しますそれはxとzの縮尺が変わるので薄くなっています。私はそれを正しく回転させる方法を助けてくれますか?私はcos()とsin()を理解していません。 :)

答えて

1

i)回転はオブジェクト自体ではなくグローバルな原点に対応し、ii)デルタを適用すると仮定します(以下を参照してください)。

各点について:
1.軸との相対的な距離を求めます。
2.軸に対する現在の角度を求めます。
3.除外軸がunit vectorであるため、基本2-D cos/sin polar projectionを使用します。

function rotateY(points, deltaAngle) { 

    const _points = points; 

    if (! Array.isArray(points)) points = [ points ]; 

    for (let i = 0; i < points.length; i ++) { 

     const newAngle = Math.atan2(points[ i ].z, points[ i ].x) + deltaAngle; 
     const distance = (points[ i ].x ** 2 + points[ i ].z ** 2) ** (1/2); 

     points[ i ].x = distance * Math.cos(newAngle); 
     points[ i ].z = distance * Math.sin(newAngle); 

    } 

    return _points; 

} 

アルゴリズムがあればMath.atan2で使用される第1の軸がMath.sinを使用して同じ軸であるように、X及びZの回転についても同様です。

注:exponentiation operatorを使用しました。 Babel /これと似たようなものを使用していないかIE /古いユーザーを気にしない限り、私はこれを本番では使用しません。仮定ii)がとることができない場合は


は、我々は単にポイントの本来の角度を格納しnewAngleは、元の角度に加えて、新たな角度として定義したいです。

i)をとることができないと複雑になる。オブジェクトの軸が単純にオフセットされている場合は、newAngledistanceのオフセットを減算し、xzを設定すると、そのオフセットを戻すことができます。軸自体がグローバル軸とそれぞれ平行でない場合はquaternionを使用してgimbal lockを避けてください。私はコピーするか、少なくとも見てthree.js's implementationをお勧めします。

+0

もう1つの質問ですが、const距離としてはどういう意味ですか?何の間の距離? – Jacob

+0

y軸からの値。あなたがポイント{x:1、y:6、z:0}を持っていれば、y軸からの距離は1になります。軸は単位ベクトルなので、3次元グローバル空間とその空間は、平面{x:1、y:6、z:0}の上にあり、y = 6と定義されています。この平面では、{x:1、z:0}は原点から1単位離れています。 [ここに数字があります](https://i.imgur.com/t6ATK04.png) – vox

関連する問題