【问题标题】:Determining texture co-ordinates across a geodesic sphere确定整个测地线球体的纹理坐标
【发布时间】:2020-01-03 17:24:41
【问题描述】:

我已经生成了一个用于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 的有效答案?

谢谢

会

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

【问题讨论】:

    标签: c++ geometry geodesic-sphere


    【解决方案1】:

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

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

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

    【讨论】:

    • 完美!不知道我怎么没看到……谢谢!我在太平洋中部确实有一个特别可怕的接缝,但我现在会努力解决这个问题。谢谢!
    • @WillHain 不客气。你能提供任何接缝的截图吗?
    • 已添加到问题中
    • 别担心,解决了!
    • 要修复接缝,您需要复制经度 180° 的顶点,并将下端的纹理坐标分配给一组,将上端的纹理坐标分配给另一组。如果那里没有顶点,则需要创建它们。否则,它会将整个纹理挤压到两者之间的间隙中。
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2013-01-19
    • 2012-05-04
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多