OpenGL中设置视角的技巧和如何绕任意边旋转

Frog1228 2012-02-02 05:03:35
我没学过计算机图形学,就是项目中要用到OpenGL做一些显示,有如下问题。
1.当画完图形的时候,需要通过gluLookAt来设置视角,如果视角选择得不好,就看不到物体,但是我觉得视角选择是件很麻烦的事,我怎么知道选哪个视角可以看物体看得更好,难道我大概估计地去试,但这也要依据知道画出来的点的坐标范围,请问这有没有什么技巧的?
2.void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z)
函数中第一个参数是表示目标沿从点(x,y,z)到原点的方向逆时针旋转的角度,后三个参
数是旋转的方向点坐标。比如(1,0,0)就是绕X轴旋转,那我如何让它绕某一线段旋转,不是过原点的,比如画出一个立方体,希望这个立方体绕它的某一条边旋转?
3.当将物体进行旋转和平移之后,物体不再以世界坐标系的原点为中心了,用glScale对物体进行放大缩小,它不是以中心进行放大缩小,一缩小或一放大就会移到其它地方,而不是以坐标系的原点为中心,有什么方法可以解决,难道我每进行一次放大缩小,再计算距离平移到中心?
...全文
1951 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bestenid 2014-05-17
  • 打赏
  • 举报
回复
请问12楼,gluLookAt是OpenGL自带的,还是自己写的啊,我没找到这个函数。
lrc199023 2013-04-08
  • 打赏
  • 举报
回复
gluLookAt 9个值 分别是 相机位置,相机中心,相机竖直方向 三个向量每个都是三个值 基本上只要知道了 你的物体放在哪 让相机中心 指向你物体放的位置就行了= =相机位置 离中心 距离自己把握- -
Trickster9 2012-03-25
  • 打赏
  • 举报
回复
1:
这个只有试
或者引用一些现实中照相摄像的经验
2:
将物体平移使世界坐标在你所期望的旋转轴位置
旋转物体
再平移物体回到原来的位置

边长为1.0的正方体,初始位置是中心在世界坐标原点
想使其绕左面垂直中线逆时针旋转90度
代码如下
glTranslatef(0.5, 0.0, 0.0);
glRotatef(90.0, 0.0, 1.0, 0.0);
glTranslatef(0.0, 0.0, 0.5);
/*draw the cube*/
3:
先缩放好再平移
hdz0310204 2012-03-24
  • 打赏
  • 举报
回复 1
2和3都是用glPushMatrix()和glPopMatrix()就能解决的啊,第1可以自己写代码控制视角动态变换,
这段代码是加在display函数中的。
glPushMatrix();
glTranslatef(xTranslation, yTranslation, zTranslation);
lightChange();
glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
glColor3ub(50, 100, 125);
glRotatef(zRot, 0.0f, 0.0f, 1.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
draw();
glPopMatrix();
xRot、yRot、zRot的值自己通过键盘设置。
向立天 2012-03-24
  • 打赏
  • 举报
回复
1、基本上就是试,做得多了也就有经验了
Frog1228 2012-03-22
  • 打赏
  • 举报
回复
再没人回,我就结贴了。
Frog1228 2012-03-06
  • 打赏
  • 举报
回复
前面两个问题再没人回,我就只能结贴了。。。
Frog1228 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mjjackey 的回复:]
前面两个问题再没人回,我就只能结贴了。。。
[/Quote]
说错了,是第一第三个问题,第二个已经知道了。3楼也写错了。
Frog1228 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fandh 的回复:]
1,应该可以通过设置坐标系来解决吧,不过,我觉得,还是计算视角比较好。
2,应该是平移到原点---旋转---平移回去,求这个矩阵即可。
[/Quote]
1. 怎么计算视角啊?有什么统一的方法啊?不好意思,我前面写错了,是1和3不知道,2已经知道了。
fandh 2012-03-06
  • 打赏
  • 举报
回复
1,应该可以通过设置坐标系来解决吧,不过,我觉得,还是计算视角比较好。
2,应该是平移到原点---旋转---平移回去,求这个矩阵即可。
Frog1228 2012-02-09
  • 打赏
  • 举报
回复
第三知道了,很简单,假设绕AB轴旋转,A点在世界系的坐标为(ax,ay,az),B点在世界坐标系的坐标为(bx,by,bz),先用glTranslatef(ax, ay, az)将原点移到A点,用 glRotatef(theta, (b-a)x, (b-a)y, (b-a)z)旋转,再用glTranslatef(-ax, -ay, -az)平移回原来世界坐标系的原点即可,也可以移动B点。
Remillia 2012-02-03
  • 打赏
  • 举报
回复
第三个问题应该可以用glPushMatrix()和glPopMatrix()来解决:在变换之前用Push保存当前坐标系的矩阵,完了之后通过Pop将改变的坐标系变回原来的,将坐标变换和应用坐标变换的图形放在这两个函数之间。
Frog1228 2012-02-03
  • 打赏
  • 举报
回复
没人回。。。
计算机图形学综合实验报告 烟台大学 计算机学院 软件工程专业 班 级: 计103-3 学 号: 201058503334 姓 名: 公茂华 指导教师: 孔繁茹 完成日期: 2012.11.10 综合试验:太阳系模型 1. 实验目的与要求 1、学习和掌握OpenGL的使用 2、掌握矩阵堆栈的实现方法 3、根据自己的创意实现实验内容,进一步掌握和理解OpenGL的使用 2. 实验内容 1、请编写地球围太阳自动旋转的方式 2、请再加上一个月亮, 并围地球旋转,并添加轨道 3、实现用户通过键盘或鼠标加入或减少行星和卫星 3. 实验结果 1. 开始运行 2. 增加地球和月亮(按键L或l)或其他任意行星及其若干卫星 3. 按照提示用鼠标和键盘增加或减少行星和卫星 转换视角: 4. 异常提示:要将Color.txt文件放到当前文件夹下 4. 体会 通过本次试验的实践,使我更加了解和初步掌握了OpenGL的用法,对使用OpenGl 绘制球体等图形有了充分认识,并对平移矩阵堆栈和旋转矩阵堆栈的使用有了初步的 掌握。虽然以前没有接触过OpenGl,但是通过学习计算机图形学这门课程的知识,以 及通过多次上机实验,已使我对OpenGL有了一定了解,不过具体使用和其它方面还需 要进一步理解和学习。最后,感谢老师的悉心指导。 5. 源程序 注:红色注释为新加 #include #include #include #include #include static float fE = 0.0f; //太阳或行星旋转的角度 static int i=0, j=0, m; //for循环计数 static GLint x=7, y=3; //转换视角,以太阳为心 static int a[8]; //计数第几颗行星的卫星的数量 static bool lag = false; //键盘L(l)增加行星的标志,true为增加 int k[8][3]; //读取文件数据 FILE *fp; void Initial() { glEnable(GL_DEPTH_TEST); //启用深度测试 glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色 } void Change(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h);//设置视区尺寸 glMatrixMode(GL_PROJECTION); //指定当前操作投影矩阵堆栈 glLoadIdentity(); //重置投影矩阵 GLfloat fAspect; fAspect = (float)w/(float)h; gluPerspective(45, fAspect, 1.0, 600.0);//设置透视投影矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Satellite() //增加卫星 { for (int n=0; n< a[i]; n++) { glPushMatrix(); glRotatef(30.0f+6*n, 0.0f, 0.0f, 1.0f); //z轴旋转30度 glRotatef(fE*10*(3*n+1), 0.0f, 1.0f, 0.0f); //公转速度fE*10*(3*n+1) glTranslated(-5.0f*m, 1.0f, 0.0f); glColor3f(256.0f, 256.0f, 0.0f); glutWireSphere(1.0f, 20, 20); //卫星 glColor3f(0.0f, 0.0f, 0.0f); glPopMatrix(); } } void Planet() //增加行星 { if (lag==true) //键盘L(l)增加行星 i=j-1; else i=0; for (;i绕y轴旋转一定的角度 glTranslated(20.0f*(i+1), 0.0f, 0.0f); //平移一段距离 glColor3f(k[i][0], k[i][1], k[i][2]

19,468

社区成员

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

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