Opengl:地球纹理

Opengl:地球纹理,opengl,texture-mapping,Opengl,Texture Mapping,我试图用一种纹理把地球画在一个球体上。我的球体由四边形组成,每个四边形由两个三角形组成: void Sphere(float radius, int n_lat, int n_lon) { glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXT

我试图用一种纹理把地球画在一个球体上。我的球体由四边形组成,每个四边形由两个三角形组成:

void Sphere(float radius, int n_lat, int n_lon)
{
    glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    TextureManager::Inst()->BindTexture(1);

    glBegin(GL_TRIANGLES);
for (float i = 0; i < n_lat; i += 1.f)
    for (float j = 0; j < n_lon; j += 1.f)
    {
        Vector3 p;
        GLfloat u;
        GLfloat v;
        // -- first triangle
        p = SphereCoord(i, j, n_lat, n_lon);
                glNormal3(p);

        u=atan2f(p.y,p.x)/2*PI+0.5;
        v=0.5-asinf(p.z)/PI;
        glTexCoord2f(u,v);

        glVertex3(p * radius);

        p = SphereCoord(i + 1, j, n_lat, n_lon);
        glNormal3(p);

        u=atan2f(p.y,p.x)/2*PI+0.5;
        v=0.5-asinf(p.z)/PI;
        glTexCoord2f(u,v);

        glVertex3(p * radius);


        p = SphereCoord(i + 1, j + 1, n_lat, n_lon);
        glNormal3(p);

        u=atan2f(p.y,p.x)/2*PI+0.5;
        v=0.5-asinf(p.z)/PI;
        glTexCoord2f(u,v);

        glVertex3(p * radius);



        // -- second triangle
        p = SphereCoord(i, j, n_lat, n_lon);
                glNormal3(p);

        u=atan2f(p.y,p.x)/2*PI+0.5;
        v=0.5-asinf(p.z)/PI;
        glTexCoord2f(u,v);

        glVertex3(p * radius);



        p = SphereCoord(i + 1, j + 1, n_lat, n_lon);
        glNormal3(p);

        u=atan2f(p.y,p.x)/2*PI+0.5;
        v=0.5-asinf(p.z)/PI;
        glTexCoord2f(u,v);

        glVertex3(p * radius);



        p = SphereCoord(i, j + 1, n_lat, n_lon);
        glNormal3(p);

        u=atan2f(p.y,p.x)/2*PI+0.5;
        v=0.5-asinf(p.z)/PI;
        glTexCoord2f(u,v);

        glVertex3(p * radius);
}
glEnd();
}
void球体(浮动半径,int n_lat,int n_lon)
{
glEnable(德国劳埃德大学照明);
glEnable(GL_纹理_2D);
glTexParameterf(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameterf(GL_纹理、GL_纹理、GL_包裹、GL_重复);
glTexParameterf(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
TextureManager::Inst()->BindTexture(1);
glBegin(GL_三角形);
对于(浮点i=0;i
使用此代码无法获得正确的纹理贴图。有人能给我一些建议吗

看起来纹理以某种方式在经轴上重复:

问题在于计算u:

u=atan2f(p.y,p.x)/2*PI+0.5;
你将它除以2,然后将结果乘以π。你应该以2比1跳水

u=atan2f(p.y,p.x)/(2*PI)+0.5;

您应该停止使用固定函数管道函数,使用更现代、更不推荐的函数。@user1071138我的问题不是球体,而是纹理……看起来它在经度上重复了axis@Vallentin我不同意。Fixed function很适合开始学习GL,否则说对解决问题毫无帮助。@jozxyqk我同意这一点,但这不是我评论的重点。