我想在opengl中围绕球体包裹图像

时间:2014-04-10 06:32:36

标签: c++ image opengl opengl-es

我正在开发台球比赛,我在桌上有几个球。 为了使每个球都独一无二,我试图用纹理给他们数字。使用纹理我也可以显示球的旋转。

到目前为止,我已经使用

中的SOIL映射了纹理

INIT()函数---

glGenTextures(1,&texture_id);
texture_id = SOIL_load_OGL_texture("globe.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,  SOIL_FLAG_INVERT_Y);

glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

显示功能()

glPushMatrix();                                       // Push the current matrix stack
    glColor3f(1,1,1);
    glEnable( GL_TEXTURE_2D );
    glBindTexture( GL_TEXTURE_2D, texture_id);

    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTranslatef(world.qBall.pos.x,world.qBall.pos.y,world.qBall.pos.z);  //Multiply the current matrix by a translation matrix
    glRotatef(30,1,0,0);
    glutSolidSphere  (world.qBall.radius*5,50,50); 
    glDisable(GL_TEXTURE_GEN_S);
    glDisable(GL_TEXTURE_GEN_T);
    glDisable(GL_TEXTURE_2D);
glPopMatrix();  // Pop the current matrix stack

我从中得到的是整个图像映射到球体的可见部分而不是包裹球体,因此只有部分图像可见。 当我移动我的相机纹理也随之旋转。

那么,我如何围绕球体包裹我的纹理,以便只显示部分图像!。

1 个答案:

答案 0 :(得分:3)

不要使用纹理坐标生成模式。它只有极少数的应用程序。你的不在他们中间。 GL_SPHERE_MAP没有在球体周围包裹纹理;这个名字有点欺骗。实际上sphere maps是反射贴图的早期形式,看起来好像是通过球面镜拍摄环境。

Sphere Map example taken from the MSDN link above

在您的情况下,您可能希望应用圆柱映射,例如mercator projection

Cylindrical Image Projection

固定功能OpenGL无法为您完成。然而,在顶点着色器phi = atan2(x/y); theta = atan2(x/z)中实现使用phi和theta作为纹理坐标是微不足道的。

无论如何,更好的方法是绘制球体几何体,并准备好使用纹理坐标。在https://stackoverflow.com/a/5989676/524368中,我提供了用于生成球体几何的代码,包括墨卡托映射纹理坐标。