平民程序 - linghuye's blog

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

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

WoW Physics in Havok




1.这是魔兽世界莫高雷在Havok物理世界调试器中的建模,使用的是魔兽的地形高度图数据和模型物理PolygonSoup数据,黄色胶囊表示运动的人物.
2.物理引擎有个大问题,难以稳定,一个数值的错误很可能导致整个物理世界的崩溃.按持续性物理的原则,帧率的变化会影响物理世界的稳定,我相信这对游戏程序调试会造成很大的困难.
3.在图中规模的世界场景中,实际场景渲染时,Havok引擎在我的E6300 Intel双核CPU上运作十分地流畅,几乎没有没有降低原来的渲染帧率.当然MMORPG的碰撞规模是非常少的,仅仅是人物对世界静态场景的碰撞,至多推几个箱子而已,但是要求的碰撞和碰撞反应逻辑是非常高的,不能是小儿科的,没有实用价值的,拿几个箱子啊,圆球啊,凸面体等的演示,只有像魔兽世界这样完全不规则的模型才测试得出一个物理引擎的效率和稳定性.
4.Havok支持物理模型的Scale,Phyx目前没有这个非常关键的特性.
5.我个人认为,总的说来,当前,不管Havok还是Phyx在都不是一般的难用(至少不如图形API简易好用).对这些基于动力学的物理引擎而言,他们过于死板,过于遵守物理定律,过于霸道.当我需要一些不符合物理学的运动和物体时(比如瞬间改变物体的速度,改变人物在跳跃时的空中轨迹),要绕过或骗过引擎是非常困难的,这通常使引擎变得不稳定.其实我需要实现的不过是人物行走在全3D环境中而已,我要的不是真实的物理世界,而在Havok引擎里实现这么简单的东西需要绕很多弯,基本上要把整个物理引擎的每个概念都要学过一遍,这是物理引擎不成熟的表现.
6.另外,Havok的Demo框架完全是Havok写Demo的程序员偷懒的结果,因为有框架,他们可以简易地写出多个Demo逻辑,但我不需要他们的这些繁杂甚至实现诡异的Demo框架,我不希望去理解这些自以为精妙的框架.因为实际应用中我有我的框架,公司有公司的框架,没有人会为了一个物理引擎去把自己的框架都换掉.程序框架更多程度上是一种卖弄似的垃圾. 我需要简单的独立的Demo,不要基于任何其他第3方的东西,能够让我迅速理解调用运作流程和每个API的简单作用.而Havok的文档完全是程序员在写代码时的注释,不够详细,缺少很多必要的说明.所以在遇到问题时,不要指望文档,唯一的方法是去看复杂的Demo的代码,去猜Demo的代码到底是什么意思,去对比自己的实现哪里跟Demo程序不符.
7.目前,我个人的实践感受上,Havok要比Phyx好得多。Phyx有几个我非常讨厌的限制,PolygonSoup数据需要被预处理(Cooked),不支持Scale变换,CharacterController不够灵活.

Reference:
http://softwarecommunity.intel.com/isn/Community/en-US/forums/2508/ShowForum.aspx

posted on 2008-08-06 22:00 linghuye 阅读(3777) 评论(19)  编辑 收藏 引用 所属分类: 3D图形学研究

评论

# re: WoW Physics in Havok  回复  更多评论   

问前辈个问题,Havok对传进去整块的地面高度图会遍历所有的面吗?如果是,那不如自己判断和地面高度图的碰撞,让Havok只去判断和地面上的模型PolygonSoup的碰撞??
前辈一次传如多少的MapTile??
2008-08-07 20:49 | G_G

# re: WoW Physics in Havok  回复  更多评论   

Havok不会对地面高度图遍历所有的面,因为从接口上看,是用的hkpSampledHeightFieldShape,这个接口的虚方法getHeightAt索取高度信息.由于Sampled这种采样性质是不需要遍历所有面的.
这些文档中也有说明,这种实现另一个好处是省内存.
In Havok Physics, heightfields are a highly CPU and memory optimized way to do collision detection between displacement map landscapes and normal shapes.

我测试实例中传了3x3个MapArea,9*16*16=2304个MapTile.对于MMORPG这种物理环境,主要是耗内存,对Havok这种商业级的物理引擎的效率影响不是太大.
2008-08-08 09:15 | linghuye

# re: WoW Physics in Havok  回复  更多评论   

hkpSampledHeightFieldShape似乎只支持一个Maptile 2个面,但是wow的maptile是4个面,如何实现?
2008-08-08 13:08 | G_G

# re: WoW Physics in Havok  回复  更多评论   

嘿嘿,实际效果上,用于物理的高度图只用2个面也足够精确了.Wow的4个面是用来作渲染LOD的,物理上不需要那么精确.
2008-08-09 19:56 | linghuye

# re: WoW Physics in Havok  回复  更多评论   

这是我写的一个Havok+DirectX9的简单代码,仿照Demo写的,实现了一些常用的物理功能,但是里面的CharacterProxy就是没效果。。。。前辈是否能指点下错误在哪,谢谢了
因为我不是SP1所以请在Release下编译

http://pickup.mofile.com/7159777417217871
2008-08-09 21:00 | G_G

# re: WoW Physics in Havok  回复  更多评论   

代码中addCharacter函数中,最后应该把rigidBody加入到physicsworld,加phantom是没用的.
2008-08-13 10:41 | linghuye

# re: WoW Physics in Havok  回复  更多评论   

错误原因找到了~谢谢
Havok效率很高,大地型,多物体都不会对帧数有太大的影响,
但是物理数据卸载的时间和其他图形数据比就显的太长了,即使是用removeEntityBatch也是有点慢.
2008-08-15 13:48 | G_G

# re: WoW Physics in Havok  回复  更多评论   

请教一个问题:
havok有broadphase size的限制,而且好像是在world初始化时就设好了,之后不能修改。如果是这样那么如何处理无限大地图的动态加载?
2008-09-03 11:35 | cproom

# re: WoW Physics in Havok[未登录]  回复  更多评论   

实际上我没去解决这个问题. 因为WoW的世界范围是[-17066.56, 17066.56],所以一开始我就设置这个broadphase size,避开了这个问题.

如果是绝对意义上的无限大的地图,我会考虑用多个物理hkpWorld解决,这样连整个物理世界也是动态生成的,这时人物在物理世界边界时需要将人物从一个世界搬迁到另一个中.
2008-09-03 19:18 | linghuye

# re: WoW Physics in Havok[未登录]  回复  更多评论   

havok 的 heightfield 好象不支持地表挖洞,有山洞的地形不能用 heightfield 实现。physX的支持。
2008-09-03 20:44 | xx

# re: WoW Physics in Havok[未登录]  回复  更多评论   

我想可以用callback来实现挖洞
2008-09-03 22:54 | xx

# re: WoW Physics in Havok  回复  更多评论   

@xx
height map不能支持挖洞的原因是在于height map是在一个二维索引上的高度域, 所以它不能够存储横向(水平于xz平面)的山洞的数据, 更别说挖洞了....physx之所以可以挖洞, 是因为它先把polygon数据体素化,然后在体素数据上挖洞, 再重新生成polygon, 核心算法是matching cubics
2008-09-04 13:35 | zxx

# re: WoW Physics in Havok[未登录]  回复  更多评论   

我以为山洞应该做成一个室内场景.
2008-09-04 21:54 | linghuye

# re: WoW Physics in Havok  回复  更多评论   

问一个问题:Havok的物理step一般设为1/60,他假设用户的帧率为60fps,但很多时候帧率不是固定的,这样会不会导致一些问题发生?
2008-10-15 11:43 | coast

# re: WoW Physics in Havok  回复  更多评论   

为什么我试着用VS2005打开demos目录下的Demos_win32_8-0.vcproj
编译时也出错:正在链接...
LINK : fatal error LNK1104: 无法打开文件“dxguid.lib”
我查看了连接器发现有"dxguid.lib" 这可是官方的哦!也会出错?
前辈帮帮我好吗?
2008-11-04 10:38 | WING102345

# re: WoW Physics in Havok  回复  更多评论   

很好奇,怎么把WOW的物理调试打开,是加什么命令行参数吗?
2009-03-26 10:21 | HanckJT

# re: WoW Physics in Havok  回复  更多评论   

问个问题,havok传进去的模型只能是多边形吗?有没有其他的方法可用?
要是的话一个模型的最大支持多边形个数多少,对于高精度的模型,传进去的数据havok会不会优化?
2009-09-22 13:48 | const

# re: WoW Physics in Havok  回复  更多评论   

楼主您好 我想问问您是怎么将.hkx导入到的VisualDebeger里面的?能不能把导入的代码拷贝给我呢 谢谢了
2015-01-18 13:15 | waller
只有注册用户登录后才能发表评论。