欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

OpenGL進(jìn)階(十四)-UVNCamera實(shí)現(xiàn)-創(chuàng)新互聯(lián)

提要

   3D游戲中最基本的一個(gè)功能就是3D漫游了,玩家可以通過(guò)鍵盤或者鼠標(biāo)控制自己的視角。

創(chuàng)新互聯(lián)公司是專業(yè)的六合網(wǎng)站建設(shè)公司,六合接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行六合網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

   之前我們也學(xué)習(xí)過(guò)一個(gè)相關(guān)的函數(shù),glLookAt,用來(lái)制定攝像機(jī)的位置,攝像機(jī)觀察目標(biāo)位置,還有攝像機(jī)的放置方式,我們可以通過(guò)不斷地調(diào)用這個(gè)函數(shù)來(lái)實(shí)現(xiàn)3D漫游,但更方便的是抽象出一個(gè)攝像機(jī)類,實(shí)現(xiàn)一些攝像機(jī)的方法。

UVN相機(jī)

UVN使用三個(gè)相互垂直的向量來(lái)表示相機(jī)的位置與朝向:

1) 相機(jī)注視的向量N
2) 相機(jī)的上方向向量V
3) 相機(jī)的右方向向量U

如下圖,是在世界坐標(biāo)系下的UVN相機(jī)的向量表示:

OpenGL進(jìn)階(十四) - UVN Camera實(shí)現(xiàn)

綠色軸為N,藍(lán)色軸為V,紅色軸為U。

當(dāng)要改變相機(jī)位置和朝向的時(shí)候,只需要將uvn矩陣和相應(yīng)的變換矩陣相乘即可。

代碼實(shí)現(xiàn)

這里借助了一個(gè)第三方矩陣向量庫(kù) - eigen。Ubuntu下的安裝的過(guò)程非常簡(jiǎn)單,下載源碼之后,解壓,cd進(jìn)目錄:

mkdir build
cd build 
cmake ..
sudo make install

寫一個(gè)頭文件:

eigen.h

#ifndef EIGEN_H #define EIGEN_H  #include "eigen3/Eigen/Dense" #include "eigen3/Eigen/LU" #include "eigen3/Eigen/Core"  #endif // EIGEN_H

放在工程目錄下面,使用的時(shí)候包含進(jìn)來(lái)就可以了。

看類聲明:glcamera.h

#ifndef GLCAMERA_H #define GLCAMERA_H #include "eigen.h" #include <GL/glu.h> #include <iostream>  using namespace Eigen; class GLCamera { public:     GLCamera();     GLCamera(const Vector3d& pos, const Vector3d& target, const Vector3d& up);     void setModelViewMatrix();     void setShape(float viewAngle,float aspect,float Near,float Far);     void slide(float du, float dv, float dn);     void roll(float angle);     void yaw(float angle);     void pitch(float angle);     float getDist();  private:     Vector3d m_pos;     Vector3d m_target;     Vector3d m_up;     Vector3d u,v,n;  };  #endif // GLCAMERA_H

setModelViewMatrix:加載將當(dāng)前MV矩陣。

setShape:設(shè)置攝像機(jī)的視角。

roll,yaw,pitch相當(dāng)于繞N,V,U軸的旋轉(zhuǎn),如下圖:

OpenGL進(jìn)階(十四) - UVN Camera實(shí)現(xiàn)

下面是相機(jī)的實(shí)現(xiàn):

#include "glcamera.h"  GLCamera::GLCamera() {  }  GLCamera::GLCamera(const Vector3d &pos, const Vector3d &target, const Vector3d &up) {     m_pos = pos;     m_target = target;     m_up = up;     n = Vector3d( pos.x()-target.x(), pos.y()-target.y(), pos.z()-target.z());     u = Vector3d(up.cross(n).x(), up.cross(n).y(), up.cross(n).z());     v = Vector3d(n.cross(u).x(),n.cross(u).y(),n.cross(u).z());       n.normalize();     u.normalize();     v.normalize();      setModelViewMatrix(); }  void GLCamera::setModelViewMatrix() {     double m[16];     m[0]=u.x(); m[4]=u.y(); m[8]=u.z(); m[12]=-m_pos.dot(u);     m[1]=v.x(); m[5]=v.y(); m[9]=v.z(); m[13]=-m_pos.dot(v);     m[2]=n.x(); m[6]=n.y(); m[10]=n.z(); m[14]=-m_pos.dot(n);     m[3]=0;  m[7]=0;  m[11]=0;  m[15]=1.0;     glMatrixMode(GL_MODELVIEW);     glLoadMatrixd(m);     //用M矩陣替換原視點(diǎn)矩陣 }  void  GLCamera::setShape(float viewAngle, float aspect, float Near, float Far) {     glMatrixMode(GL_PROJECTION);     glLoadIdentity();                                   //設(shè)置當(dāng)前矩陣模式為投影矩陣并歸一化     gluPerspective(viewAngle,aspect, Near, Far);        //對(duì)投影矩陣進(jìn)行透視變換 }  void GLCamera::slide(float du, float dv, float dn) {     //std::cout<<"u.x:"<<u.x()<<std::endl;     m_pos(0) = m_pos(0) + du*u.x()+dv*v.x()+dn*n.x();     m_pos(1) = m_pos(1) + du*u.y() +dv*v.y()+dn*n.y();     m_pos(2) = m_pos(2) + du*u.z()+dv*v.z()+dn*n.z();     m_target(0) = m_target(0)+du*u.x()+dv*v.x()+dn*n.x();     m_target(1) = m_target(0)+du*u.y()+dv*v.y()+dn*n.y();     m_target(2) = m_target(0)+du*u.z()+dv*v.z()+dn*n.z();     setModelViewMatrix(); }  void GLCamera::roll(float angle) {     float cs=cos(angle*3.14159265/180);     float sn=sin(angle*3.14159265/180);     Vector3d t(u);     Vector3d s(v);     u.x() = cs*t.x()-sn*s.x();     u.y() = cs*t.y()-sn*s.y();     u.z() = cs*t.z()-sn*s.z();      v.x() = sn*t.x()+cs*s.x();     v.y() = sn*t.y()+cs*s.y();     v.z() = sn*t.z()+cs*s.z();      setModelViewMatrix();          //每次計(jì)算完坐標(biāo)軸變化后調(diào)用此函數(shù)更新視點(diǎn)矩陣 }  void GLCamera::pitch(float angle) {     float cs=cos(angle*3.14159265/180);     float sn=sin(angle*3.14159265/180);     Vector3d t(v);     Vector3d s(n);      v.x() = cs*t.x()-sn*s.x();     v.y() = cs*t.y()-sn*s.y();     v.z() = cs*t.z()-sn*s.z();      n.x() = sn*t.x()+cs*s.x();     n.y() = sn*t.y()+cs*s.y();     n.z() = sn*t.z()+cs*s.z();       setModelViewMatrix(); }  void GLCamera::yaw(float angle) {     float cs=cos(angle*3.14159265/180);     float sn=sin(angle*3.14159265/180);     Vector3d t(n);     Vector3d s(u);      n.x() = cs*t.x()-sn*s.x();     n.y() = cs*t.y()-sn*s.y();     n.z() = cs*t.z()-sn*s.z();      u.x() = sn*t.x()+cs*s.x();     u.y() = sn*t.y()+cs*s.y();     u.z() = sn*t.z()+cs*s.z();      setModelViewMatrix(); }  float  GLCamera::getDist() {     float dist = pow(m_pos.x(),2)+pow(m_pos.y(),2)+pow(m_pos.z(),2);     return pow(dist,0.5); }


沒(méi)什么好說(shuō)的,都是矩陣的一些計(jì)算。

這樣就可以將你的攝像機(jī)融入到OpenGL工程中了,比如說(shuō)放進(jìn)一個(gè)Qt的工程,用一個(gè)GLWifget類來(lái)顯示OpenGL。

在initializeGL() 中,初始化camera

  Vector3d pos(0.0, 0.0, 12.0);     Vector3d target(0.0, 0.0, 0.0);     Vector3d up(0.0, 1.0, 0.0);     camera = new GLCamera(pos, target, up);

在paintGL的時(shí)候,設(shè)置當(dāng)前矩陣:

 glLoadIdentity();     camera->setModelViewMatrix();

在resizeGL中調(diào)整視角:

camera->setShape(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);

添加相應(yīng)的鼠標(biāo)事件:

void GLWidget::mousePressEvent(QMouseEvent *event) {     lastPos = event->pos(); }  void GLWidget::mouseMoveEvent(QMouseEvent *event) {     int dx = event->x() - lastPos.x();     int dy = event->y() - lastPos.y();     if (event->buttons() & Qt::LeftButton)     {         RotateX(dx);         RotateY(dy);     }     else if(event->buttons() & Qt::RightButton)     {         camera->roll(dx);         //camera->pitch(dy);         //camera->slide(0,0,-dy);     }     else if(event->buttons() & Qt::MiddleButton)     {         camera->slide(-dx,dy,0);     }     lastPos = event->pos();     updateGL(); }  void GLWidget::RotateX(float angle) {     float d=camera->getDist();     int cnt=100;     float theta=angle/cnt;     float slide_d=-2*d*sin(theta*3.14159265/360);     camera->yaw(theta/2);     for(;cnt!=0;--cnt)     {         camera->slide(slide_d,0,0);         camera->yaw(theta);     }     camera->yaw(-theta/2); }  void GLWidget::RotateY(float angle) {     float d = camera->getDist();     int cnt=100;     float theta=angle/cnt;     float slide_d=2*d*sin(theta*3.14159265/360);     camera->pitch(theta/2);     for(;cnt!=0;--cnt)     {         camera->slide(0,slide_d,0);         camera->pitch(theta);     }     camera->pitch(-theta/2); }

效果就像這樣(gif 有點(diǎn)大,耐心等待):

OpenGL進(jìn)階(十四) - UVN Camera實(shí)現(xiàn)

參考

openGL中camera類的設(shè)計(jì)以及使用 - http://blog.csdn.net/hobbit1988/article/details/7956838

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前名稱:OpenGL進(jìn)階(十四)-UVNCamera實(shí)現(xiàn)-創(chuàng)新互聯(lián)
新聞來(lái)源:http://aaarwkj.com/article44/cdhjhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站導(dǎo)航、自適應(yīng)網(wǎng)站網(wǎng)站設(shè)計(jì)公司、微信公眾號(hào)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
人妻内射一区二区在线视| 国产精品中文一区二区三区| 国产午夜男人天堂手机| 国产一区二区毛多内射| 国产三级国产精品国产国在线观看| 久久亚洲一区二区内射| 免费啪啪视频一区二区| 亚洲男人天堂在线播放| 日韩一区二区人妻在线| 夫妻性生活黄色录像视频| 亚洲精品在线播放av| 人人妻人人澡人人爽久久av| 国产三级精品三级在线播放| 一区二区少妇黄色三区| 亚洲女人下体毛茸茸视频| 日本韩国黄色三级三级| 麻豆视传媒短视频网站| 人妻中出中文字幕一区二区| 亚洲精品丝袜成人偷拍| 国语对白刺激真实精品| 日本激情人妻一区二区| 亚洲乱色熟女一区二区三区麻豆| 亚洲免费观看视频一区二区三区 | 黄色av链接在线观看| 日本中文字幕在线播放一区| 国产三级三级三级精品8ⅰ区| 日韩精品精美视频在线观看| 精品亚洲一区二区三区| 国产av一级二级三级最新精品| 九九热这里只有免费精品| 在线中文字幕日韩有码| 日韩欧美亚洲综合久久精品| 免费人成网站视频在线观看不卡 | 日韩av一区二区在线| 亚洲日本成人av在线观看| 国产99热这里只有精品| av天堂男人站在线观看| 粉嫩极品美女国产精品| 国产成人拍国产亚洲精品| 91免费观看视频高清| 日本人妻免费在线观看|