游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3794|回复: 8

使用物理引擎,碰撞的时候经常穿越,该怎么解决?

[复制链接]

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-6-11 10:32:00 | 显示全部楼层 |阅读模式
    最近在做一个高尔夫球的游戏,ode和bullet引擎都试过了,都偶尔有球落地时穿越的地表的现象,特别是速度快的时候。个人感觉是因为球的直径较小(0.042),与速度的差距太大(30到100),但这些数据都是按照现实世界的比例来的,更改的话也是按比例放大,倍数不会变,不知道问题是不是出在这里。地形用的是物理引擎中的Heightfield。
    将ode和bullet的demo里面的球体数据改为和这个项目中一样的话,也是会出现穿越的现象。原来希望通过修改碰撞检测中的和接触有关的各项参数解决这种现象, 可是没改好。在此请教大家,有没有人遇到过类似的问题,怎么解决呢?

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-6-11 11:09:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

1. 用swept shape/volume,检测物体移动扫过的区域是否和其他物体发生碰撞
2. 根据两个物体的相对速度,计算在deltaT之内是否可能碰撞

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2010-6-11 11:20:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

请问楼上大牛,如何获得物体的碰撞点?

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-6-11 11:24:00 | 显示全部楼层

Re: Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

clayman: Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

1. 用swept shape/volume,检测物体移动扫过的区域是否和其他物体发生碰撞
2. 根据两个物体的相对速度,计算在deltaT之内是否可能碰撞

这样的话,岂不是要自己写碰撞检测和碰撞后的处理了?那就不需要用物理引擎了啊

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2010-6-11 12:20:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

@小c
嘿嘿,物理我不太熟,好像基本就是根据碰撞法线和相对速度来算吧,我从Game Physics Engine Development 和Eberly的书里看来的

@luckyhhw
这些都是物理引擎最基本和常见的功能,你再好好研究研究文档吧

0

主题

243

帖子

357

积分

中级会员

Rank: 3Rank: 3

积分
357
发表于 2010-6-11 14:04:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

看看物理引擎是否支持CCD,physx是支持的

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2010-6-11 14:55:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

碰撞的物体可能是OBB,球体,凸包,碰撞有可能是点对面,边对边....我看<3d游戏与计算机图形学中的数学方法>中光是算两个运动的OBB碰撞检测就有一大堆判断......但是不算又不行....首先要算出碰撞的临界点,才能算出力和力矩.......个人浅见...欢迎批评指正

34

主题

657

帖子

672

积分

高级会员

Rank: 4

积分
672
发表于 2010-6-11 17:54:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

嗯,打开bullet的连续碰撞检测,不过降性能。

4

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-6-11 18:24:00 | 显示全部楼层

Re:使用物理引擎,碰撞的时候经常穿越,该怎么解决?

谢谢各位的支持!已经解决了,就是和楼上所说的一样,用了bullet的连续碰撞检测(CCD)。代码
                // Only do CCD if  motion in one timestep (1.f/60.f) exceeds CUBE_HALF_EXTENTS
                body->setCcdMotionThreshold( CUBE_HALF_EXTENTS );

                //Experimental: better estimation of CCD Time of Impact:
                body->setCcdSweptSphereRadius( 0.2*CUBE_HALF_EXTENTS );
不过在ODE中没有找到类似的功能,前段时间用ODE调整了好久,折腾了快一个月了都。 希望此贴对后来人有帮助:p
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 15:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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