参考资料:nehe教程第48课《轨迹球实现的鼠标旋转》

1、在头文件中为Arcball添加变量

 //为Arcball添加变量用来获取当前鼠标点Point2fT    MousePt;// NEW: Current Mouse Point  

2、在源文件中对轨迹球参数初始化

transform是我们获得的最终的变换矩阵
lastRot是上一次鼠标拖动得到的旋转矩阵
thisRot为这次鼠标拖动得到的旋转矩阵。

//*******************轨迹球参数初始化********************
ArcBallT ArcBall(640.0f, 480.0f);
Matrix4fT Transform={1.0f,0.0f,0.0f,0.0f,// NEW: Final Transform
0.0f,1.0f,0.0f,0.0f,
0.0f,0.0f,1.0f,0.0f,
0.0f,0.0f,0.0f,1.0f};
Matrix3fT LastRot  ={1.0f,0.0f,0.0f,   // NEW: Last Rotation
0.0f,1.0f,0.0f,
0.0f,0.0f,1.0f};
Matrix3fT ThisRot  ={1.0f,0.0f,0.0f,   // NEW: This Rotation
0.0f,1.0f,0.0f,
0.0f,0.0f,1.0f};

3、在onsize()函数中设置轨迹球的边界

注意:onsize()函数中,添加if()判断,设置轨迹球的函数ArcBall.SetBounds()才不会出现assert错误,这跟轨迹球的头文件有关。

if(cy>0)
{
ArcBall.setBounds((GLfloat)cx, (GLfloat)cy); 
}

函数全:

void CtestviewView::OnSize(UINT nType, int cx, int cy)
{CView::OnSize(nType, cx, cy);// TODO: Add your message handler code here//
if (cy>0)
{glViewport (0, 0, (GLsizei)(cx), (GLsizei)(cy));                   // 设置窗口可见区为窗口大小glMatrixMode (GL_PROJECTION);                                        // 设置投影矩阵glLoadIdentity ();                                                 // 重置它gluPerspective (45.0f, (GLfloat)(cx)/(GLfloat)(cy),1.0f, 100.0f); // 设置可视冷苔体//glMatrixMode (GL_MODELVIEW);                                        // 设置为模型变换矩阵glLoadIdentity ();                                                  // 重置它/***********************************新添的代码***********************************************************************************///设置轨迹球的边界ArcBall.setBounds((GLfloat)cx, (GLfloat)cy); //在后缓冲中绘制图形//glDrawBuffer (GL_BACK);/********************************************************************************************************************************/
}}

4、添加鼠标消息响应函数

//鼠标的消息响应函数
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);

//鼠标左键down
void CtestviewView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//Arcball rotate controlLastRot=ThisRot;// Set Last Static Rotation To Last Dynamic OneMousePt.s.X=point.x;MousePt.s.Y=point.y;ArcBall.click(&MousePt);// Update Start Vector And Prepare For DraggingLButtonSta=TRUE;//mouseX=point.x;//mouseY=point.y;CView::OnLButtonDown(nFlags, point);
}//鼠标左键up
void CtestviewView::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值LButtonSta=FALSE;CView::OnLButtonUp(nFlags, point);
}//鼠标move
void CtestviewView::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (LButtonSta==TRUE){Quat4fT ThisQuat;MousePt.s.X=point.x;MousePt.s.Y=point.y;ArcBall.drag(&MousePt,&ThisQuat);// 更新轨迹球的变量Matrix3fSetRotationFromQuat4f(&ThisRot, &ThisQuat);// Convert Quaternion Into Matrix3fTMatrix3fMulMatrix3f(&ThisRot, &LastRot);// Accumulate Last Rotation Into This OneMatrix4fSetRotationFromMatrix3f(&Transform, &ThisRot);}CView::OnMouseMove(nFlags, point);
}

5、在RenderScene() 函数中,在绘制前,把我们得到的矩阵乘以当前的模型变换矩阵。

         //为arcball添加的旋转矩阵,用以乘以当前的模型变换矩阵glMultMatrixf(Transform.M);//旋转

在MFC中,运用轨迹球算法实现鼠标旋转物体相关推荐

  1. MFC中picture控件如何响应鼠标移动?

    MFC中picture控件如何响应鼠标移动? 2011-08-21 21:23 轻若惊鸿 | 浏览 3354 次 硬件网络 我将一个picture控件的属性中的Notify勾上了,但是只能响应鼠标按键 ...

  2. OpenGL中的轨迹球问题

    OpenGL鼠标轨迹球(Trackball)原理 什么是鼠标轨迹球 类似AutoCAD里的"动态观察",三维模型都是要投影到二维的屏幕上才能显示给用户,而用户如果想观察一下三维模型 ...

  3. MFC中简单图形的平移与简单旋转

    #include "stdafx.h"#include "hui.h"#include "HuiTu.h"//为自己建立的主程序头文件hui ...

  4. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. python鼠标移动轨迹_鼠标的另一种选择,肯辛通轨迹球能否改变固有的使用习惯?...

    [引言] 鼠标,作为电脑甚至是现在Pad的外接输入设备,其地位从1964年雏形诞生的那一刻起便从未被撼动,哪怕是thinkpad的小红点以及外接触摸板的出现.鼠标最早只是一个装有两个滚轮(是圆盘型滚轮 ...

  6. OpenGL(sharpGL)支持任意相机可平移缩放的轨迹球原理描述及源码

    本文提供一个本人编写的轨迹球类(ArcBall.cs),它可以直接应用到任何 camera 下,还可以同时实现缩放和平移. 工程源代码在文末. 1.轨迹球原理: 上面是我黑来的两张图,拿来说明轨迹球的 ...

  7. 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现

    [OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球实现 阅读目录(Content) 2016-07-08 2016-02-10 1. 轨迹球原理 2. 轨迹球实现1) 计算投影点2) 计 ...

  8. OpenGL MFC单文档 实现轨迹球

    OpenGL MFC单文档 实现轨迹球 前言:我是一个怀揣着伟大梦想的普通男生!结果就是,一有时间就幻想着自己的伟大梦想,忘了自己下一步该迈出左脚还是右脚.这不,只顾做梦了,时光可不管我,独自一个人走 ...

  9. three.js使用轨迹球控件TrackballControls控制相机(vue中使用three.js62)

    使用TrackballControls控制相机 1.demo效果 2.TrackballControls介绍 2.1 TrackballControls操控说明 2.2 TrackballContro ...

最新文章

  1. mysql权限的误操作的恢复
  2. TCP/IP详解--第十六章
  3. 深度学习核心技术精讲100篇(二十一)-深入理解Dirichlet分布及过程
  4. CCNA题库关于Frame-relay看图答题的解答
  5. 高级SmartGWT教程,第2部分
  6. uboot启动过程总结的思维导图
  7. ubuntu 16.04 源码安装samba并且配置
  8. java 类型转换原理_9.java数据类型的转换
  9. mysql select 进阶_MySQL进阶_SELECT篇(一)
  10. Word01-从正文处开始插入页码
  11. 拓端tecdat|R语言自定义两种统计量度:平均值和中位数,何时去使用?
  12. 给还在迷茫的你分享我从零基础的日语文科生半路出家搞Python如何上岸的
  13. unity2018关联不到vs_vs2015与unity2018兼容性问题
  14. excel中如何锁定单元格
  15. 2022经典生活感悟说说,句句值千金
  16. Modelsim仿真实验
  17. Win11机械硬盘磁盘碎片整理方法
  18. 成考自考本科生可以申请德国大学吗?
  19. MarkDown: 为字体添加颜色
  20. python不改变图片尺寸压缩到指定大小

热门文章

  1. 纯干货!77个Python常用函数汇总,赶紧收藏!
  2. linux忘记密码,如何修改密码
  3. SQL Server 中深入理解GRANT、REVOKE 和 DENY 的区别
  4. Android 3分钟带你入门开发测试
  5. 【SpringBoot】18、SpringBoot中使用Session共享实现分布式部署
  6. 程序流程图的主要优点
  7. MySQL数据库设计范式
  8. 10328 - 猴子吃桃
  9. mycat读写分离配置
  10. 2022-5月-第一周日报