OGRE代码学习——场景查询
来源:互联网 发布:淘宝卖家折扣设置 编辑:程序博客网 时间:2024/06/06 04:14
1. 场景查询
轴对称包围盒:立方体,2个对角点
球体:中心、半径
平面包围体:3个及其以上的平面包围的体积
光线:一点引出一条射线,查找与线相交的物体
任意相交:任何相交对象
const unsigned int LIGHT_QUERY_MASK = 0x00000001
Light* light1 = mSceneMgr->createLight(“Light1”);
Light* light2 = mSceneMgr->createLight(“Light2”);
light1->setPosition(12, 12, 12);
light2->setPosition(5, 5, 5);
//设置自定义掩码
light1->setQueryFlags(LIGHT_QUERY_MASK);
light2->setQueryFlags(LIGHT_QUERY_MASK);
AxisAlignedBoxSceneQuery* lightQuery = mSceneMgr->createAABBQuery(
AxisAlignedBox(0,0,0,10,10,10), LIGHT_QUERYMASK);
// 查询空间内所有的灯光。
SceneQueryResult& results = lightQuery->excute();
// 迭代查询结果。
// 迭代器中返回的是活动对象类型指针
SceneQueryResultMovableList::iterator it = results.movalbles.begin();
for(; it != results.moveables.end(); it++)
{
// 检查是否返回的都是灯光
assert(((*it)->getQueryFlags() & LIGHT_QUERY_MASK) != 0);
//在这里加入对灯光的操作。
}
103
// 结束后销毁场景查询实例
mSceneMgr->destroyQuery(lightQuery);
1. 实际运用中,应单独创建一个场景查询结构,查询很快,创建很慢。
2. 需要通过自定义的掩码来确定类型
光线投影查询:给定空间的相交查询
地形跟随:
void Entity::clampToTerrain(){
static Ogre::Ray updateRay;
updateRay.setOrigin(m_controlledNode->getposition() + Ogre::Vector3(0, 15, 0));
updateRay.setDirection(Ogre::Vector3::NeGATIVE_UNIT_Y);
m_raySceneQuery->setRay(updateRay);
Ogre::RaySceneQueryResult& qryResult = m_raySceneQuery->execute();
if (qryResult.size() == 0)
{
//当我们在地形的下面的时候,需要升到地表上面
updateRay.setQrigin(m_controlledNode->getPosition());
updateRay.setDirection(Ogre::Vector3::UNIT_Y);
m_raySceneQuery->setRay(updateRay);
qryResult = m_rayScenQuery->execute();
}
104
Ogre::RaySceneQueryResult::iterator i = qryResult.begin();
if( i != qryResult.end() && i->worldFragment)
{
Ogre::SceneQuery::WorldFragment* wf = i->worldFragment;
m_controlledNode->setPosition(m_controlledNode->getPosition().x,
i->worldFragment->singleIntersection.y,
m_controlledNode->getPosition().z);
}
}
void Entity::init()
{
// 创建光线查询
m_raySceneQuery = sm->createRayQuery(
Ogre::Ray(m_controlledNode->getPosition(),
Ogre::Vector3::NEGATIVE_UNIT_Y);
// 把这个节点移动到贴紧地表的位置
clampToTerrain();
}
首先向下检查交点,如果没有,向上检查,再设置节点位置到紧贴地面的地方。
在代码中通过每一帧调用 clampToTerrain()来实现更新。
- OGRE代码学习——场景查询
- ogre场景查询—简单学习
- ogre代码学习——场景、天空面、雾化
- Ogre引擎源码——场景查询
- Ogre引擎源码——场景查询
- Ogre引擎源码——场景查询
- ogre射线场景查询
- Ogre射线场景查询
- OGRE场景查询
- OGRE场景查询
- OGRE场景查询
- 最简单的Ogre系列之四——球体场景查询
- 最简单的Ogre系列之五——AABB场景查询
- Ogre中场景查询和碰撞检测
- Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算
- ogre代码学习——地形 手工和cfg创建
- 自制的基Ogre的场景编辑器—OgreSE
- 自制的基Ogre的场景编辑器—OgreSE
- [win32] Winsock 中应使用 DisconnectEx 关闭连接
- SAP HANA列存储懒加载(SAP HANA Lazy Loading for column store)
- 线性方程组算法(C语言)
- 矩阵连乘算法思想
- Web脚本开发利器, WebStorm
- OGRE代码学习——场景查询
- Informatica bulk和normal模式
- eval
- PHP框架学习错误总结
- Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信
- OpenCV的IplImage与BMP相互转换
- Oracle初体验
- Struts2框架简单的AJAX应用
- iText学习资料