




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
球面相机旋转这种旋转方式用户体验方式要优于X轴y轴混合旋转方式,模型旋转的方向和鼠标移动方向保持一致。下面给出一种“球面相机”实现旋转的方法。原理:移动鼠标时,通过gluLookAt来改变视点的位置(采用增量的方式),而模型保持不动。即:只进行视点变换,不进行模型变换。下图是用户按下左键,在屏幕上移动的一段距离(从A移动到B)。(0,0)C—V1(cente1■朋,centery,centtrz)上一点A版嫁1)□---o M当前点B㈣死)k*由于屏幕坐标y轴向下,为了与投影平面坐标系(传统笛卡尔坐标)保持一致。AM=y1-y2; /*将消息代码描述*/BM=x2-x1;建立屏幕和投影变换近裁截面之间的对应关系(如下图)。
(eyesn(eyesneyey?eyez)AO(c=entericentericenter、、v(u.pvect< ctory,upvectors)JXj-'/\代码实现:voidsetSphereCameraPos(){//左键未按下,直接返回if(!is_left_button_down)return;6//从聚焦点指向视点的向量OA向量vector3dda(eye-target);9//计算球面相机半径radius=a.getLength();
//将其单位化a.normailize();//当前相机向上方向与a做叉乘,计算投影面水平向右方向向量uvector3ddu=upvector.crossProduct(a);//将其单位化u. normailize();//计算相机向上方向在投影面上的投影向量即垂直向上的方向向量vvector3ddv=a.crossProduct(u);//将其单位化normailize();//计算屏幕AB在投影面上对应的向量AB向量vector3ddm=u*delta_point.x+v*delta_point.y;//计算m向量的长度doublelen=m.getLength();//降低灵敏度len/=20.0;if(len>0.0){//角度AOB弧度表示弧长/半径1213141516171819202122232425262728293031323334353637doublex=len/radius;38〃将AB向量单位化39m.normailize();404141//按相反方向转动视点到C从而使得按与鼠标移动一致的方向转动模型4242x=-1*x;43//计算新的相机位置C4444eye=target+(a*cos(x)+m*sin(x))*radius;4546//计算新的相机向上方向47upvector=v;4849}消息代码1LRESULTCALLBACKWndProc(HWNDhWnd,//HandleForThisWindowUINTuMsg,//MessageForThisWindowWPARAMwParam,//AdditionalMessageInformationLPARAMlParam)//AdditionalMessageInformationswitch(uMsg)//CheckForWindowsMessages9 {101112139 {10111213141516171819202122//23//24return0;}2526//计算相机新的位置27pre_point=cur_pt;setSphereCameraPos();caseWMLBUTTONDOWN:is_left_button_down=true;pre_point.x=LOWORD(lParam);pre_point.y=HIWORD(lParam);caseWM_MOUSEMOVE:{if(is_left_button_down){cur_pt.x=LOWORD(lParam)cur_pt.y=HIWORD(lParam)delta_point为增量点delta_point.xcur_pt.x-pre_point.x);保持屏幕坐标系和投影平面坐标系一致delta_point.y=-1*(cur_pt.y-pre_point.y);〃将当前点赋值给前一个点return0;TOC\o"1-5"\h\z}32caseWM_LBUTTONUP:{is_left_button_down=false;return0;}}39//PassAllUnhandledMessagesToDefWindowProcreturnDefWindowProc(hWnd,uMsg,wParam,lParam);}43vector3dd类vector3ddclassvector3dd{private:doublex,y,z;5public:vector3dd(){};vector3dd(doublea,double b,doublec){x=a;y=b;z=c;}vector3dd(constvector3dd& v){*this=v;}
public:voidoperator=(constvector3dd&v){x=v.x;y=v.y;z=v.z;}vector3ddoperator*(doublea){returnvector3dd(a*x,a*y,a*z);}vector3ddoperator+(constvector3dd&v){returnvector3dd(x+v.x,y+v.y,z+v.z);}vector3ddoperator-(constvector3dd&v){returnvector3dd(x-v.x,y-v.y,z-v.z);}public:doublegetX(){returnx;}doublegetY(){returny;}doublegetZ(){returnz;}voidsetValue(doublea,doubleb,doublec){x=a;y=b;1011121314151617181920212223242526272829303132333435z=c;3637383940414243444546474849505152535455565758596061doublegetLength(){returnsqrt(x*x+y*y+z*z);}voidnormailize(){doublelength=getLength();x/=length;y/=length;z/=length;}voidinvert(){x*=-1;y*=-1;z*=-1;}vector3ddcrossProduct(constvector3dd&v){returnvector3dd(y*v.z-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版商品房买卖网签合同示范文本
- 2025年(工程车)车辆租赁合同
- 2025装订纸张采购合同范本
- 2025企业租赁合同设备租赁合同
- 2025年高阻尼材料合作协议书
- 2025贷款质押担保合同
- 2025设备租赁合同协议书模板
- 2025销售合同的编写范文
- 2025年:深度解析合同终止的多元化途径
- 2025财务援助借款合同书
- 小学三年级音乐《马兰谣》课件
- “当代文化参与”学习任务群相关单元的设计思路与教学建议课件(共51张PPT)
- 提高卧床患者踝泵运动的执行率品管圈汇报书模板课件
- 同理心的应用教学教材课件
- DB4102-T 025-2021海绵城市建设施工与质量验收规范-(高清现行)
- 城市轨道交通安全管理隐患清单
- 锡膏使用记录表
- 儿童保健学课件:绪论
- 中小学校园安全稳定工作岗位责任清单
- 校园安全存在问题及对策
- NY∕T 309-1996 全国耕地类型区、耕地地力等级划分
评论
0/150
提交评论