本文主要是介绍Ogre Lod的一个bug及其修改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Ogre:istanceLodStrategy的一个Bug 问题描述: 当我把一个不在原点的Mesh加入到Entity中(Mesh的boundingbox原点不在Vector(0,0,0)点)处. 而将Entity attach到一个在原点Vector(0,0,0) Node中。 如果mesh有lod, 此时lod将会显示异常。如果Mesh 的 boundingbox中心距离Node 的位置比较远,即便是Camera 在 mesh附近也无法显示比较细节的Lod. 原因和修改: 在Real DistanceLodStrategy::getValueImpl(const MovableObject *movableObject, const Ogre::Camera *camera) const 函数中 第一句代码: Real squaredDepth = movableObject->getParentNode()->getSquaredViewDepth(camera) - Math::Sqr(movableObject->getBoundingRadius()); 仅仅计算Node 到 Camera的距离,而无法反映 Camera 到Mesh的实际距离。 修改如下: Real squaredDepth = movableObject->getParentNode()->getSquaredViewDepth(camera) - Math::Sqr(movableObject->getBoundingRadius());//保持不变 //计算 Mesh 到 Camera 的距离 Entity* entity = static_cast<Entity*>(const_cast<MovableObject*>(movableObject)); //这句不是很好 if(entity)//仅仅处理Entity对于其他的,自己添加 { //找到Node 的世界坐标 Vector3 DerivedPos = movableObject->getParentNode()->_getDerivedPosition(); //Camera的世界坐标 Vector3 Camdiff = camera->getDerivedPosition(); AxisAlignedBox meshbox = entity->getMesh()->getBounds(); //计算Mesh的世界坐标 Vector3 MeshDiff = (meshbox.getMaximum() + meshbox.getMaximum())/2.0 + DerivedPos; Vector3 diff = MeshDiff - Camdiff; //计算Camera到Mesh的距离 squaredDepth = diff.squaredLength() - Math::Sqr(movableObject->getBoundingRadius()); } |
摘自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=145980
这篇关于Ogre Lod的一个bug及其修改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!