C++ 我想在opengl中围绕球体包装一个图像

C++ 我想在opengl中围绕球体包装一个图像,c++,image,opengl,opengl-es,C++,Image,Opengl,Opengl Es,我正在开发台球游戏,桌上有几个球。 为了使每个球都独一无二,我试着用纹理给它们编号。使用纹理,我还可以显示球的旋转 到目前为止,我已经使用中的土壤映射纹理 INIT()函数--- 显示函数() 我从中得到的是整个图像映射到球体的可见部分,而不是环绕球体,这样只有部分图像可见。 此外,当我移动相机时,相机纹理也会随之旋转 那个么,我如何将我的纹理环绕在球体上,以便只显示部分图像呢 不要使用纹理坐标生成模式。它的应用程序数量非常少。你的不在其中GL_SPHERE_MAP未将纹理包裹在球体周围;这个名

我正在开发台球游戏,桌上有几个球。 为了使每个球都独一无二,我试着用纹理给它们编号。使用纹理,我还可以显示球的旋转

到目前为止,我已经使用中的土壤映射纹理

INIT()函数---

显示函数()

我从中得到的是整个图像映射到球体的可见部分,而不是环绕球体,这样只有部分图像可见。 此外,当我移动相机时,相机纹理也会随之旋转


那个么,我如何将我的纹理环绕在球体上,以便只显示部分图像呢

不要使用纹理坐标生成模式。它的应用程序数量非常少。你的不在其中
GL_SPHERE_MAP
未将纹理包裹在球体周围;这个名字有点骗人。实际上,这是一种早期形式的反射贴图,看起来像是通过球面镜拍摄环境

但是,在您的示例中,可能需要应用柱面贴图,如

固定功能OpenGL不能为您做到这一点。然而,在顶点着色器
phi=atan2(x/y)中实现它很简单;θ=atan2(x/z)
使用φ和θ作为纹理坐标


无论如何,更好的方法是使用纹理坐标绘制球体几何体以供使用。在中,我提供了用于生成球体几何体(包括墨卡托贴图纹理坐标)的代码。

您仅启用了两个轴
glEnable(GL_纹理_GEN_S)glEnable(GL_纹理_GEN_T)尝试添加Q和R(在3d中)环境贴图通常用于模拟反射表面。尝试使用对象线性映射代替“gl.glEnable”(gl.gl\u纹理\u GEN\R);gl.glTexGeni(gl.gl\u R,gl.gl\u纹理\u GEN\u模式,gl.gl\u对象\u线性)`似乎足以在随机对象上应用纹理。很好地解释了不同的技术hanks@j-p的快速回复。正如你提到的,我试着使用Q轴和R轴,但它不起作用,而且它删除了它之前显示的任何纹理。现在它显示的是纯白色的球。是的,我只是指墨卡托投影。我尝试了你提供的解决方案,效果非常好。但是,我需要放置一些纹理包裹球,例如世界地图。如何在那里添加.bmp或.png文件。感谢您的回复。@akash300:使用现有的OpenGL纹理加载器库之一。土壤,魔鬼(虽然不是很积极维护),等等。如果你在谷歌的小盒子里输入“OpenGL土壤”,你应该会得到很多结果。
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