OpenGL 半球贴图映射

5
我需要在OpenGL中绘制一个半球体。我找到了一个drawSphere函数,将其修改为仅绘制一半的纬度(这样就可以绘制一半的球体),这正是我想要的。它能够正确地完成这个任务。
然而,我不知道该如何使用glTexCoordf来使纹理正确映射到这个半球体上。我对OpenGL并不是很熟悉,我已经尝试了无数种变化,但我就是无法使纹理正确地显示在上面。
void drawHemisphere(double r, int lats, int longs) 
{
    int i, j;
    int halfLats = lats / 2; 
    for(i = 0; i <= halfLats; i++) 
    {
        double lat0 = M_PI * (-0.5 + (double) (i - 1) / lats);
        double z0 = sin(lat0);
        double zr0 = cos(lat0);

        double lat1 = M_PI * (-0.5 + (double) i / lats);
        double z1 = sin(lat1);
        double zr1 = cos(lat1);

        glBegin(GL_QUAD_STRIP);
        for(j = 0; j <= longs; j++)
        {
            double lng = 2 * M_PI * (double) (j - 1) / longs;
            double x = cos(lng);
            double y = sin(lng);

            // glTexCoordf()
            glNormal3f(x * zr0, y * zr0, z0);
            glVertex3f(x * zr0, y * zr0, z0);       

            // glTexCoordf()
            glNormal3f(x * zr1, y * zr1, z1);
            glVertex3f(x * zr1, y * zr1, z1);
        }
        glEnd();
    }
}

有人知道我应该放什么值吗?或者我需要计算些什么呢?

谢谢!


一般来说,一个正方形纹理不能直接映射到(半)球体上;有不同的可能性。你的纹理是什么样子的? - Thomas
这是一个简单的吃豆人游戏,所以说实话,即使是纯黄色的贴图也可以,或者是一个带眼睛的黄色东西。没什么花里胡哨的。 - Paul
1个回答

0

基本上,你不需要任何花哨的东西。纹理坐标空间范围从零到一。因此,在顶点之间选择一些中间值。我无法在没有图像的情况下更详细地解释它,所以我能做的最好的事情就是指向这篇文章:UV mapping,这是一个很好的起点。希望这可以作为入门的帮助。

以下是我的猜测:

{
    double lng = 2 * M_PI * (double) (j - 1) / longs;
    double x = cos(lng);
    double y = sin(lng);

    double s1, s2, t;
    s1 = ((double) i) / halfLats;
    s2 = ((double) i + 1) / halfLats;
    t = ((double) j) / longs;

    glTexCoord2d(s1, t);
    glNormal3d(x * zr0, y * zr0, z0);
    glVertex3d(x * zr0, y * zr0, z0);

    glTexCoord2d(s2, t);
    glNormal3d(x * zr1, y * zr1, z1);
    glVertex3d(x * zr1, y * zr1, z1);
}

记得在OpenGL中正确设置纹理。以下是一个带有纹理的示例调用:

    glActiveTexture(GL_TEXTURE0);
    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);

    // texture must be bound & enabled
    texture.bind();
    texture.enable();
    drawHemisphere(1, 40, 40);
    texture.disable();

我使用Java + JOGL进行测试,因此并非完全是C++解决方案,但在概念上应该是相同的。至少您可以正确地调用glTexCoord2d()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接