Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

凸包半平面碰撞遇到的问题和解决 #5

Open
liuxq opened this issue Oct 29, 2016 · 0 comments
Open

凸包半平面碰撞遇到的问题和解决 #5

liuxq opened this issue Oct 29, 2016 · 0 comments
Labels

Comments

@liuxq
Copy link
Owner

liuxq commented Oct 29, 2016

  • 最近在公司修改碰撞的编辑器并查一个碰撞的bug,在此总结一下
  • 我们的碰撞采用记录凸包的方式,给美术做一个凸包编辑器(使用unityEditor),提供创建碰撞圆柱,盒子,以及mesh的方式,之后使用giftwrap算法生成凸包,最后将凸包保存成半平面形式(即面法矢和到原点有向距离),这种保存方式使每个凸包上的面只需要用两个变量来表示,比较节省空间,并且判断碰撞时只需要将点到原点的向量点乘面法矢得到的距离和面距离做比较就可以得到是否碰撞。导出的碰撞数据供服务器和客户端共同使用。在使用之前还需要进行aabb碰撞盒的限定并用八叉树来分割空间,从而减少碰撞判断的复杂度。
  • 这里说一下遇到的一个碰撞的bug:主要表现是人物陷入一个阶梯场景中了,尝试把aabb的预碰撞注释掉就没问题了。查找原因,是因为生成的aabb盒子没有包住凸包。这个错误发生在由凸包mesh导出半平面的过程中。aabb是用凸包mesh的顶点集合计算的,而凸包mesh导出成半平面之后由于float误差导致半平面生成的凸包超出了原来的aabb范围。解决:按照aabb增加六张半平面,这样就强制缩小凸包的范围到aabb了。如果原来的凸包有垂直于轴的面就不再补该轴的半平面。
@liuxq liuxq added the blog label Oct 29, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant