小引擎作业时的困惑

发布于

我在尝试实现多个墙体碰撞的情况下的正确slide(比如站在墙角往前走人物应该会原地不动,因为有两个墙的碰撞彼此抵消)

但是我发现人物明明只碰到一面墙的时候还是会出现两个hit:


不是很清楚第二个hit normal.z为-1的碰撞是哪里来的,而且不是每次蹭墙的时候都出现,目前没找到原因,不知道有没有大佬遇到过orz

4
评论 27
收藏
  • 张渐渐
    同时,我遇到一个问题就是即便在两墙的夹角,两墙的normal抵消之后依然有10^-3左右的normal遗留,导致人物还是会一点点位移、陷入墙内,不知道大佬们是怎么解决这个问题的。。。是不是我的方式有问题
    1
    展开1条回复
  • 张渐渐
    没人看就碎碎念:之前只对一个墙体做slide的时候用的是project求displacememt沿着平面的分量来做位移,但是这个思路一旦遇到夹角就不行了,因为这个沿着平面的分量遇到另一个平面的时候还是可以project出一个分量,这样的话除非新的平面是90度不然就会继续移动了
  • 张渐渐
    经过我不懈的努力,现在做到了只要不在角落里疯狂鬼畜(也就是去尝试硬卡bug)的话,一切的slide是正常的 但是不是很经得起鬼畜,不清楚为什么,所有的受力分量啥的处理都是没问题的
  • 张渐渐
    目前找到的最好实现,角落里怎么鬼畜都不会穿模了,但是问题就是模型有奇怪的重合的时候会出现在平行墙面上slide卡住的情况但那是我感觉这是模型的问题不是物理的问题了
  • MR7
    MR7
  • 张渐渐
    然后就是实现上台阶,之前其实就实现了但是为了debug这个slide的问题我就把相关代码都删了因为那个时候slide有概率出现鬼畜的上下纷飞,突出一个见了鬼。不过那个实现台阶上得很生硬,因为是直接把位移 add to final position,人物行进并不自然导致镜头也是很不自然,总之就是不流畅。不过说真的我感觉我玩到的游戏里台阶的刚体都是一个斜面,而不是真的一节节台阶,对于真的一节节台阶如何让人物上台阶上得自然流畅确实目前没有什么合理的想法。。
  • DD_BOND
    DD_BOND
    sweep打出去的shape是什么样子的呢
    展开8条回复
  • 张渐渐
    上周明明没问题的implementation今天编译一下就不行了我真是见鬼了。。。前面那个所谓的“最好实现”应该是有问题的,raycast检测到碰撞之后不应该再移动,应该在前面加个!,没有检测到碰撞的时候才应该移动才对(虽然我这么改了之后还是不对但是理论上应该是这样的)
  • 张渐渐
    想了一下,这种思路本质还是错的,比如如果人物遇到了一个角度很小的墙的话,它应该还是可以slide过去只不过速度会更慢,如果直接检测碰撞的话就会直接停住。感觉还是要检测碰撞的normal和当前displacment或者slide的角度才行,简单的碰撞检测是不够的
    1
    展开1条回复
  • 张渐渐
    测试了一下,这下是没问题了,但是implementation非常丑陋,不明白为什么会有z轴的hit,个别normal和slide方向为90度的hit也会被第二个sweep检测到即便不应该被检测到,没办法正常处理,只能处理为特殊case然后判断掉
  • 张渐渐
    感觉还是不行。每天都在发现新的bug,今天发现人物要是贴着楼梯的侧面slide就会卡住,因为检测到了楼梯上那些平行与z轴的面的碰撞。说白了还是sweep到了很多不应该sweep到的碰撞导致的,不知道有没有办法解决,唉
  • 张渐渐
    翻了一下几个开源的引擎,也没有找到相关的实现,唉
  • 张渐渐
    破案了。人物在hit这种边缘的时候hit产生的normal是跟人物的预期displacement相关的(图一),所以在slide的过程中如果遇到两个wall模型相交的地方,因为与第二个wall相交的地方其实是该wall的边,产生的normal就不是跟墙面垂直(如图二),人物就会卡住 Cool
  • 张渐渐
    目前的几个测试场景:墙面slide、90°墙角stuck、随机角度墙角stuck、楼梯侧面slide 都没有发现bug,我感觉功能应该是没啥问题了,但是帧数不知道为啥降到了一百多,之前一般是三百出头,让我很慌。这个implementation确实很丑陋,不知道成熟的引擎是怎么实现的。、。。
    展开3条回复