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

3d 给定球体纹理的UV坐标,计算球体的XYZ点,3d,geometry,coordinates,uv-mapping,3d,Geometry,Coordinates,Uv Mapping,我有一个三维球体。在运行时,我将为它生成一个动态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.co

我有一个三维球体。在运行时,我将为它生成一个动态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;

谢谢你的帮助

根据您在评论中发布的代码,以下是如何生成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的正反方向。例如:

_x = -Math.sin(_u) * Math.sin(_v) * radius;
_y = Math.cos(_u) * Math.sin(_v) * radius;
是原稿的90°旋转

有8种不同的方法可以用不同的符号计算这两个组件的正反方向。在不知道球体是如何生成的情况下,您必须全部尝试。 他们去


不管这是多么痛苦和烦人,我强烈建议尝试找出球体是如何生成的。它们通常通过U和V循环生成x、y、z位置。

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

ENS-东北向上 内德-东北向下

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是我映射到球体的位图的尺寸。

谢谢-如果这改变了什么,极点也在Y轴上(Y向上)。我恐怕仍然没有得到它:(有很多方法可以将UV坐标映射到球体上,这取决于球体的生成方式。球体来自何处?您使用的是OpenGL还是DirectX?以下是UV的生成方式(很抱歉,缺少适当的间距):numUvs=0;for(j=0;j这没有多大帮助。如果你发布了整个球体生成代码,我可以向你保证正确的算法;)。只需再次编辑你的问题并添加球体生成代码。
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;