OpenGL 鼠标拖动 3D 旋转

dal0324 2009-08-13 07:51:08
void CSixthView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

if(mouserightdown)
{
SetCamPos(2, -(point.y - mouseprevpoint.y) , TRUE,TRUE);
}
else if(mouseleftdown)
{
SetSceneRot(0, (point.y - mouseprevpoint.y) , TRUE,TRUE);
SetSceneRot(1, (point.x - mouseprevpoint.x) , TRUE,TRUE);
scenePos[0] += point.x - mouseprevpoint.x;
scenePos[1] += point.y - mouseprevpoint.y;
}

mouseprevpoint.x = point.x;
mouseprevpoint.y = point.y;

CView::OnMouseMove(nFlags, point);
}

void CSixthView::SetSceneRot(int axis , int value , bool increment, bool apply)
{
/*if(increment)
sceneRot[axis] += (sceneRot[axis] >=360) ? (-360 + value/2): value/2;
else
sceneRot[axis] = (sceneRot[axis] >=360) ? (-360 + value/2): value/2;*/
sceneRot[axis] += value/3.6;
if (sceneRot[axis]>=360)
{
sceneRot[axis] -= 360;
}

if (sceneRot[axis]<0)
{
sceneRot[axis] += 360;
}
RenderScene();
}

旋转部分:
glRotatef( sceneRot[0], 1.0F, 0.0F, 0.0F );
glRotatef( sceneRot[1], 0.0F, 1.0F, 0.0F );
glRotatef( sceneRot[2], 0.0F, 0.0F, 1.0F );

这个常见的例子,但是glRotaef每用一次,坐标轴就变动了,比如X轴屏幕水平向右,Y轴屏幕竖直向上,Z垂直屏幕向上,上下拖动鼠标使其绕X轴转动90度时,Y轴朝屏幕里面,那么鼠标左右移动时则是沿Z轴旋转,但是上面的函数无法实现,是不是得用归一球模拟?利用四元数才能实现?求大虾指教,小弟初学OpenGL。
...全文
963 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rnm1234567 2010-11-30
  • 打赏
  • 举报
回复
怎么搞定的啊??纠结这个问题中。。。。
范特西 2009-08-17
  • 打赏
  • 举报
回复
三维旋转,需要利用归一球模拟,将鼠标点转化成三维单位向量,得到拖动的前后两点对应的三维单位向量后,利用原旋转矩阵的逆矩阵,求出其在原坐标系中的对应的向量,在利用这两向量计算出旋转轴和旋转角度,利用旋转轴和旋转角度得到一个四元数,将该四元数转换成旋转矩阵后,该矩阵与原旋转矩阵相乘得到当前旋转矩阵。
dal0324 2009-08-17
  • 打赏
  • 举报
回复
自己总算搞定了。。。

19,468

社区成员

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

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