首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

opengl-移动旋转、放缩中心解决方案

2012-02-25 
opengl--移动旋转、放缩中心我的源程序(部分代码)问题:实现鼠标控制图片在某指定点旋转,第一控制旋转时没有

opengl--移动旋转、放缩中心
我的源程序(部分代码) 
问题:实现鼠标控制图片在某指定点旋转,第一控制旋转时没有什么问题,从第二次开始就有问题了 
void CDialogGLDlg::RenderScene() 

  LPBLOB bpb; 
bpb = m_lpBlobs; 
int i; 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glTranslatef(0.0,0.0,-8.0); 
Draw(); 
for(i = 0;i < 2;i++) 

glLoadName(i + 1); 
glPushMatrix(); // Position / translation (mouse rotation) 
glTranslatef(0.0,0.0,zmove); 
  glTranslatef(xmove,0.0f,0.0f); 
glTranslatef(0.0f,ymove,0.0f); 
float xx = (point1[1].x-width / 2)/ratiox - xmove; 
float yy = (point1[1].y-height / 2)/ratioy + ymove; 
  //point1是鼠标右键按下后记录的点,程序是要实现鼠标控制图片在定点point1旋转 
  //width、height是窗口的宽高,ratiox是比例系数,xmove是鼠标控制图片移动的距离 
glTranslatef(xx, -yy,0.0f); 
glRotatef(-m_Rotate,0.0,0.0,1.0); 
glScalef(m_Scale,m_Scale,1.0); 
glTranslatef(-xx,yy,0.0f); 
glCallList(i + 1);//画的一个矩形,有贴图的 
glPopMatrix(); 
glTranslatef(3.0,1.0,0.0f); 
}  

很急,很着急!谢谢各位高手了 
还有个问题,我想控制物体相对某个定点放缩,应该怎么做

[解决办法]
缩放的时候是一样的

缩放前,先把图片移回原点,然后缩放,再把图片放回原来位置

glTranslatef(xx,yy,0.0);
glScalef(m_Scale,m_Scale,1.0); 
glTranslatef(-xx,-yy,0.0);
[解决办法]
楼主,告诉你一个最适用的方法
这种类似的操作我做过

不要使用opengl自带的移动旋转,缩放矩阵函数,而是自己写矩阵,这样灵活多了。
最后使用glMultMatrixd()这个函数,就可以了。

可以这样做,首先是位置变换,当点击画面上一个图片的时候,把这个图片的位置保存到一个矩阵中,
如果图片的位置是(x,y,z,1)的话,那么矩阵T为
1,0,0,x
0,1,0,y
0,0,1,z
0,0,0,1

然后再做一个缩放矩阵S

x,0,0,0
0,y,0,0
0,0,z,0
0,0,0,1

其中x,y,z是可以任意给的变量

然后再做旋转矩阵,如果使用四元数的话,要方便一些,但是四元数的类和四元数转换为矩阵的操作都要自己写,如果使用欧拉角的话,这里就分别做3个矩阵,然后再相乘。
旋转矩阵是怎样的楼主自己看书,任何一本计算机图形学的书都有的,假设现在分别绕x,y,z轴的矩阵都有了,Rx,Ry,Rz

那么现在只要把这些矩阵合在一起,做一个刚体变换矩阵M就可以了。

那么

M = T × Rx×Ry×Rz ×S

最后在使用opengl的函数glMultMatrixd(M),就可以了

这里要注意的是,opengl中的矩阵是以一维数组的形式保存的,所以这里的M,也要是个一维的数组,矩阵乘法楼主自己写一个就是了,不复杂。只是要注意M中元素的保存顺序

M0, M1, M2, M3
M4, M5, M6 ,M7
M8, M9, M10,M11
M12,M13,M14,M15

要这样保存,然后对操作的图片应用这个矩阵就可以了。

glPushMatrix();
glMultMatrixd(M);
// 显示图片的代码
glPopMatrix();

热点排行