【问题标题】:i want to wrap an image around a sphere in opengl我想在opengl中将图像包裹在球体周围
【发布时间】:2014-05-23 16:47:42
【问题描述】:

我正在开发台球游戏,我在桌子上有几个球。 为了使每个球独一无二,我尝试使用纹理为它们提供数字。使用纹理我还可以显示球的旋转。

到目前为止,我已经使用 SOIL in 映射了纹理

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

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

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

【问题讨论】:

  • 您只启用了 2 个轴 glEnable(GL_TEXTURE_GEN_S) glEnable(GL_TEXTURE_GEN_T); 尝试添加 Q 和 R(它在 3d 中)
  • 环境映射通常用于模拟反射表面。尝试改用对象线性映射
  • ` gl.glEnable(GL.GL_TEXTURE_GEN_R); gl.glTexGeni(GL.GL_R, GL.GL_TEXTURE_GEN_MODE, GL.GL_OBJECT_LINEAR);`似乎足以在随机对象上应用纹理。
  • this link 很好地解释了不同的技术
  • 感谢@j-p 的快速回复。正如你提到的,我尝试使用 Q 和 R 轴,但它没有用,它还删除了它之前显示的任何纹理。现在它显示的是纯白球。

标签: c++ image opengl opengl-es


【解决方案1】:

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

但是,在您的情况下,您可能想要应用圆柱映射,例如 mercator projection

OpenGL 无法为您完成固定功能。 但是在顶点着色器中实现很简单phi = atan2(x/y); theta = atan2(x/z) 使用 phi 和 theta 作为纹理坐标。

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

【讨论】:

  • 是的,我的意思只是墨卡托投影。我尝试了您提供的解决方案,效果很好。但是我需要放置一些纹理来包裹球,例如世界地图。我如何在那里添加我的 .bmp 或 .png 文件。感谢您的回复。
  • @akash300:使用现有的 OpenGL 纹理加载器库之一。 SOIL、DevIL(虽然不是很积极地维护)等。如果你在谷歌的小盒子里输入“OpenGL SOIL”,你应该会得到很多结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多