在这里有一个问题后,我已经为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);
如您所见,我发现计算S角的两个版本都有有限的有效范围。
float angleS = ( asin(point.x / (radius * sin(angleT)))) + (1.0f* M_PI);
float angleS2 =( acos(point.z / (radius * sin(angleT)))) + (1.0f * M_PI);
S1给出x个纹理坐标0.3和0.5之间的有效答案,而S2给出x个纹理坐标0.5和1.0之间的有效答案(到上面省略的转换,但出现在第一个代码示例中)。为什么两个公式都没有为我提供低于0.3的有效答案?
谢谢
会
答案 0 :(得分:1)
用于计算经度角的方程式不正确,这要看要完成的工作。对于经度角,您需要的范围是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
。