作者prjryu (橘)
看板GameDesign
标题Re: [程式] glut转动问题
时间Mon May 18 07:02:53 2009
※ 引述《NDark (K1下次要买摇滚区)》之铭言:
: ※ 引述《prjryu (橘)》之铭言:
: : 在写程式的过程我不断遇到对单一轴旋转另两轴跟着转的问题
: : 也就是 glRotatef( angle, x,y,z ); 这个函数
: : 转glRotatef( 90, 1,0,0 ); 後,y轴和z轴 也一起对x轴转了九十度
: : 所以之後y z的转动就不是原本坐标轴的y和z了。
: : 上次发问後有个人推荐我去看一篇为平衡环锁的文章
: : http://www.programmer-club.com.tw/ShowSameTitleN/opengl/2000.html
: : 以上为网址,照跑出来的的确是我想要的结果,但我看不太懂。
: : void init_mo()
: : {
: : memset( mo, 0, sizeof(mo) );
: : mo[0]=mo[5]=mo[10]=mo[15]=1;
: : glutPostRedisplay();
: : }
: : 这个函数的作用? 为什麽这样写?
: : void update_mo( float angle, float x, float y, float z )
: : {
: : glPushMatrix();
: : glLoadIdentity();
: : glRotatef( angle, x,y,z );
: : glMultMatrixf(mo); //这行是做什麽?
: : glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //这行是做什麽?
: : glPopMatrix();
: : glutPostRedisplay();
: : }
: : ------------------------------------------------------
: : 或是有什麽其他的解决方法也请多指教,
: : 希望可以指教的详细一点,拜托大家了。
: 简单来讲.你要的就是一个简单的trackball.也就是上述mo的实作.
: Trackball原本的功用就是依照目前滑鼠拖拉的方向算出转轴,
: (以你的case就是你认为的世界座标系)
: 然後把旋转乘入目前trackball的状况(矩阵)来达到新的结果.再存回trackball
: 复杂一点的trackball实作就是一个简易的3D编辑软体,
: 可以对空间中的任一物件做三轴旋转.
: google "opengl trackball"第三个link
: Implementing a Virtual Trackball
: http://www.cse.ohio-state.edu/~crawfis/Graphics/VirtualTrackball.html
: 中 "We need to apply the rotation as the last transformation" 的部份
: 是不是跟mo的写法很类似?
可否详述call update_mo时
void update_mo( float angle, float x, float y, float z )
{
glPushMatrix();
glLoadIdentity();
glRotatef( angle, x,y,z );
glMultMatrixf(mo); //这行是做什麽?
glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //这行是做什麽?
glPopMatrix();
glutPostRedisplay();
}
在程式中的运作顺序及结果?
我看来是这样:
push
↘
│glGetFloatv( GL_MODELVIEW_MATRIX, mo ); │
│glMultMatrixf(mo); │
│glRotatef( angle, x,y, ); │
│glLoadIdentity(); │
└────────────────────┘
pop(所以执行顺序变成)
glGetFloatv( GL_MODELVIEW_MATRIX, mo ); //把现在的矩阵存到mo
glMultMatrixf(mo); //把目前的矩阵乘上mo
glRotatef( angle, x,y, ); //转角度
glLoadIdentity(); //回到原来的状态
此处MODELVIEW_MATRIX矩阵和目前的矩阵不一样的吗?
可以一行一行解释吗?
--
邮差又来送羊奶了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.149.185
1F:推 darkflier:opengl就是这点很鸟囧rz...建议你 05/18 08:11
2F:→ darkflier:一行一行试试看 看拿掉会有什麽结果 05/18 08:11
3F:推 darkflier:pop 跟push 搞清楚他是干嘛的 05/18 08:14
4F:推 Bencrie:push跟pop对目前在OpenGL里的矩阵(你看不到)做动作 05/18 12:37
5F:→ Splash5:总觉得是线性代数的问题 囧.. 05/18 13:00
6F:推 Splash5:它的pushMatrix跟popMatrix只对目前所使用的矩阵.. 05/19 00:58
7F:→ Splash5:所以push就等於暂存一份起来 之後loadidentity盖掉matrix 05/19 01:00
8F:→ Splash5:作下面几行运算最後得到我们要的东西後 再把刚刚push的 05/19 01:01
9F:→ Splash5:matrix再pop回来 05/19 01:01
10F:→ killman:补充一下 所以pop就是把上一个push"之前"的matrix取回 05/19 07:39
11F:→ Splash5:我是想push pop应该是data structure的东西 应该不用讲XD 05/19 14:05
12F:→ prjryu:恩 资料结构没问题 05/21 04:53