cocos 物理射线检测,与屏幕拾取

physicSystem
物理系统对象:全局单例
PhysicSystem做射线检测
射线检测:3D世界中,在某个位置,沿着某个方向发出射线,通过射线检测,计算出射线穿过那些物体

点到那个物体,

射线对象

射线穿过的物体计算:两种模式
1)计算模式,计算到第一个就不计算,一个返回碰撞结果
2)射线不停止,继续检测,返回射线碰到的多个物体

射线
射线能检测到穿透了哪些物体,这些物体的特点是,物体必须是物理的物体,物理形状需要带物理碰撞器

在3D世界中有带物理碰撞器的3D物体,我们从一个位置发射一个射线,物理系统计算出这条射线穿过那些物体

射线发射点位置,射线原点位置vec3(x,y,z) 世界坐标系
方向:vec3 朝那个方向发射

geometry (几何)
射线ray
geometry.Ray 几何射线对象

创建一条射线
const r = geometry.Ray.create(0,0,0,0,0,-1)

调用接口计算射线穿越了哪些物体
两种模式
1)碰到一个物体就停止检测,结果是1个, PhysicSystem.instance.raycastClosest(r) 返回true 碰到3D物体
查看结果
PhysicSystem.instance.raycastClosestResult 获取碰撞结果
2)继续检测,知道所有都做完,结果肯能是多个, PhysicSystem.instance.raycast()

步骤
创建射线
在3D世界中放物体,+物理碰撞器
调用接口计算射线穿过那些物体
拿到结果PhysicSystem.instance.raycastClosestResult.collider.node.name 节点名字

掩码
物体类型是0 :1<<0 :1左移0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 (4个字节)
1: 1<< 1: 1左移1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010
...
31 1<< 31 1左移31 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

mask掩码

                                                    默认0xffffffff

PhysicSystem.instance.raycastClosest(r, (1 <<0 | 1<<1))

3D屏幕拾取
点击物体,这个物体是谁

看到的画面是透过摄像机看到的

摄像机开始,沿着屏幕的点方向发射射线,射线撞到谁,点的就是谁

屏幕,摄像机拍到的结果

监听触摸时间

touch_start

getLocation 获取屏幕的位置

获取摄像机组件示例,编辑绑定

利用camera生成ray射线对象

posted @ 2022-06-12 17:09  Running00  阅读(366)  评论(0编辑  收藏  举报