gpt4 book ai didi

c++ - 我想在 opengl 中将图像包裹在一个球体周围

转载 作者:太空狗 更新时间:2023-10-29 21:00:08 26 4
gpt4 key购买 nike

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

到目前为止,我已经使用 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

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

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

最佳答案

不要使用纹理坐标生成模式。它的应用程序很少。你的不在其中。 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我提供了用于生成球体几何体的代码,包括墨卡托映射纹理坐标。

关于c++ - 我想在 opengl 中将图像包裹在一个球体周围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com