计算球体的XYZ点,给定其纹理的UV坐标



我有一个3D球体。在运行时,我为它生成一个动态的2048 × 1024纹理。在这个纹理上画了一个小圆圈,它可以在任何地方。我在纹理上有这个圆的x/y,因此有相应的UV坐标。现在,我想要插入这个小圆在我的球体上的确切位置。

这是我一直在使用的代码,但它似乎总是偏离+/-90度

// U, V are original UV obtained from dynamic texture.
_u =  Math.PI * U;  
_v =  -2 * Math.PI * V;
_x = Math.cos(_u) * Math.sin(_v) * radius;
_y = Math.sin(_u) * Math.sin(_v) * radius;
_z = Math.cos(_v) * radius;

谢谢你的帮助!

根据您在评论中发布的代码,这里是如何生成X, Y和Z值。

theta = 2 * PI * U;
phi = PI * V;
_x = Math.cos(theta) * Math.sin(phi) * radius;
_y = Math.sin(theta) * Math.sin(phi) * radius;
_z = -Math.cos(phi) * radius;

老回答:

你的代码很好。你确定这个球体是用同样的方式生成的,并且极点是这样沿着z轴的吗?"通常"球体是沿y轴产生的极点。检查这个。

否则,如果您总是偏离+/- 90°,则使用sin和cos定义x和y。例如:

_x = -Math.sin(_u) * Math.sin(_v) * radius;
_y = Math.cos(_u) * Math.sin(_v) * radius;

是原始的90°旋转。

有8种不同的方法可以计算这两个分量的sin/cos不同的符号。在不知道你的球体是如何生成的情况下,你必须尝试所有这些方法。他们去

(x = sin(u), y = cos(u));
(x = sin(u), y = -cos(u));
(x = -sin(u), y = cos(u));
(x = -sin(u), y = -cos(u));
(x = cos(u), y = sin(u));
(x = cos(u), y = -sin(u));
(x = -cos(u), y = sin(u));
(x = -cos(u), y = -sin(u));

然而,这是痛苦和hacky,我强烈建议尝试找出你的球体是如何生成的。它们通常通过循环U和v来生成x, y, z位置

确保你已经定义了合适的坐标轴(ie:

)

ENU -东北向上NED -东北向下

NED和ENU的变换是不同的,通常是因为方位角的定义方式相同,即相对于北方顺时针。

在每个上做一个90-或使用共角规则。

尝试推导公式是可能的。确保你知道使用了什么约定

用于生成球体的方程是将极点视为Z轴。如果你使用的是像GLUT这样的东西,那么默认的坐标系统是Z +垂直于屏幕,"上"是Y轴。如果你把Z轴和Y轴调换一下,它可能对你有用。我刚刚做了类似的事情,我对结果很满意。

我使用了以下语句:

double theta = ((2 * PI) / lWidth) * u;
double phi = (PI / lHeight) * v;
double dX = std::cos(theta) * std::sin(phi) * radius;
double dZ = std::sin(theta) * std::sin(phi) * radius;
double dY = std::cos(phi) * radius;

lWidth和lHeight是我映射到球体的位图的尺寸

最新更新