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射线对象