OpenGL-摸索篇之物体旋转

关于物体旋转, 很多人都用glRotate处理,确实,只要知道旋转轴与旋转角度,即可发生旋转。

这里我要分享一下怎么相应鼠标运动来处理物体旋转。



  鼠标运动可以记录前后的鼠标坐标(x, y), 而从x y中怎么获得旋转轴和旋转角度呢?

第一: 模型,

  将整个程序桌面看做一个球体, 而鼠标的位置(x, y )对应球体表面的点。那么从球面的一点,到另一点这个角度可以通过cosA = OA。OB / |OA|*|OB|获得。 而旋转轴可以通过OA OB 的叉积 求出其垂线(即为旋转轴) 

  细节:一般将窗口中心看做空间坐标的原点,这个时候就需要进行坐标变换了。而鼠标的坐标原点是在左上角。

  鼠标运动可以记录前后的鼠标坐标(x, y), 而从x y中怎么获得旋转轴和旋转角度呢?



 读者会发现 如果马上将得到的旋转轴立即代进去, 第一次的旋转差钱人意, 而后的就匪夷所思了。这是为什么呢?

第二: 此旋转轴非彼旋转轴,

 在上面得到的 确实是旋转轴, 不过当我们旋转一次后, 再按照以前的做法 直接代入glRotate中,其实这个时候的旋转轴还是以没旋转的为基础所得到的。 这个时候需要我们通过矩阵变换,将旋转轴左乘一个MODEL_VIEW矩阵; 下面是代码:

void COpenGL::Localize(double p[])
{
   int i,j;
   double e[3];
   double pMatrix[16],a[3][3];               //模型视图矩阵


   for(i=0;i<3;i++)
        e[i]=0;
   glGetDoublev(GL_MODELVIEW_MATRIX,pMatrix);//取模型视图矩阵,矩阵元素按行存放在一维数组中
   for(i=0;i<3;i++)                          //取矩阵左上角三阶矩阵
     for(j=0;j<3;j++)
        a[i][j]=pMatrix[4*i+j];           //a[i]表示第i行
//2013-11-25 郑**:只取齐次矩阵中的右上3X3矩阵(有效的)  
   for(i=0;i<3;i++)                          //向量在局部坐标系中的表示
     for(j=0;j<3;j++)
        e[i]+=a[i][j]*p[j];
//2013-11-25 郑**:旋转轴也需要进行矩阵变换:这样得来的旋转轴才是当前的旋转轴 否则则为先前图形的旋转轴
   for(i=0;i<3;i++)
      p[i]=e[i];
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值