C++ 确定穿过测地线球体的纹理坐标

C++ 确定穿过测地线球体的纹理坐标,c++,geometry,geodesic-sphere,C++,Geometry,Geodesic Sphere,我已经生成了一个用于opengl渲染的测地线球体,下面是一个问题,我试图在上面添加纹理。通过对球体上的一个点的算法进行反转,我得到了以下代码: //complete circle equation is as follows ///<Summary> ///x = r * sin(s) * sin(t) ///y = r* cos(t) ///z = r * cos(s) * sin(t) ///</Summary> float radius = 1.0f; //T

我已经生成了一个用于opengl渲染的测地线球体,下面是一个问题,我试图在上面添加纹理。通过对球体上的一个点的算法进行反转,我得到了以下代码:

//complete circle equation is as follows
///<Summary>
///x = r * sin(s) * sin(t)
///y = r* cos(t)
///z = r * cos(s) * sin(t)
///</Summary>


float radius = 1.0f;

//T (height/latitude) angle
float angleT =  acos(point.y / radius) ;

//S (longitude )angle
float angleS = ( asin(point.x / (radius * sin(angleT)))) + (1.0f* M_PI);
float angleS2 =( acos(point.z / (radius * sin(angleT)))) + (1.0f * M_PI);

//Angle can be 0-PI (0-180 degs), divide by this to get 0-1
angleT = angleT / (M_PI);

//Angle can be 0-2PI (0-360 degs)S
angleS = angleS / ( M_PI *2 );
angleS2 = angleS2 / ( M_PI *2 );

//Flip the y co-ord
float yTex = 1 - angleT;
float xTex = 0.0f;

//I have found that angleS2 is valid 0.5-1.0, and angleS is valid (0.3-0.5)
if (angleS < 0.5f)
{
    xTex = angleS;
}
else
{
    xTex = angleS2;
}

return glm::vec2( xTex , yTex);
S1给出x纹理co ords 0.3和0.5之间的有效答案,S2给出x纹理co ords 0.5和1.0之间的有效答案(转换为co ords在上面省略,但在第一个代码示例中出现)。为什么这两个公式都不能给出0.3以下的有效答案

谢谢

意志

这边正确 工作和不工作之间的奇怪边界,可能是由opengl的插值引起的 反向截面 正在使用的图像 编辑:这是接缝

从您试图实现的目标来看,用于计算经度角的方程式是不正确的。对于经度角,您需要的范围是0-360度,这无法通过
asin
acos
函数获得,因为这些函数只返回-90到90度或0到180度之间的结果。但是,您可以使用
atan2
函数,该函数返回正确间隔的值。我在过去两年中使用的代码如下:

float longitude = atan2f(point.x, point.z) + (float)M_PI;

此方程式将沿Z轴正方向映射纹理的水平中心。如果希望纹理的水平中心位于正X轴方向,请添加
M_PI/2.0

完美!不知道我怎么没看到。。谢谢我在太平洋中部有一个特别可怕的接缝,但我现在要解决这个问题。谢谢@不客气。你能提供任何接缝的截图吗?添加到问题中不要担心,已修复!要修复接缝,需要复制经度为180°的顶点,并将下端的纹理坐标指定给一个集合,将上端的纹理坐标指定给另一个集合。如果没有顶点,则需要创建它们。否则,它会将整个纹理挤压到两者之间的间隙中。
float longitude = atan2f(point.x, point.z) + (float)M_PI;