在球体边缘绘制一个点

30

作为一个有Flash背景的人,我对一些简单的2D三角知识有一定了解。在2D中,如果给定一个圆形、一个角度和一个半径,我知道该如何计算并将物品放置在圆边缘上。

x = cos(a) * r;
y = sin(a) * r;

如果我在3D空间中知道一个点的半径、我想把它围绕z轴和y轴定位的角度,那么如何计算这个点的x、y和z坐标(假设原点是0,0,0)?我认为可以借鉴圆形三角函数的数学知识,但我似乎找不到解决方案。

2个回答

84

您在3D中的位置由两个角度确定(+半径,在您的情况下是恒定的)。

x = r * cos(s) * sin(t)
y = r * sin(s) * sin(t)
z = r * cos(t)

在这里,s 是绕着 z 轴旋转的角度,t 是从 z 轴“向下”测量的高度角。

下面的图片展示了这些角度的含义,s=theta 在 xy 平面上的范围为 0 到 2*PI,t=phi 的范围为 0 到 PI。

enter image description here


8
请记住,st的单位应为弧度制,而不是角度制。要转换为弧度制:radians = angleInDegrees * Math.PI / 180 - Sam
如果s=45度,t=0度,则(x,y,z)=(0,0,1)。但是当我们实际映射时,我们会得到(0,0.707,0.707)对吗?当t为零时,x和y总是为零,而z与s无关...!我该怎么做才能做对呢? - Saravanabalagi Ramachandran
我们不应该能够将 t 锁定为 0 并变化 s 来精确地扫过一个圆吗?但是在这里,它并不像那样工作,当 t 为零时,无论 s 的值如何,(x,y,z) 总是 (0,0,1)。 - Saravanabalagi Ramachandran
@SaravanabalagiRamachandran 如果你考虑当 phi 等于零时,你会在球体上的哪个位置,你就会明白为什么是这样的。 - David Hoelzer
@second 当相机距离物体4米,且向上倾斜10度时,如何计算半径?半径是否为4?如何将其转换为像素? - S.EB
显示剩余4条评论

2

被接受的答案似乎不支持负x值(可能是我做错了什么),但以防万一,使用ISO坐标系约定中定义的符号,如此维基百科条目所示,这组方程应该有效:

import math

x = radius * sin(theta) * cos(phi)
y = radius * sin(theta) * sin(phi)
z = radius * cos(theta)

radius = math.sqrt(math.pow(x, 2) + math.pow(y, 2) + math.pow(z, 2))

phi = math.atan2(y, x)
theta = math.acos((z / radius))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接