Reiiden制作笔记D(OGRE摄像机方向总结)
2011-04-08 15:02
288 查看
想做一个从天上往地面上看的小地图,使用相机的时候出现许多问题。
1 物体变形
摄像机默认是近大远小的椎体视角,小地图使用的是类似平行光的视角,需要:
2 setDirection不支持以Ogre::Vector3::UNIT_Y为参数:
原因:比如setDirection为向纸面内看物体A,此时Ogre的显示为A,而不是倒立的A,这是因为Ogre::Vector3::UNIT_Y是Ogre默认的'up'视角。所以setDirection(Ogre::Vector3::UNIT_Y)会出错,需要先设定向上的坐标轴:
3 改变方向也可以通过Yaw Roll Pitch来实现,注意以此旋转依旧要设cam->setFixedYawAxis(true, Ogre::Vector3::NEGATIVE_UNIT_Z);
Yaw是围绕当前坐标系的Y轴旋转
Roll是围绕当前坐标系的X轴旋转
Pitch是围绕当前坐标系的Z轴旋转
4 矩阵的方法,不再需要设置'UP'的方向
世界矩阵 => 摄像矩阵(ViewMatrix) => 投影矩阵(ProjectionMatrix)
旋转是在ViewMatrix中的处理
我需要的矩阵只是Y轴和Z轴做了对换,所以:
1 0 0 0
0 0 -1 0
0 1 0 -1000
0 0 0 1
-1000是摄像机的位置
5 四元数的方法,不再需要设置'UP'的方向
从3中的最后一个方法可以知道,四元数就是绕一个向量,旋转一定的角度。
事实上我的变化,一直是在受setFixedYawAxis干扰,实际只是原始坐标轴X旋转了90度
注1:四元数的w,x,y,z分别等于:
w = cos(angle / 2)
x = axis.x * sin(angle / 2)
y = axis.y * sin(angle / 2)
z = axis.z * sin(angle / 2)
注2:现在还不清楚四元数用于旋转时具体的计算方法,也没必要知道。
不过要记住四元数的w是不能为0的,也就是说不能旋转180。
可以用下面代码回避:
1 物体变形
摄像机默认是近大远小的椎体视角,小地图使用的是类似平行光的视角,需要:
cam->setProjectionType(Ogre::PT_ORTHOGRAPHIC);
2 setDirection不支持以Ogre::Vector3::UNIT_Y为参数:
原因:比如setDirection为向纸面内看物体A,此时Ogre的显示为A,而不是倒立的A,这是因为Ogre::Vector3::UNIT_Y是Ogre默认的'up'视角。所以setDirection(Ogre::Vector3::UNIT_Y)会出错,需要先设定向上的坐标轴:
cam->setFixedYawAxis(true, gre::Vector3::NEGATIVE_UNIT_Z); cam->setDirection(0.0f, -1.0f, 0.0f);
3 改变方向也可以通过Yaw Roll Pitch来实现,注意以此旋转依旧要设cam->setFixedYawAxis(true, Ogre::Vector3::NEGATIVE_UNIT_Z);
Yaw是围绕当前坐标系的Y轴旋转
Roll是围绕当前坐标系的X轴旋转
Pitch是围绕当前坐标系的Z轴旋转
// 2的代码写的麻烦一点就是: cam->setFixedYawAxis(true, Ogre::Vector3::NEGATIVE_UNIT_Z); cam->setDirection(1.0f, 0.0f, 0.0f); cam->yaw(Ogre::Degree(90)); // 改变了up之后,当前坐标系也不清晰了,也可以这样写 cam->setFixedYawAxis(true, Ogre::Vector3::NEGATIVE_UNIT_Z); cam->setDirection(1.0f, 0.0f, 0.0f); cam->rotate(Ogre::Vector3(0.0f, 0.0f, 1.0f), Ogre::Degree(-90)); // 也可以利用四元数旋转 cam->setFixedYawAxis(true, Ogre::Vector3::NEGATIVE_UNIT_Z); cam->setDirection(1.0f, 0.0f, 0.0f); cam->rotate(Ogre::Quaternion(Ogre::Degree(-90), Ogre::Vector3(0.0f, 0.0f, 1.0f)));
4 矩阵的方法,不再需要设置'UP'的方向
世界矩阵 => 摄像矩阵(ViewMatrix) => 投影矩阵(ProjectionMatrix)
旋转是在ViewMatrix中的处理
我需要的矩阵只是Y轴和Z轴做了对换,所以:
1 0 0 0
0 0 -1 0
0 1 0 -1000
0 0 0 1
-1000是摄像机的位置
Ogre::Matrix4 mx = Ogre::Matrix4::IDENTITY; mx[1][1] = 0.0f; mx[1][2] = -1.0f; mx[2][1] = 1.0f; mx[2][2] = 0.0f; mx[2][3] = -1000.f; cam->setCustomViewMatrix(true, mx);
5 四元数的方法,不再需要设置'UP'的方向
从3中的最后一个方法可以知道,四元数就是绕一个向量,旋转一定的角度。
事实上我的变化,一直是在受setFixedYawAxis干扰,实际只是原始坐标轴X旋转了90度
cam->setOrientation(Ogre::Quaternion(Ogre::Degree(-90), Ogre::Vector3(1.0f, 0.0f, 0.0f)));
注1:四元数的w,x,y,z分别等于:
w = cos(angle / 2)
x = axis.x * sin(angle / 2)
y = axis.y * sin(angle / 2)
z = axis.z * sin(angle / 2)
注2:现在还不清楚四元数用于旋转时具体的计算方法,也没必要知道。
不过要记住四元数的w是不能为0的,也就是说不能旋转180。
可以用下面代码回避:
if(1.0f + src.dotProduct(dir) < 0.0001f) { // 点乘=-1.0,那么就是方向相反了 src->yaw(Ogre::Degree(180)); } else { Ogre::Quaternion quat = src.getRotationTo(dir); src.rotate(quat); }
相关文章推荐
- Reiiden制作笔记H(OGRE Materilas/HLSL 的完整例子)
- Reiiden制作笔记E(OGRE编码总结)
- Reiiden制作笔记F(OGRE中的CEGUI DEMO7 CEGUI::RenderEffect)
- Reiiden制作笔记A(OGRE坐标轴总结)
- OGRE摄像机方向总结
- Reiiden制作笔记B(OGRE中的向量Vector3的成员方法)
- 购物网第三阶段总结笔记1:商品表的设计和后台产品分类界面制作
- UGUI 之 制作敌人不在摄像机视口的UI方向提示(或检测物体在不在摄像机渲染范围内)(四)
- Unreal Engin_画廊制作笔记 _013<设置漫游摄像机001>
- 【Unity 3D游戏开发学习笔记】总结摄像机和光源的使用方法
- 人群拥挤检测及人流方向判断(笔记总结)
- 购物网第三阶段总结笔记5:商品内容页制作
- 几种导航条菜单制作总结-笔记3.30
- Reiiden制作笔记G(D3D的渲染流程)
- PHP学习笔记——LAMP方向校园招聘经验总结
- Ogre笔记五:基础教程二—摄像机、阴影和光照处理
- UGUI 之 制作敌人不在摄像机视口的UI方向提示(或检测物体在不在摄像机渲染范围内)(四)
- IOS开发笔记之十八——UILabel的使用总结
- Linux基础总结笔记
- Android笔记-ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)