球面相机旋转这种旋转方式用户体验方式要优于x轴y轴混合旋转方式,模型旋转的方向和鼠标移动方向保持一致。下面给出一种“球面相机”实现旋转的方法。原理:移动鼠标时,通过gluLookAt来改变视点的位置(采用增量的方式),而模型保持不动。即:只进行视点变换,不进行模型变换。下图是用户按下左键,在屏幕上移动的一段距离(从A移动到B)。由于屏幕坐标y轴向下,为了与投影平面坐标系(传统笛卡尔坐标)保持一致。AM=y1-y2; /*将消息代码描述*/BM=x2-x1;建立屏幕和投影变换近裁截面之间的对应关系(如下图)。代码实现:1voidsetSphereCameraPos()2{3 //左键未按下,直接返回4 if(!is_left_button_down)5 return;67 //从聚焦点指向视点的向量 OA向量8 vector3dda(eye-target);910 //计算球面相机半径11 radius=();1213 //将其单位化14 ();1516 //当前相机向上方向与a做叉乘,计算投影面水平向右方向向量u17 vector3ddu=(a);18 //将其单位化19 ();2021 //计算相机向上方向在投影面上的投影向量即垂直向上的方向向量v22 vector3ddv=(u);23 //将其单位化24 ();2526 //计算屏幕AB在投影面上对应的向量AB向量27 vector3ddm=u*+v*;2829 //计算m向量的长度30 doublelen=();31 //降低灵敏度32 len/=;3334 if(len>)35 {36 //角度AOB 弧度表示弧长/半径37 doublex=len/radius;38 //将AB向量单位化39 ();4041 //按相反方向转动视点到C从而使得按与鼠标移动一致的方向转动模型42 x=-1*x;43 //计算新的相机位置C44 eye=target+(a*cos(x)+m*sin(x))*radius;4546 //计算新的相机向上方向47 upvector=v;48 }49}消息代码1LRESULTCALLBACKWndProc( HWND hWnd, //HandleForThisWindow2 UINT uMsg, //MessageForThisWindow3 WPARAM wParam, //AdditionalMessageInformation4 LPARAM lParam) //AdditionalMessageInformation5 {6 switch(uMsg) //CheckFor Windows Messages7 {8 caseWM_LBUTTONDOWN:9 {10 is_left_button_down=true;11 =LOWORD(lParam);12 =HIWORD(lParam);1314 return0;15 }1617 caseWM_MOUSEMOVE:18 {19 if(is_left_button_down)20 {21 =LOWORD(lParam);22 =HIWORD(lParam);//delta_point为增量点23
球面相机旋转算法 来自淘豆网www.taodocs.com转载请标明出处.