Spe*_*ine 9 collision-detection unity-game-engine game-physics
在统一中,我有一个应该击球的球拍,并且球拍由鼠标直接控制,即使用鼠标轴移动球棒并使用transform.translate()函数移动球拍.
我预计Unity3d的物理不能直接用鼠标正确地转换球拍的动作并相应地击球,我必须写一些自定义的东西,结果证明是真的.
但是当球拍移动时球的碰撞没有被正确检测到.当它静止时,一切都很好,球就像我喜欢的那样.
现在我开始编写一个自定义物理脚本(我使用C#编写脚本),其中我将4个长度为0.6F的光线投影附加到球上,并且在做了一些复杂的矢量计算后,计算球击中球后的速度,并使用rigidbody.velocity = calculateVelocity()将其直接应用于球的速度.现在,当球拍没有移动时它再次正常工作,但是当我移动球拍时却没有.确切的(症状)问题是:
使用内置物理和碰撞检测:当球拍移动时,球有时直接穿过球拍,有时,它会减速(达到令人难以置信的水平).
使用我的脚本来计算速度:问题是一样的,但是当我打印对撞机(球拍)的法线时,它可以让我识别出什么是错误的.它有时给出正常的法线,有时给出法线向量的负值,这意味着它直接穿过顶面并用对撞机底部(球拍)检测击中.
我尝试过的事情:
增加对撞机的尺寸(它适用于球拍上较宽的框架对撞机,但显然球从球拍离开相当远的距离,我自己的脚本在这里工作,默认物理在球拍移动时给出奇怪的结果)总之,我没有得到我想要的现实.
将固定时间戳减少到0.001,这显着改善了事情,但仍然离我想要的结果非常远,并且球再次经常挑选球的错误一侧.
将碰撞检测更改为连续动态.哪个也没改善.
除了在碰撞中挑错的一方之外,我观察到的另一个问题是,在球拍弹跳后,球移动但是球拍移动得更快,而不是以完整的弧线或线移动,不知何故出现在前面球,导致两次安打.这是一个基于可见内容的猜想.
同样很明显,球拍的"运动"方面并没有被Unity3d的内置物理学所读取,当球拍使用鼠标击球时会导致奇怪的行为.
我卡住了,我不知道从哪里搬到这里.请告诉我,我做错了什么.
正如其他人所指出的那样,问题在于球从一个框架中的一侧移动到下一个框架的另一侧.如果障碍太小,快速移动的物体往往会这样做.
这个问题有三种非常简单的解决方案:
必须始终设置移动对象的最大速度.你不能冒险让一个重要的物体在游戏中飙升,并让一切都处于不受控制的状态.
我认为发生的是球/球拍发生的每个间隔都被移动然后检查是否发生碰撞.问题是球/球拍在一个区间内向远处移动并错过了碰撞.
1) Ball before racquet
2) Ball after racquet
not
1) Ball before racquet
2) Ball touching racquet
Run Code Online (Sandbox Code Playgroud)
所以你需要做的就是你的球的FixedUpdate()方法GameObject是从当前球位置投射到前一个球位置的射线.如果应该击中的那两个点之间有任何东西(即球拍),则将球移回到射线上报告的击中点.这将触发您现有的碰撞检测内容.
增加对撞机尺寸的原因也是因为球没有跳过较大的对撞机.这有你在问题中提到的缺点.射线投射避免了这个问题,并允许球/球拍根据需要快速或慢速移动.
| 归档时间: |
|
| 查看次数: |
20150 次 |
| 最近记录: |