




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.ogre中摄像机的一些相关函数/创建摄像机/sceneManager是一个已经存在的场景管理器实例的指针。/我们在这里构建名称为“MainCam”的摄像机。Camera *camera = sceneMgr->createCamera(“MainCam”);/并不需要计算什么,可以直接从视口中得到这个尺寸 这里现实视口比例是4:3camera->setAspectRatio(1.333333f);/30度角可以让我们看到一个长而远的视野 camera->setFOVy(30.0f); /图上W是这里的角度camera->setNearClipDistance(5.0f
2、); /摄像机到平面xy的距离camera->setFarClipDistance(1000.0f);/摄像机到平面x'y'的距离/设置渲染模式 下面分别对应点线 点 实体渲染camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonMode mode = camera->getPolygonMode(); /这个不用讲了/摄像机的位置变换/确认我们已经有一个指向“Camera”类型实例
3、的指针camera。camera->setPosition(200, 10, 200);/也可以用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些/camera->setPosition(Vector3(200, 10, 200);/假设摄像机还在我们之前设置的200, 10, 200空间位置上。camera->move(10, 0, 0); /摄像机移动到210, 10, 200camera->moveRelative(0, 0, 10); /摄像机移动到210, 10, 210/move ,moveRelative与 setPosition的区别
4、 /setPosition设置摄像机的绝对坐标 move和moveRelative是把摄像机移动到当前位置的相对位置上/moveRelative与move的区别 前者是在摄像机的本地坐标移动 假设摄像机像右旋转90度 在向前移动10/个单位,那么本地坐标是向Z方向移动10 而世界坐标是像X方向移动10个单位/指向,方向,LookAtvoid setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);Vector3 getDirection(void) const; Vector3 getUp(v
5、oid) const;Vector3 getRight(void) const;void lookAt( const Vector3& angle);void lookAt(Real x, Real y, Real z);void roll(const Radian& angle); /滚动绕Z轴 右手法则 旋转 即逆时针void roll (Real degrees)roll (Angle ( degrees ) );void yaw(const Radian& angle); /偏航绕Y轴void yaw(Real degrees)yaw (Angle ( degr
6、ees ) );void pitch(const Radian& angle); /倾斜绕X轴void pitch(Real degrees)yaw (Angle ( degrees ) );void rotate(const Vector3& axis, const Radian& angle);void rotate(const Vector3& axis, Real degrees)rotate(axis, Angle(degrees);void setFixedYawAxis (bool useFixed, const Vector3 &fixe
7、dAxis=Vector3:UNIT_Y) /设置Y轴自由度 不能绕Y轴旋转 const Quaternion & getOrientation (void) const void setOrientation(const Quaternion& q);/自动跟踪/*方法中第一个参数确定是否打开自动跟踪,在任何一帧渲染之前都可以重新设置它。并且需要注意在关掉自动跟踪之前,要确保所被跟踪的节点没有被删除(否则系统会抛出异常)。方法的第二个参数是被跟踪节点得指针,除非你第一个参数是false(这时候可以用NULL),否则你必须确定调用的时候指针指向的节点必须有效。有时候你可能发现你
8、所要跟踪的物体太大了,以至于你都不知道“看”哪里才好,这时候你可以设置第三个参数来定着眼点,它是一个本地空间中相对于场景节点的定位点。*/void setAutoTracking(bool enabled,SceneNode *target=0,const Vector3 &offset=Vector3:ZERO);/得到摄像机相关信息const Quaternion& getDerivedOrientation(void) const;const Vector3& getDerivedPosition(void) const;Vector3 getDerivedDir
9、ection(void) const;Vector3 getDerivedUp(void) const;Vector3 getDerivedRight(void) const;const Quaternion& getRealOrientation(void) const;const Vector3& getRealPosition(void) const;Vector3 getRealDirection(void) const;Vector3 getRealUp(void) const;Vector3 getRealRight(void) const;
10、 /* 其中有“Real”关键字的方法返回的是世界空间的坐标,而拥有“Derived”关键字的方法的返回值是在“轴绑定”的本地坐标系中(也就是说这个坐标系原点是摄像机所在的点,而它的轴向和世界坐标系相同)。*/Ogre摄像机Camera类 收藏 Camera类 对摄象机的抽象。成员函数说明如下: 标准构造函数Camera(String name, SceneManager* sm);标准析构函数virtual Camera();返回渲染该摄像机的scenemanager的指针SceneManager* getSceneManager(void) const;取得摄像机的
11、名字virtual const String& getName(void) const;设定投影模式(正射或透视),缺省为透视void setProjectionType(ProjectionType pt);取得使用的投影模式的信息ProjectionType getProjectionType(void) const;设定该摄像机需要的渲染细节级别void setDetailLevel(SceneDetailLevel sd);取得该摄像机的渲染细节级别SceneDetailLevel getDetailLevel(void) const;设定摄像机的位置void setPosit
12、ion(Real x, Real y, Real z);void setPosition(const Vector3& vec);取得摄像机的位置const Vector3& getPosition(void) const;移动摄像机void move(const Vector3& vec);void moveRelative(const Vector3& vec);设定摄像机的方向向量void setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);取得摄像机
13、的方向Vector3 getDirection(void) const;这是一个辅助方法用来自动计算摄像机的方向向量,在当前位置和所看的点,参数targetPoint是一个向量指明所看的点。void lookAt( const Vector3& targetPoint );void lookAt(Real x, Real y, Real z);将摄像机绕z轴逆时针旋转指定角度void roll(Real degrees);绕y轴逆时针旋转指定角度void yaw(Real degrees);绕x轴上下逆时针旋转void pitch(Real degrees);旋转任意角度void ro
14、tate(const Vector3& axis, Real degrees);使用四元组绕任意轴旋转void rotate(const Quaternion& q);指定摄像机是绕本地y轴还是指定的固定轴旋转void setFixedYawAxis( bool useFixed, const Vector3& fixedAxis = Vector3:UNIT_Y );设定y方向的视野域,水平方向的视野域将依此计算void setFOVy(Real fovy);取得y方向的视野域Real getFOVy(void) const;设定到近裁减面的距离void setNea
15、rClipDistance(Real nearDist);取得到近裁减面的距离Real getNearClipDistance(void) const;设定到远裁减面的距离void setAspectRatio(Real ratio);取得当前纵横比Real getAspectRatio(void) const;内部使用,取得该摄像机的投影矩阵const Matrix4& getProjectionMatrix(void);内部使用,取得该摄像机的观察矩阵const Matrix4& getViewMatrix(void);取得平截台体的特定面const Plane&
16、getFrustumPlane( FrustumPlane plane );测试给定的包容器是否在平截台体中bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0);bool isVisible(const Sphere& bound, FrustumPlane* culledBy = 0);测试给定的顶点是否在平截台体中bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0);返回摄像机的当前方向const Qua
17、ternion& getOrientation(void) const;设定摄像机的方向void setOrientation(const Quaternion& q);输出流功能friend std:ostream& operator<<(std:ostream& o, Camera& c);取得摄像机继承的方向,包括从附着节点继承的任何旋转Quaternion getDerivedOrientation(void);取得继承的位置,包括从附着节点继承的任何平移Vector3 getDerivedPosition(void);取得继承的方向
18、向量Vector3 getDerivedDirection(void);覆盖MovableObject的方法void _notifyCurrentCamera(Camera* cam);const AxisAlignedBox& getBoundingBox(void) const;void _updateRenderQueue(RenderQueue* queue);const String getMovableType(void) const; 使能/使不能自动跟踪scenenodevoid setAutoTracking(bool enabled, SceneNode* targ
19、et = 0, const Vector3& offset = Vector3:ZERO);摄象机 OGRE中的摄象机支持透视投影(缺省投影方式、近大远小)和正射投影(大小与距离无关,是CAD设计中的常用投影方式)。摄象机还支持线画模式、纹理模式、灰度阴影模式等几种渲染模式。OGRE场景中可以有多台摄象机,可以将摄象机“看到”的结果渲染到多个窗口,甚至还能实现分屏和画中画功能。OGRE中的摄象机可以独立于场景节点树(摄象机本身也具有位置、旋转属性及控制方法),也可以被attach到场景节点上,通过对场景节点的控制来达到对摄象机的控制。Camera类 对摄象机的抽象。成员函数说明如下:
20、标准构造函数Camera(String name, SceneManager* sm);标准析构函数virtual Camera();返回渲染该摄像机的scenemanager的指针SceneManager* getSceneManager(void) const;取得摄像机的名字virtual const String& getName(void) const;设定投影模式(正射或透视),缺省为透视void setProjectionType(ProjectionType pt);取得使用的投影模式的信息ProjectionType getProjectionType(void) c
21、onst;设定该摄像机需要的渲染细节级别void setDetailLevel(SceneDetailLevel sd);取得该摄像机的渲染细节级别SceneDetailLevel getDetailLevel(void) const;设定摄像机的位置void setPosition(Real x, Real y, Real z);void setPosition(const Vector3& vec);取得摄像机的位置const Vector3& getPosition(void) const;移动摄像机void move(const Vector3& vec);vo
22、id moveRelative(const Vector3& vec);设定摄像机的方向向量void setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);取得摄像机的方向Vector3 getDirection(void) const;这是一个辅助方法用来自动计算摄像机的方向向量,在当前位置和所看的点,参数targetPoint是一个向量指明所看的点。void lookAt( const Vector3& targetPoint );void lookAt(Real x,
23、Real y, Real z);将摄像机绕z轴逆时针旋转指定角度void roll(Real degrees);绕y轴逆时针旋转指定角度void yaw(Real degrees);绕x轴上下逆时针旋转void pitch(Real degrees);旋转任意角度void rotate(const Vector3& axis, Real degrees);使用四元组绕任意轴旋转void rotate(const Quaternion& q);指定摄像机是绕本地y轴还是指定的固定轴旋转void setFixedYawAxis( bool useFixed, const Vecto
24、r3& fixedAxis = Vector3:UNIT_Y );设定y方向的视野域,水平方向的视野域将依此计算void setFOVy(Real fovy);取得y方向的视野域Real getFOVy(void) const;设定到近裁减面的距离void setNearClipDistance(Real nearDist);取得到近裁减面的距离Real getNearClipDistance(void) const;设定到远裁减面的距离void setAspectRatio(Real ratio);取得当前纵横比Real getAspectRatio(void) const;内部使用
25、,取得该摄像机的投影矩阵const Matrix4& getProjectionMatrix(void);内部使用,取得该摄像机的观察矩阵const Matrix4& getViewMatrix(void);取得平截台体的特定面const Plane& getFrustumPlane( FrustumPlane plane );测试给定的包容器是否在平截台体中bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0);bool isVisible(const Sphere&
26、; bound, FrustumPlane* culledBy = 0);测试给定的顶点是否在平截台体中bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0);返回摄像机的当前方向const Quaternion& getOrientation(void) const;设定摄像机的方向void setOrientation(const Quaternion& q);输出流功能friend std:ostream& operator<<(std:ostream& o, Ca
27、mera& c);取得摄像机继承的方向,包括从附着节点继承的任何旋转Quaternion getDerivedOrientation(void);取得继承的位置,包括从附着节点继承的任何平移Vector3 getDerivedPosition(void);取得继承的方向向量Vector3 getDerivedDirection(void);覆盖MovableObject的方法void _notifyCurrentCamera(Camera* cam);const AxisAlignedBox& getBoundingBox(void) const;void _updateRen
28、derQueue(RenderQueue* queue);const String getMovableType(void) const;使能/使不能自动跟踪scenenodevoid setAutoTracking(bool enabled, SceneNode* target = 0, const Vector3& offset = Vector3:ZERO); Camera使用举例一 打开OGRE提供的Demo_EnvMapping那个例子程序,运行之。对于这个例子我们应该很熟悉了,通过键盘和鼠标可以控制摄象机在场景中漫游,那么摄象机的创建代码在哪里呢?从EnvMapping.h
29、和EnvMapping.cpp中都找不到创建摄象机的代码!不要忘了我们是基于OGRE的应用框架建立的这个例子,在OGRE应用框架的ExampleApplication.h里为我们创建了摄象机,打开ExampleApplication.h文件可以发现如下函数:virtual void createCamera(void) / 创建摄象机 mCamera = mSceneMgr->createCamera("PlayerCam"); / 将该摄象机放到0,0,500位置上 mCamera->setPosition(Vector3(0,0,500); / 让摄象机“看
30、”向Z轴负方向(从屏幕外向屏幕里)以模拟你的眼睛 mCamera->lookAt(Vector3(0,0,-300); / 设置摄象机平截台体的“近面”距离mCamera->setNearClipDistance(5);每一个通过OGRE应用框架创建的应用程序都会拥有一个通过ExampleApplication类的createCamera函数创建出来的摄象机,该摄象机站在0,0,500位置上看向场景中心。摄象机的创建代码有了,那通过鼠标和键盘控制摄象机在场景中漫游的代码在哪里呢?在OGRE应用框架中ExampleFrameListener类的frameStarted函数里。该函数又
31、调用processUnbufferedInput函数,我们可以在processUnbufferedInput函数中发现如下代码:mInputDevice->capture();(省略若干行)mCamera->yaw(rotX);mCamera->pitch(rotY);mCamera->moveRelative(vec);首先获取鼠标状态,而后根据该状态计算摄象机的旋转和移动量,最后通过Camera的几个控制方法控制其运动。注意到这里的摄象机是独立于场景节点树之外的。我们已经了解到场景节点树上可以挂接Entity、摄象机和光。通过对场景节点的空间位置控制可以达到改变其下
32、挂接的Entity、摄象机和光的位置的目的。但注意Entity和摄象机不一样。在OGRE引擎的设计中Entity是完全没有移动、旋转等能力的,所以它只能把这些任务交给场景节点来完成,而摄象机具有移动和旋转函数,所以它并不一定要完全靠场景节点来完成这些任务。这就引出一个有趣的话题,摄象机放到场景节点中和不放进去的区别究竟有多大。一般来讲,摄象机如果不放在场景节点中,它就非常自由,程序员可以用程序任意控制它,就象在这个例子中一样。想象一下在CS中,你牺牲后,你依然可以控制你的眼睛(灵魂?摄象机?)在场景中穿墙过屋,并为同伴通风报信,就可以体会到这种自由。而如果把摄象机挂接到场景节点中,那么摄象机就
33、和此节点和同在本节点下的其它Entity绑在一起了,一般在这种情况下就不再直接操作摄象机移动位置,而是和Entity一样交给场景节点来做。墙上来回转动的监视器就是由挂接在同一节点下的Entity(监视器模型)和摄象机组成的。还有场景中的人,他们的身体(Entity)和眼睛(Camera)总是在一起,就因为他们同属于一个场景节点。 “人”的组织方法一 “人”的组织方法二以上两图都将Camera放到了节点下,都可以实现身体和眼睛的同步。但第一种方法更好,因为第二种方法眼睛和身体同属于一个场景节点,它们之间无法实现相对位移,那么眼睛就可能会长在人的肚子里(节点的空间中心)。将摄象机放到场景节点树中的
34、做法使用也很普遍,下一个例子里我们将看到这样的情况。Camera使用举例二思路 实现如下的场景节点树: 在该节点树中有一个食人魔、一个机器人和一架飞机。通过FrameListener来控制这三个Player都在自动旋转。通过按TAB键把Camera轮流挂接到三个Player所在的节点上,这样我们就会发现屏幕上会出现不同Player的以各自的视角所看到的世界。为了便于对Player的控制,程序中使用一个std:map来保存Player列表,该列表中保存每个Player的所属节点名称和节点指针。部分代码/ myExample.h/ 定义PlayerListtypedef std:map<st
35、d:string,SceneNode*> PlayerList;/ 由应用框架中的ExampleFrameListener派生出myFrameListenerclass myFrameListener : public ExampleFrameListenerprotected: / 接收myapp传过来的Player列表,以在这里控制其旋转PlayerList *mPlayerList; / 保存当前Player的迭代子PlayerList:iterator currentPlayer;public: myFrameListener(RenderWindow* win, Camera*
36、 cam, PlayerList *pPlayerList) : ExampleFrameListener(win, cam) mPlayerList = pPlayerList; / 缺省Player是列表中的第一人 currentPlayer = mPlayerList->begin(); / 将摄象机挂接到该Player所在的场景节点currentPlayer->second->attachCamera(mCamera); bool frameStarted(const FrameEvent& evt) / 对TAB键的反应 if (mInputDevice-&
37、gt;isKeyDown(KC_TAB) / 把摄象机从当前Player上卸下来 currentPlayer->second->detachObject(mCamera->getName(); / 切换当前PlayercurrentPlayer+; if(currentPlayer = mPlayerList->end() currentPlayer = mPlayerList->begin(); / 再把摄象机挂接到当前Player上来。 currentPlayer->second->attachObject(mCamera); / 让不同Playe
38、r以不同的速度旋转 mPlayerList->find("Robot")->second->yaw(evt.timeSinceLastFrame * 30); mPlayerList->find("Head")->second->yaw(evt.timeSinceLastFrame * -60); mPlayerList->find("Razor")->second->yaw(evt.timeSinceLastFrame * 120); / 调用基类的frameStarted函数
39、return ExampleFrameListener:frameStarted(evt); ;/ 由应用框架的ExampleApplication派生出myAppclass myApp :public ExampleApplicationpublic: myApp()protected: / Player列表 PlayerList mPlayerList; / 创建场景 void createScene(void) SceneNode *pNodeRobot,*pNodeHead,*pNodeRazor; / 设置环境光 mSceneMgr->setAmbientLight(Colou
40、rValue(1, 1, 1); / 创建天空盒 mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 50 ); / 以下代码创建场景树 / Create Robot Entity and attach it to a SceneNode pNodeRobot = mSceneMgr->getRootSceneNode()->createChild("Robot"); Entity *pEntityRobot = mSceneMgr->createEntity("Robo
41、t", "Robot.mesh"); pNodeRobot->attachObject(pEntityRobot); mPlayerList.insert(PlayerList:value_type(pNodeRobot->getName(),pNodeRobot); / Create OGREHead Entity and attach it to a SceneNode pNodeHead = mSceneMgr->getRootSceneNode()->createChild("Head"); pNodeHead-
42、>translate(200,0,0); Entity *pEntityHead = mSceneMgr->createEntity("Head", "ogrehead.mesh"); pNodeHead->attachObject(pEntityHead); mPlayerList.insert(PlayerList:value_type(pNodeHead->getName(),pNodeHead); / Create OGREHead Entity and attach it to a SceneNode pNodeRazo
43、r = mSceneMgr->getRootSceneNode()->createChild("Razor"); pNodeRazor->translate(-200,0,0); / Create head1 entity and attach it to pNodeHead1 Entity *pEntityRazor = mSceneMgr->createEntity("Razor", "Razor.mesh"); pNodeRazor->attachObject(pEntityRazor); mPla
44、yerList.insert(PlayerList:value_type(pNodeRazor->getName(),pNodeRazor); /创建myFrameListener void createFrameListener(void) mFrameListener= new myFrameListener(mWindow, mCamera, &mPlayerList); mRoot->addFrameListener(mFrameListener); / 重新实现基类的createCamera函数,关键是让摄象机与其所在场景节点的相对位置为0,100,0。即高100
45、个长度单位,防止摄象机在Entity的肚子里出现。 virtual void createCamera(void) / Create the camera mCamera = mSceneMgr->createCamera("PlayerCam"); / 设置摄象机位置 /mCamera->setPosition(Vector3(0,0,500); mCamera->setPosition(Vector3(0,100,0); / Look back along -Z mCamera->lookAt(Vector3(0,0,-300); mCamera
46、->setNearClipDistance(5); ; 为了让例子简单一点,这里采用的是前面讲的第二种眼睛与身体的组合方法,摄象机与Entity的相对位置是靠摄象机的setPosition函数完成的,这样做并不是一个很好的方法。建议大家将本例改为前面讲的第一种眼睛与身体的组合方法,将摄象机与Entity的相对位置关系交给场景节点去做,那样摄象机的位置就可以设置为0,0,0。 事情还没有结束,因为摄象机是属于Player的了,我们就不能让键盘再控制摄象机将他移出身体以外,所以需要更改ExampleFrameListener.h中frameStarted函数的代码,因为ExampleFram
47、eListener.h是OGRE应用框架的一部分,所以请注意copy该文件,再更改。 找到frameStarted函数中的如下代码: mCamera->yaw(rotX); mCamera->pitch(rotY); mCamera->moveRelative(vec); 将最后一行注释掉,即可以让摄象机可以受鼠标控制旋转(东张西望?),但不能移动。光本文来自CSDN博客,转载请标明出处:NxOgre缓冲摄像机(及摄像机抖动解决办法) 收藏 重新对摄像机进行了封装,增加了缓冲功能,使赛车的操作真实感提升了不少,关于缓冲摄像机可以参考Ogre wiki上的第三人称摄像机那篇文章
48、其原理是: 使用两个SceneNode, 一个绑定摄像机,另一个用来绑定代表赛车的节点, 赛车移动的时候摄像机的位置始终以一定速度向赛车节点靠近,这个速度跟摄像机与赛车子节点的全局坐标距离成正比.并不断跟新两节点位置.关于摄像机更新抖动的问题,NxOgre和Ogre使用两个不同的FrameListener来更新场景,可能会使帧更新一致,我的解决办法是在创建NxOgre:Scene的时候将mProcessingPriority = xOgre:Enums:Priority_Low设置成最低优先级,即不对场景进行处理(默认情况下为Priority_Medium),之后再手动更新场景mScene-&
49、gt;advance(timeSinceLastFrame * 0.015, NxOgre:Enums:Priority_Low); /创建场景,并设置场景基本属性NxOgre:SceneDescription desc;/设置重力desc.mGravity = NxOgre:Vec3(0.0f, -9.8f, 0.0f);desc.mName = "Racing World"/*注:(mProcessingPriority参数默认为中等)设置不更新场景,保持与Ogre渲染同步,避免摄像机抖动现象并在update调用mScene->advance(timeSinceL
50、astFrame * 0.075, NxOgre:Enums:Priority_Low);*/desc.mProcessingPriority = NxOgre:Enums:Priority_Low;mScene = mWorld->createScene(desc);摄像机的封装#ifndef _VEHICLECAMERA_H_#define _VEHICLECAMERA_H_#include <Ogre.h>#include <string>#include "Util.h"/*赛车缓冲摄像机原理:使用两个SceneNode, 一个绑定摄像
51、机,另一个用来绑定代表赛车的节点, 赛车移动的时候摄像机的位置始终以一定速度向赛车节点靠近,这个速度跟摄像机与赛车子节点的全局坐标距离成正比.并不断跟新两节点位置.例如: 在这里每20帧跟新一次两节点坐标(与赛车同步),并更新节点相对位置./ 根据当前赛车速度和帧数来设定缓冲大小if (isBoundingCamera() float speed = getSpeed() / 30; / 提供刹车时的缓冲 if (speed < 1.0f) speed = 1.0f; / 时时跟新摄像机, mVehicleCamer->update(timeSinceLastFrame * spe
52、ed) ;*/class VehicleCamerapublic: VehicleCamera(const std:string &playerName); VehicleCamera(); / 设置摄像机缓冲程度值越大越硬,越小越柔和 void setTightness ( Real tightness ); float getTightness ( ) const; / 设定绑定节点, cameraNode为赛车上摄像机位置的节点, lookAtNode为赛车上车体的节点 void setTarget ( Ogre:SceneNode*cameraNode, Ogre:SceneN
53、ode* lookAtNode ); / 手动更新节点位置, 与赛车同步 void instantUpdate ( ); void update ( float timeSinceLastFrame );private: Ogre:SceneNode *mBaseCamerNode; Ogre:SceneNode *mBaseLookedAtNode; Ogre:SceneNode *mCameraLookAtNode; Ogre:SceneNode *mCameraNode; Ogre:Camera *mCamera; / 设置摄像机缓冲程度值越大越硬,越小越柔和 float mTightn
54、ess;#endif实现:#include "VehicleCamera.h"VehicleCamera:VehicleCamera(const std:string &playerName) : mTightness(2.0), mCameraNode(0), mCameraLookAtNode(0), mBaseLookedAtNode(0), mBaseCamerNode(0) Ogre:SceneManager* sceneMgr = Util:getSceneManager(); mCamera = Util:getSceneManager()->c
55、reateCamera( playerName + "VehicleCamera"); mCamera->setNearClipDistance ( 0.1f ); Util:removeAllViewports(); Ogre:Viewport*viewport = Util:addViewport(mCamera); mCamera->setAspectRatio(Real(viewport->getActualWidth() / Real(viewport->getActualHeight(); / 构造绑定摄像机的节点 mCameraNode = sceneMgr->getRootSceneNode()->createChil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030摄影器材行业市场深度调研及发展趋势与投资战略研究报告
- 2025-2030指甲剪行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030护肤面霜产业行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030手机行业风险投资发展分析及投资融资策略研究报告
- 2025-2030手持式水分分析仪行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030开槽刀片行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025-2030度假行业风险投资发展分析及运作模式与投融资研究报告
- 2025-2030广告策划产业政府战略管理与区域发展战略研究咨询报告
- 小学英语试卷题型反馈
- 2025-2030富硒农产品行业市场发展分析及投资前景研究报告
- GB/T 26480-2011阀门的检验和试验
- 案例:收球器盲板伤人事故
- 《员工思想培训》课件
- 网络主题 大锁孙天宇小品《时间都去哪儿了》台词
- 精神科症状学演示课件
- 文学类文本聂志红《在那桃花盛开的地方》阅读练习与答案
- DB13T 5080-2019 SBS改性沥青生产过程动态质量监控规范
- 义务教育物理课程标准(2022年版word版)
- 《CSS样式表的使用》教学设计
- 外环长安大道、东方大道段天然气管道工程管道试压吹扫方案资料(共13页)
- 中国花鸟画简史-共60页PPT课件
评论
0/150
提交评论