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我同意这一点,但这不是我评论的重点。