代码之家  ›  专栏  ›  技术社区  ›  Paul

OpenGL半球纹理映射

  •  5
  • Paul  · 技术社区  · 15 年前

    我需要在OpenGL中有一个半球。我找到了一个draw sphere函数,我修改它来绘制半个lats(最终绘制了半个球体),这就是我想要的。这样做是正确的。

    但是,我不知道应该如何处理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();
        }
    }
    

    有人知道我应该加入什么价值观吗?或者我需要为它计算什么?

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  0
  •   Rekin    15 年前

    基本上,你不应该在那里需要任何花哨的东西。纹理坐标空间从零到一。因此,为中间的顶点选择一些中间值。没有图像我无法更全面地解释它,因此我能做的最好的就是向您指出这篇文章: 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() 电话。

    推荐文章