arcball 鼠标 相机转动
生活随笔
收集整理的這篇文章主要介紹了
arcball 鼠标 相机转动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用arcball原理來是相機在某個半徑旋轉,而且相機的目標方向永遠指向最初的目標方向,就是類似于相機在球面上旋轉并且始終指向球心。
直接上程序流圖和代碼。
arcball原理還有相關的旋轉矩陣在上一篇文章有介紹:這里
程序流圖:
完整的camera頭文件
#ifndef __CAMERA__ #define __CAMERA__#include <armadillo>struct Axis {arma::vec3 direction;//旋轉軸方向arma::vec3 position; //旋轉軸位置 };class Camera { public:Camera(const arma::vec3& position, const arma::vec3& target, const arma::vec3& upVec);~Camera() {}; public:void defineModelView();//確定視圖矩陣,必須在繪圖之前確定,每次繪圖之前應該先調用void translateX(const double &x); //改變相機位置的X坐標void translateY(const double &y); //改變相機位置的Y坐標void translateZ(const double &z); //改變相機位置的Z坐標void rotateY(const double& theta); //相機繞著y軸旋轉arma::vec3 getPosition()const { return position; } //返回相機位置坐標信息/*arcBallRotate 函數說明:給定單位化后,鼠標在屏幕上的偏移量,計算在arcball原理下,相機實際位置的變換,并改變相機的實際位置參數說明:double x : x方向偏移量double y : y方向便宜量*/void arcBallRotate(double x, double y);private:/* arcball 函數說明:在單位化下,計算屏幕中鼠標移動的偏移量,在單位球上產生的位置變換,并且用旋轉軸和旋轉角表示參數說明:double x 范圍輸入0.0 - 1.0;表示在相機坐標系下x方向偏移量double y 范圍輸入0.0 - 1.0;表示在相機坐標系下y方向的偏移量arma::vec3 &axisVec 經過計算后返回的旋轉軸方向向量,如果計算失敗返回的就是輸入值double &thete 經過計算后旋轉的角度,若計算失敗返回輸入值函數返回值說明:如果返回true,則表示計算成功,否則表示計算失敗*/bool arcball(double x, double y, arma::vec3& axisVec, double& theta);/* cameraToWorldCoord 函數說明:將相機坐標系中的點,向量,轉化到世界坐標系中去。參數說明:const arma::vec3& position: 相機坐標系中的點或者向量函數返回值說明:轉化后世界坐標系中的點或者向量*/arma::vec3 cameraToWorldCoord(const arma::vec3& position);/*axisRotateTheta 函數說明:使相機位置 繞給定的旋轉軸 旋轉給定的角度。參數說明:cosnt Axis & axis: 旋轉坐標軸double theta :旋轉角度值, 正值為右手螺旋,負值為左手螺旋函數返回值:旋轉后的坐標*/arma::vec axisRotateTheta(const Axis& axis, double theta ,const arma::vec3 &origin);private:arma::vec3 position; //表示相機位置arma::vec3 target; //表示相機目標arma::vec3 upVec;//表示上向量 };#endif // ! __CAMERA__總結
以上是生活随笔為你收集整理的arcball 鼠标 相机转动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: armadillo 使用注意 越界不报错
- 下一篇: 数组中找重复数字