中摄像机函数汇总.docx
- 文档编号:12740240
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:59
- 大小:68.28KB
中摄像机函数汇总.docx
《中摄像机函数汇总.docx》由会员分享,可在线阅读,更多相关《中摄像机函数汇总.docx(59页珍藏版)》请在冰点文库上搜索。
中摄像机函数汇总
中摄像机函数汇总
ogre中摄像机的一些相关函数
//创建摄像机
//sceneManager是一个已经存在的场景管理器实例的指针。
//我们在这里构建名称为“MainCam”的摄像机。
Camera*camera=sceneMgr->createCamera(“MainCam”);
//并不需要计算什么,可以直接从视口中得到这个尺寸这里现实视口比例是4:
3
camera->setAspectRatio(1.333333f);
//30度角可以让我们看到一个长而远的视野
camera->setFOVy(30.0f);//图上W是这里的角度
camera->setNearClipDistance(5.0f);//摄像机到平面xy的距离
camera->setFarClipDistance(1000.0f);//摄像机到平面x'y'的距离
//设置渲染模式下面分别对应点线点实体渲染
camera->setPolygonMode(PM_WIREFRAME);
camera->setPolygonMode(PM_POINTS);
camera->setPolygonMode(PM_SOLOD);
PolygonModemode=camera->getPolygonMode();//这个不用讲了
//摄像机的位置变换
//确认我们已经有一个指向“Camera”类型实例的指针camera。
camera->setPosition(200,10,200);
//也可以用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些
//camera->setPosition(Vector3(200,10,200));
//假设摄像机还在我们之前设置的200,10,200空间位置上。
camera->move(10,0,0);//摄像机移动到210,10,200
camera->moveRelative(0,0,10);//摄像机移动到210,10,210
//move,moveRelative与setPosition的区别
//setPosition设置摄像机的绝对坐标move和moveRelative是把摄像机移动到当前位置的相对位置上
//moveRelative与move的区别前者是在摄像机的本地坐标移动假设摄像机像右旋转90度在向前移动10
//个单位,那么本地坐标是向Z方向移动10而世界坐标是像X方向移动10个单位
//指向,方向,LookAt
voidsetDirection(Realx,Realy,Realz);
voidsetDirection(constVector3&vec);
Vector3getDirection(void)const;
Vector3getUp(void)const;
Vector3getRight(void)const;
voidlookAt(constVector3&angle);
voidlookAt(Realx,Realy,Realz);
voidroll(constRadian&angle);//滚动绕Z轴右手法则旋转即逆时针
voidroll(Realdegrees){roll(Angle(degrees));}
voidyaw(constRadian&angle);//偏航绕Y轴
voidyaw(Realdegrees){yaw(Angle(degrees));}
voidpitch(constRadian&angle);//倾斜绕X轴
voidpitch(Realdegrees){yaw(Angle(degrees));}
voidrotate(constVector3&axis,constRadian&angle);
voidrotate(constVector3&axis,Realdegrees){
rotate(axis,Angle(degrees));}
voidsetFixedYawAxis(booluseFixed,constVector3&fixedAxis=Vector3:
:
UNIT_Y)
//设置Y轴自由度不能绕Y轴旋转
constQuaternion&getOrientation(void)const
voidsetOrientation(constQuaternion&q);
//自动跟踪
/*方法中第一个参数确定是否打开自动跟踪,在任何一帧渲染之前都可以重新设置它。
并且需要注意在关掉自动跟踪之前,要确保所被跟踪的节点没有被删除(否则系统会抛出异常)。
方法的第二个参数是被跟踪节点得指针,除非你第一个参数是false(这时候可以用NULL),否则你必须确定调用的时候指针指向的节点必须有效。
有时候你可能发现你所要跟踪的物体太大了,以至于你都不知道“看”哪里才好,这时候你可以设置第三个参数来定着眼点,它是一个本地空间中相对于场景节点的定位点。
*/
voidsetAutoTracking(boolenabled,SceneNode*target=0,constVector3&offset=Vector3:
:
ZERO);
//得到摄像机相关信息
constQuaternion&getDerivedOrientation(void)const;
constVector3&getDerivedPosition(void)const;
Vector3getDerivedDirection(void)const;
Vector3getDerivedUp(void)const;
Vector3getDerivedRight(void)const;
constQuaternion&getRealOrientation(void)const;
constVector3&getRealPosition(void)const;
Vector3getRealDirection(void)const;
Vector3getRealUp(void)const;
Vector3getRealRight(void)const;
/*其中有“Real”关键字的方法返回的是世界空间的坐标,而拥有“Derived”关键字的方法的返回值是在“轴绑定”的本地坐标系中(也就是说这个坐标系原点是摄像机所在的点,而它的轴向和世界坐标系相同)。
*/
Ogre摄像机Camera类收藏
Camera类
对摄象机的抽象。
成员函数说明如下:
标准构造函数
Camera(Stringname,SceneManager*sm);
标准析构函数
virtual~Camera();
返回渲染该摄像机的scenemanager的指针
SceneManager*getSceneManager(void)const;
取得摄像机的名字
virtualconstString&getName(void)const;
设定投影模式(正射或透视),缺省为透视
voidsetProjectionType(ProjectionTypept);
取得使用的投影模式的信息
ProjectionTypegetProjectionType(void)const;
设定该摄像机需要的渲染细节级别
voidsetDetailLevel(SceneDetailLevelsd);
取得该摄像机的渲染细节级别
SceneDetailLevelgetDetailLevel(void)const;
设定摄像机的位置
voidsetPosition(Realx,Realy,Realz);
voidsetPosition(constVector3&vec);
取得摄像机的位置
constVector3&getPosition(void)const;
移动摄像机
voidmove(constVector3&vec);
voidmoveRelative(constVector3&vec);
设定摄像机的方向向量
voidsetDirection(Realx,Realy,Realz);
voidsetDirection(constVector3&vec);
取得摄像机的方向
Vector3getDirection(void)const;
这是一个辅助方法用来自动计算摄像机的方向向量,在当前位置和所看的点,参数targetPoint是一个向量指明所看的点。
voidlookAt(constVector3&targetPoint);
voidlookAt(Realx,Realy,Realz);
将摄像机绕z轴逆时针旋转指定角度
voidroll(Realdegrees);
绕y轴逆时针旋转指定角度
voidyaw(Realdegrees);
绕x轴上下逆时针旋转
voidpitch(Realdegrees);
旋转任意角度
voidrotate(constVector3&axis,Realdegrees);
使用四元组绕任意轴旋转
voidrotate(constQuaternion&q);
指定摄像机是绕本地y轴还是指定的固定轴旋转
voidsetFixedYawAxis(booluseFixed,constVector3&fixedAxis=Vector3:
:
UNIT_Y);
设定y方向的视野域,水平方向的视野域将依此计算
voidsetFOVy(Realfovy);
取得y方向的视野域
RealgetFOVy(void)const;
设定到近裁减面的距离
voidsetNearClipDistance(RealnearDist);
取得到近裁减面的距离
RealgetNearClipDistance(void)const;
设定到远裁减面的距离
voidsetAspectRatio(Realratio);
取得当前纵横比
RealgetAspectRatio(void)const;
内部使用,取得该摄像机的投影矩阵
constMatrix4&getProjectionMatrix(void);
内部使用,取得该摄像机的观察矩阵
constMatrix4&getViewMatrix(void);
取得平截台体的特定面
constPlane&getFrustumPlane(FrustumPlaneplane);
测试给定的包容器是否在平截台体中
boolisVisible(constAxisAlignedBox&bound,FrustumPlane*culledBy=0);
boolisVisible(constSphere&bound,FrustumPlane*culledBy=0);
测试给定的顶点是否在平截台体中
boolisVisible(constVector3&vert,FrustumPlane*culledBy=0);
返回摄像机的当前方向
constQuaternion&getOrientation(void)const;
设定摄像机的方向
voidsetOrientation(constQuaternion&q);
输出流功能
friendstd:
:
ostream&operator<<(std:
:
ostream&o,Camera&c);
取得摄像机继承的方向,包括从附着节点继承的任何旋转
QuaterniongetDerivedOrientation(void);
取得继承的位置,包括从附着节点继承的任何平移
Vector3getDerivedPosition(void);
取得继承的方向向量
Vector3getDerivedDirection(void);
覆盖MovableObject的方法
void_notifyCurrentCamera(Camera*cam);
constAxisAlignedBox&getBoundingBox(void)const;
void_updateRenderQueue(RenderQueue*queue);
constStringgetMovableType(void)const;
使能/使不能自动跟踪scenenode
voidsetAutoTracking(boolenabled,SceneNode*target=0,
constVector3&offset=Vector3:
:
ZERO);
摄象机
OGRE中的摄象机支持透视投影(缺省投影方式、近大远小)和正射投影(大小与距离无关,是CAD设计中的常用投影方式)。
摄象机还支持线画模式、纹理模式、灰度阴影模式等几种渲染模式。
OGRE场景中可以有多台摄象机,可以将摄象机“看到”的结果渲染到多个窗口,甚至还能实现分屏和画中画功能。
OGRE中的摄象机可以独立于场景节点树(摄象机本身也具有位置、旋转属性及控制方法),也可以被attach到场景节点上,通过对场景节点的控制来达到对摄象机的控制。
Camera类
对摄象机的抽象。
成员函数说明如下:
标准构造函数
Camera(Stringname,SceneManager*sm);
标准析构函数
virtual~Camera();
返回渲染该摄像机的scenemanager的指针
SceneManager*getSceneManager(void)const;
取得摄像机的名字
virtualconstString&getName(void)const;
设定投影模式(正射或透视),缺省为透视
voidsetProjectionType(ProjectionTypept);
取得使用的投影模式的信息
ProjectionTypegetProjectionType(void)const;
设定该摄像机需要的渲染细节级别
voidsetDetailLevel(SceneDetailLevelsd);
取得该摄像机的渲染细节级别
SceneDetailLevelgetDetailLevel(void)const;
设定摄像机的位置
voidsetPosition(Realx,Realy,Realz);
voidsetPosition(constVector3&vec);
取得摄像机的位置
constVector3&getPosition(void)const;
移动摄像机
voidmove(constVector3&vec);
voidmoveRelative(constVector3&vec);
设定摄像机的方向向量
voidsetDirection(Realx,Realy,Realz);
voidsetDirection(constVector3&vec);
取得摄像机的方向
Vector3getDirection(void)const;
这是一个辅助方法用来自动计算摄像机的方向向量,在当前位置和所看的点,参数targetPoint是一个向量指明所看的点。
voidlookAt(constVector3&targetPoint);
voidlookAt(Realx,Realy,Realz);
将摄像机绕z轴逆时针旋转指定角度
voidroll(Realdegrees);
绕y轴逆时针旋转指定角度
voidyaw(Realdegrees);
绕x轴上下逆时针旋转
voidpitch(Realdegrees);
旋转任意角度
voidrotate(constVector3&axis,Realdegrees);
使用四元组绕任意轴旋转
voidrotate(constQuaternion&q);
指定摄像机是绕本地y轴还是指定的固定轴旋转
voidsetFixedYawAxis(booluseFixed,constVector3&fixedAxis=Vector3:
:
UNIT_Y);
设定y方向的视野域,水平方向的视野域将依此计算
voidsetFOVy(Realfovy);
取得y方向的视野域
RealgetFOVy(void)const;
设定到近裁减面的距离
voidsetNearClipDistance(RealnearDist);
取得到近裁减面的距离
RealgetNearClipDistance(void)const;
设定到远裁减面的距离
voidsetAspectRatio(Realratio);
取得当前纵横比
RealgetAspectRatio(void)const;
内部使用,取得该摄像机的投影矩阵
constMatrix4&getProjectionMatrix(void);
内部使用,取得该摄像机的观察矩阵
constMatrix4&getViewMatrix(void);
取得平截台体的特定面
constPlane&getFrustumPlane(FrustumPlaneplane);
测试给定的包容器是否在平截台体中
boolisVisible(constAxisAlignedBox&bound,FrustumPlane*culledBy=0);
boolisVisible(constSphere&bound,FrustumPlane*culledBy=0);
测试给定的顶点是否在平截台体中
boolisVisible(constVector3&vert,FrustumPlane*culledBy=0);
返回摄像机的当前方向
constQuaternion&getOrientation(void)const;
设定摄像机的方向
voidsetOrientation(constQuaternion&q);
输出流功能
friendstd:
:
ostream&operator<<(std:
:
ostream&o,Camera&c);
取得摄像机继承的方向,包括从附着节点继承的任何旋转
QuaterniongetDerivedOrientation(void);
取得继承的位置,包括从附着节点继承的任何平移
Vector3getDerivedPosition(void);
取得继承的方向向量
Vector3getDerivedDirection(void);
覆盖MovableObject的方法
void_notifyCurrentCamera(Camera*cam);
constAxisAlignedBox&getBoundingBox(void)const;
void_updateRenderQueue(RenderQueue*queue);
constStringgetMovableType(void)const;
使能/使不能自动跟踪scenenode
voidsetAutoTracking(boolenabled,SceneNode*target=0,
constVector3&offset=Vector3:
:
ZERO);
Camera使用举例一
打开OGRE提供的Demo_EnvMapping那个例子程序,运行之。
对于这个例子我们应该很熟悉了,通过键盘和鼠标可以控制摄象机在场景中漫游,那么摄象机的创建代码在哪里呢?
从EnvMapping.h和EnvMapping.cpp中都找不到创建摄象机的代码!
不要忘了我们是基于OGRE的应用框架建立的这个例子,在OGRE应用框架的ExampleApplication.h里为我们创建了摄象机,打开ExampleApplication.h文件可以发现如下函数:
virtualvoidcreateCamera(void)
{
//创建摄象机
mCamera=mSceneMgr->createCamera("PlayerCam");
//将该摄象机放到0,0,500位置上
mCamera->setPosition(Vector3(0,0,500));
//让摄象机“看”向Z轴负方向(从屏幕外向屏幕里)以模拟你的眼睛
mCamera->lookAt(Vector3(0,0,-300));
//设置摄象机平截台体的“近面”距离
mCamera->setNearClipDistance(5);
}
每一个通过OGRE应用框架创建的应用程序都会拥有一个通过ExampleApplication类的createCamera函数创建出来的摄象机,该摄象机站在0,0,500位置上看向场景中心。
摄象机的创建代码有了,那通过鼠标和键盘控制摄象机在场景中漫游的代码在哪里呢?
在OGRE应用框架中ExampleFrameListener类的frameStarted函数里。
该函数又调用processUnbufferedInput函数,我们可以在processUnbufferedInput函数中发现如下代码:
mInputDevice->capture();
……(省略若干行)
mCamera->yaw(rotX);
mCamera->pitch(rotY);
mCamera->moveRelative(vec);
首先获取鼠标状态,而后根据该状态计算摄象机的旋转和移动量,最后通过Camera的几个控制方法控制其运动。
注意到这里的摄象机是独立于场景节点树之外的。
我们已经了解到场景节点树上可以挂接Entity、摄象机和光。
通过对场景节点的空间位置控制可以达到改变其下挂接的Entity、摄象机和光的位置的目的。
但注意Entity和摄象机不一样。
在OGRE引擎的设计中Entity是完全没有移动、旋转等能力的,所以它只能把这些任务交给场景节点来完成,而摄象机具有移动和旋转函数,所以它并不一定要完全靠场景节点来完成这些任务。
这就引出一个有趣的话题,摄象机放到场景节点中和不放进去的区别究竟有多大。
一般来讲,摄象机如果不放在场景节点中,它就非常自由,程序员可以用程序任意控制它,就象在这个例子中一样。
想象一下在CS中,你牺牲后,你依然可以控制你的眼睛(灵魂?
摄象机?
)在场景中穿墙过屋,并为同伴通风报信,就可以体会到这种自由。
而如果把摄象机挂接到场景节点中,那么摄象机就和此节点和同在本节点下的其它Entity绑在一起了,一般在这种情况下就不再直接操作摄象机移动位置,而是和Entity一样交给场景节点来做。
墙上来回转动的监视器就是由挂接在同一节点下的Entity(监视器模型)和摄象机组成的。
还有场景中的人,他们的身体(Enti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 摄像机 函数 汇总