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に投影され、遠近法による変換が使用されない場合にのみ上下に移動する必要があります。しかし、これはまったく起こりません。ポイントは画面の右側から左側に移動します。全体が間違っているように見えます。