我有许多用 HTML/CSS/JavaScript 呈现的对象。这些物体都位于一个半径为 R 的不可见球体的表面上。
此外,与用户的交互允许这个不可见的球体任意旋转。
显而易见的解决方案是分配给对象的球坐标(Theta、Phi 和固定半径),它是转换为笛卡尔 3D 坐标的,然后我可以只降低深度 (Z),或者应用一些花哨的看法。我以后会担心透视...
由于我正在处理图形,X/Y 分别是水平/垂直,Z 是深度,+ve 伸出屏幕,-ve 位于显示器内部。
我有一个名为 的 JavaScript 对象数组objects[]
,每个对象都有一个 Theta 和 Phi。我假设 Theta 是围绕 Y 轴旋转,而 Phi 是围绕 X 轴旋转,因此在 Phi = 0 和 Theta = 0 时,我们处于 (X,Y,Z) = (0,0,R);
由于我正在旋转不可见的球体,因此我不想更改每个单独对象的 Theta 和 Phi,这也只会增加数值的不稳定性。相反,我存储了与球体本身的旋转相关的全局 Theta 和 Phi。
因此,点的“有效” Theta 和 Phi 是点的 Theta 和 Phi 加上全局 Theta 和 Phi。
根据 Wikipedia、WolframAlpha、MathWorld 和许多其他资源,我们可以通过以下方式从球坐标中找到笛卡尔坐标:
z = r * sin(phi) * cos(theta);
y = r * sin(phi) * sin(theta);
x = r * cos(phi);
(当我向后使用它们时,我已经从维基百科交换了 Theta 和 Phi,而且我的 X/Y/Z 坐标也不同)。
我不知道为什么,但是当我渲染这些对象时,它们看起来根本不正确。如果您想象一个球体赤道上的一个点,Theta = Pi/4,并且您围绕 Y 轴旋转球体,则该点仅在投影到 2D 上且不使用透视变换时才应上下移动。然而,这根本不是发生的事情。这些点从屏幕的右侧移动到左侧。整个事情看起来都错了。