平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

身处何乡

基于Portal的引擎如何知道当前人物处于哪个sector是个难决的问题.用google搜索了一下论坛,有两种方案:
一种主张跟踪人物位置,给定一个起始sector,而后时刻检查人物是否穿过某个portal平面,一旦穿过则更新当前人物的sector位置变量.
一种主张实时计算,需要附加的对sector进行划分的bsp树数据进行计算.

在程序逻辑上,我比较倾向第2种,因为其逻辑概念比较清晰简单,但其需要额外的数据制作,wmo数据的BSP树是普通的leafy bsp,而非solid leafy bsp,似乎不足以判断一个点是否在BSP整体空间内,而且不能适应2个sector相嵌套的情形,WoW的城内的建筑portal摆放随意性很大,似乎没什么限制.

而判断人物穿过portal,感觉上逻辑比较模糊,脆弱,不稳定.当人物一直在portal边上左右徘徊时,算法是否够强壮?人物初始化时,又通过什么手段得知其初始sector呢?人物从城外进入城内的瞬间,又如何知道进入哪个sector?

WoW使用了哪一种呢?至少穿越portal这方案还可以实现出来,Crystal Space也是这么干的,可惜大部分的资料根本不提这一问题.

posted on 2006-10-20 21:25 linghuye 阅读(3096) 评论(12)  编辑 收藏 引用 所属分类: 3D图形学研究MyWarCraftStudio我的3D引擎 -DestinyMatrix

评论

# re: 身处何乡  回复  更多评论   

我这边渲染wmo,用的是方式一“跟踪人物位置,检测是否穿越portal”,因为在wow的室内场景中都有一个室内室外切换的Room,该room带一入口portal,命名为类似Entry_XXX,人物从室外地形一进入这个portal后就开始跟踪是否穿越portal,算法简单好用。
2006-10-22 00:31 | wjk

# re: 身处何乡  回复  更多评论   

看来是用的方式一,这个Entry_XXX关键信息很重要,真是感谢指教.
2006-10-22 08:45 | linghuye

# re: 身处何乡  回复  更多评论   

客气客气了。从MyWarCraftStudio,我们索取了这么多。。。。。
2006-10-25 18:02 | wjk

# re: 身处何乡  回复  更多评论   

研究了两天发现在wmo的主文件里有两段数据:
MOPV(Portal vertices):sector的分割面图形数据,四个顶点
MOPR(Portal relationship):分割面的信息,比如正面反面的sector号

所以只要判断人物是穿过了哪个分割面,再用分割面信息判断,就知道人物在哪个sector了~~

不过我还是有个问题,那就是人物(我看作点)和三角形的碰撞(-_-!!这是碰撞检测里的最基本问题了,我是初学者,原谅下吧),我用的是http://dev.gameres.com/Program/Visual/3D/Collision.htm里提供的方法.
这种方法把三角形放大了,这样的好处是在面面相连的地方不会出现检测的盲区,但是放大的情况不是在任何情况下都好的,比如人物可能被放大多余出来的面卡住(上楼梯的时候跟明显).所以希望linghuye前辈能提供点比较好的碰撞检测算法(主要是能适应wmo的,现在就差这一步了).
2006-11-27 21:59 | 老顾

# re: 身处何乡  回复  更多评论   

这个Entry_XXX的信息是记录在哪个文件中呢,我在StormWind.wmo中没找到
2006-12-05 13:00 |

# re: 身处何乡  回复  更多评论   

还有个问题,bsp node结构中没有这个node的包围盒大小,要判断当前视锥在哪个node中,难道是从根节点开始,用视锥跟分割面做相交?
2006-12-06 01:11 |

# re: 身处何乡  回复  更多评论   

1.碰撞检测算法,我一开始也按网络上的一些简单的算法自己来写,后来发现那些所谓偷巧的方法实在太垃圾,不完善,不实用,不solid,不专业.所以我的意思是不要自己写,用现成的库,比如Solid,或者用PhyX物理引擎.

2.Entry_XXX意指Portal的那些相关信息,何必执着于一个名字.

3.Wow不用Bsp来做渲染,不需要node bounding box来做层次视锥裁减.书上的理论和实际有很大的差别.大部分网上的bsp文章都过时了.
2006-12-06 09:14 | linghuye

# re: 身处何乡  回复  更多评论   

我今天已经试着通过穿越portal的方法来检测当前在哪个cell,等会就试试拿bsp 的leaf里的面来坐碰撞检测。

”2.Entry_XXX意指Portal的那些相关信息,何必执着于一个名字.“
我主要想知道wow里的wmo里靠什么信息来辨别地形与建筑物所连接的portal,能举些例子吗,谢谢了。
2006-12-06 17:55 |

# re: 身处何乡  回复  更多评论   

PhyX研究过一段时间
Solid指的是什么开发库?
2006-12-06 21:02 | 老顾

# re: 身处何乡  回复  更多评论   

sector数据结构里有个标识该sector为outer sector,关联到该sector的portal为地形与建筑相连的portal.

SOLID: http://www.dtecta.com/
2006-12-06 21:22 | linghuye

# re: 身处何乡  回复  更多评论   

感谢linghuye前辈~~现在能让人物自由的在wmo中行走了~~
2006-12-10 21:15 | 老顾

# re: 身处何乡  回复  更多评论   

Cool!
2006-12-10 21:43 | linghuye
只有注册用户登录后才能发表评论。