游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4595|回复: 2

Ogre Lod的一个bug及其修改

[复制链接]

4

主题

15

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
发表于 2010-4-22 10:12:00 | 显示全部楼层 |阅读模式
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());
  }

2

主题

108

帖子

116

积分

注册会员

Rank: 2

积分
116
发表于 2010-4-22 14:30:00 | 显示全部楼层

Re:Ogre Lod的一个bug及其修改

用AABB也是不准确的。

4

主题

15

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
 楼主| 发表于 2010-4-23 10:57:00 | 显示全部楼层

Re:Ogre Lod的一个bug及其修改

Mesh 的AABB + node 的Position应该是准确的吧,
除非你用GPU把Mesh的位置改了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-16 14:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表