0

HTML / CSS/JavaScriptでレンダリングしているオブジェクトがいくつかあります。オブジェクトはすべて、半径Rの見えない球の表面にあります。

さらに、ユーザーとの対話により、この見えない球を任意に回転させることができます。

明らかな解決策は、オブジェクト(シータ、ファイ、および固定半径)に割り当てられた球座標であり、デカルト3D座標に変換されます。次に、深さ(Z)をドロップするか、ファンシーを適用します。視点。後で遠近法について心配します...

私はグラフィックスを扱っているので、X / Yはそれぞれ水平/垂直であり、Zは+ veが画面から突き出ており、-veがモニターの内側にある深さです。

と呼ばれるオブジェクトのJavaScript配列がありobjects[]、それぞれにThetaとPhiがあります。シータはY軸を中心とした回転であり、ファイはX軸を中心とした回転であると仮定します。たとえば、ファイ=0およびシータ=0では、(X、Y、Z)=(0,0、R)になります。

見えない球を回転させているので、個々のオブジェクトのシータとファイを変更する必要はありません。これにより、数値が不安定になります。代わりに、球自体の回転に関連付けられているグローバルなシータとファイを保存します。

したがって、ポイントの「有効な」シータとファイは、ポイントのシータとファイに加えて、グローバルなシータとファイです。

ウィキペディア、WolframAlpha、MathWorld、およびその他の多くのリソースによると、次の方法で球面座標からデカルト座標を見つけることができます。

z = r * sin(phi) * cos(theta);
y = r * sin(phi) * sin(theta);
x = r * cos(phi);

(シータとファイをウィキペディアから逆方向に使用しているので交換しました。X/ Y / Z座標も異なります)。

理由はわかりませんが、これらのオブジェクトをレンダリングすると、まったく正しく表示されません。シータ=Pi/ 4の球の赤道上の点を想像し、球をY軸を中心に回転させる場合、点は2Dに投影され、遠近法による変換が使用されない場合にのみ上下に移動する必要があります。しかし、これはまったく起こりません。ポイントは画面の右側から左側に移動します。全体が間違っているように見えます。

4

1 に答える 1

2

注文が重要です。方程式を使うとき

z = r * sin(phi) * cos(theta);
y = r * sin(phi) * sin(theta);
x = r * cos(phi);

次に、それらを最初phiy回転、次にthetax回転として解釈できます(角度測定方向の適切な選択のため)。

(x1, y1, z1) = (r, 0, 0)
(x2, y2, z2) = (x1 * cos(phi) - z1 * sin(phi),
                y1,
                x1 * sin(phi) + z1 * cos(phi))
             = (r * cos(phi), 0, r * sin(phi))
(x3, y3, z3) = (x2,
                y2 * cos(-theta) - z2 * sin(-theta),
                y2 * sin(-theta) + z2 * cos(-theta))
             = (r * cos(phi),
                r * sin(phi) * sin(theta),
                r * sin(phi) * cos(theta))

これらの角度を単純に追加すると、順序が間違ってしまいます。最初に、phi1次に、theta1次にphi2、次にtheta2異なる軸を中心に回転することは、phi1 + phi2最初とtheta1 + theta2その後に回転することと同じではありません。theta1との間で順序を変更しているためphi2、3D位置が壊れています。

回転行列クォータニオン、これをカプセル化するライブラリ()を使用するか、オイラーを適切に組み合わせるようにしてください。

于 2012-12-10T09:21:06.053 に答える