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

时间:2011-10-20 18:27:56

标签: 3d geometry coordinates uv-mapping

我有3D球体。在运行时,我正在为它生成动态2048x1024纹理。在这个纹理上绘制一个小圆圈,可以是任何地方。我在纹理上有这个圆的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;

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

根据您在评论中发布的代码,以下是如何生成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°,请使用定义x和y的sin和cos。例如:

_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位置。

答案 1 :(得分:0)

确保定义了正确的轴,即:

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

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

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

尝试自己推导出公式。确保您知道正在使用的约定

答案 2 :(得分:0)

用于生成球体的等式将极点视为Z轴。如果您使用GLUT之类的东西,则默认坐标系统的Z加上屏幕法线,“Up”为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是我映射到球体的位图的尺寸。