OpenGL里球体贴图旋转的问题

magicqy 2009-10-26 08:28:56
新手第一问,大家来帮忙啊,哈哈哈!!

Q:
我用OpenGL做一个贴图的demo,画了一个球,用一张台球的图片贴在上面,到这全部OK,运行结果正常
但是,我后来加了个旋转功能,就发现只有球在动,贴图始终保持在那个位置上没有跟球体一起运动
请问这个问题是什么原因,何解?

部分代码如下:
Init()
{
...
glEnable(GL_TEXTURE_2D);
//指定像素的存储对齐方式,保持与BMP格式一致
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGenTextures(1, &texName);//创建纹理
glBindTexture(GL_TEXTURE_2D, texName);

-----get the bmp data-----------

//指定图片作为纹理,注意bmp像素为BGR序
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
BMP.bmWidth, BMP.bmHeight,
0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
DeleteObject(hBMP); // Delete The Object

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_MAG_FILTER,
GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR);

//纹理函数,决定颜色如何组合
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
...
}

display()
{
...glRotatef()...glutSolidSphere()...glFlush()...
}
...全文
1182 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ebirdfighter 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

glTexGenf
是映射上去的,意味着不管球怎么转,纹理都是不动的,想要纹理随球运动,好像是只有逐三角画,逐三角贴图
[/Quote]
逐三角贴图?怎么操作??
magicqy 2009-11-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pady_pady 的回复:]
glTexGenf
是映射上去的,意味着不管球怎么转,纹理都是不动的,想要纹理随球运动,好像是只有逐三角画,逐三角贴图
[/Quote]
哦,原来是这样,谢谢了
pady_pady 2009-10-29
  • 打赏
  • 举报
回复
glTexGenf
是映射上去的,意味着不管球怎么转,纹理都是不动的,想要纹理随球运动,好像是只有逐三角画,逐三角贴图
pady_pady 2009-10-28
  • 打赏
  • 举报
回复
纹理应该是分开绑定的,每一个小三角都应该绑定一个纹理,也就是说应该设置每个顶点的坐标,和纹理坐标
magicqy 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuhuwy 的回复:]
当球旋转时,纹理坐标也需要跟着旋转,检查下是不是这一步出了问题
[/Quote]
可能是我理解出了问题吧,我知道一般都是用
glTexCoord2f() glVertex3f() 成对出现的方法来指定纹理和模型的顶点坐标对应关系

但是我这里用的是glutSolidSpere方法画的球体
用了一个叫glTexGenf的函数来生成纹理坐标,没有手动指定
magicqy 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 feilinhe 的回复:]
你列出的代码部分没问题的,应该是你贴图的代码部分的问题,纹理坐标的计算的问题
glTexCoord3f( ... );
glVertex3f( ...);这两个函数里面的坐标也要是随着变化的
[/Quote]
可我画的是球呀,坐标是自动生成的,没法一个点一个点的设glTexCoord3f吧
feilinhe 2009-10-27
  • 打赏
  • 举报
回复
你列出的代码部分没问题的,应该是你贴图的代码部分的问题,纹理坐标的计算的问题
glTexCoord3f( ... );
glVertex3f( ...);这两个函数里面的坐标也要是随着变化的
magicqy 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 alicehyxx 的回复:]
display()在哪调用的?


[/Quote]
回调函数啊.
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("纹理贴图");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
wuhuwy 2009-10-27
  • 打赏
  • 举报
回复
当球旋转时,纹理坐标也需要跟着旋转,检查下是不是这一步出了问题
周成风 2009-10-26
  • 打赏
  • 举报
回复
display()在哪调用的?

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧