碰撞的概述
概述
- 碰撞种类很多,资料中文的很少,文档也因为版本问题不是很易读,
初步了解
总结如下
碰撞的分类
借助物理引擎
- 说明:
物理引擎比较多,资料比较杂
物理引擎的分类,二维引擎,三维引擎(维护的,不维护的)....
ammo是比较成熟的 - 引擎文档总结 -https://www.jianshu.com/p/d2d7dbadecfa?v=1680680281993
cannon是还在维护的 - 引擎文档总结 -https://www.jianshu.com/p/2f06481a8a7b?v=1680680256733
ammo的例子:
https://juejin.cn/post/6985033373857579045
cannon的例子:
-
https://juejin.cn/post/7121739944199995399/
-
优点:
借助物理引擎直接可以配置重力,材质,摩擦力、设置速度(角色前进)、接受外力(模仿风) -
缺点:
所有数据上的碰撞都借助于另一套物理几何模型,根据物理几何模型的碰撞,来更新视图几何模型(角色、足球等)
物理几何模型要与视图几何模型匹配,如: 足球,足球视图几何体只能是球形,物理几何体也必须是球形,半径需要严格一致,那么在处理场景的时候,就要建立一整套物理几何模型,如: 树木、路灯、椅子等,防止出现碰撞没有实现,产生穿模的问题,这个工作量是难以估计的。
不借助物理引擎
- 八叉树计算法
- 说明:
一个threejs的非核心库,用于辅助完成碰撞计算,无需npm安装,需要路径引入(如:import { Octree } from "three/examples/jsm/math/Octree.js";
)
根据面的上下左右前后横切,完成碰撞位置的细分
八叉树碰撞轮廓OctreeHelper
例子:
-
https://juejin.cn/post/7207673279166562361
-
优先:
简单的物理世界需求,可以不用考虑单独建立一套物理世界模型 -
缺点:
模拟弹性、摩擦、一个物体碰撞一个盒子组成的墙壁,怎么计算这些碰撞物体的运动下落等轨迹,是个问题
因为没有物理引擎作为支撑
- 射线计算法
-
说明:
更为复杂的模拟,自己写碰撞逻辑,如 平面(前后左右)运动、上下楼梯运动
前后左右碰撞监测 - 调整射线的方向,返回距离刨除角色厚度
上下楼梯
例子:
-
https://juejin.cn/post/7188065038995816505
-
优点:
简单易懂,简单的需求,不用去找资料,完全自己开发 -
缺点:
不依靠threejs核心库以及辅助工具,需求上限受制、越来越难 ( 如角色踏空下落、奔跑跳起来碰撞物体 等 )...
- 未探索的....
未完待续....
网友评论