gpt4 book ai didi

c++ - 确定测地线球体的纹理坐标

转载 作者:行者123 更新时间:2023-11-28 04:11:20 26 4
gpt4 key购买 nike

根据此处的一个问题,我已经为 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 的有效答案?

谢谢

这边正确 Correct on this side工作和不工作之间的怪异边界,可能是opengl的插值引起的 The weird border between working and not, probably caused by opengl's interpolation反转款 Reversed section正在使用的图像 The image being used编辑:这是接缝 Seam

最佳答案

您用来计算经度角的方程式不正确,看您要完成什么。对于经度角度,你需要的范围是0-360度,不能通过asinacos函数获取,因为那些函数只返回-90到360度之间的结果90 度或 0 到 180 度。但是,您可以使用 atan2 函数,它会返回正确区间的值。过去 2 年我一直在使用的代码如下:

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

这个等式会将纹理的水平中心映射到 Z 轴的正方向。如果希望纹理的水平中心在X轴正方向,添加M_PI/2.0

关于c++ - 确定测地线球体的纹理坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57727034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com