物理射线使用总结
适用:
引擎:cocost creator 2.3.4
充分条件:
1:物理分组要开放碰撞功能,如地板分组为ground。则:
必须勾选才行。
2:地板上要挂碰撞体:
可以不加物理刚体。
3:必需开篇3D物理引擎:
cc.director.getPhysics3DManager().enabled = true;
实现方法:
1:点击测试,取得点击位置下击中的3D物体;
//点击时触摸位置://e: cc.Event.EventTouch
const touchPos = e.touch.getLocation();
// 根据点击的点获取一条由屏幕射向屏幕内的射线
let ray = Camera3D.getRay(touchPos);
let results = cc.geomUtils.intersect["raycast"](GameManager.instance.StackContainer.node, ray, this.handler);
let currentNode = null;
// 根据传入的根节点向下检测,并返回检测结果
// 返回的结果包含了节点和距离
for (let i = 0; i < results.length; i++) {
const gridBase: GridBase = results[i].node.parent.getComponent(GridBase);
}
2:鼠标移动时,获取鼠标在3D空间内的坐标:
private checkClickPos(touchPos: cc.Vec2) {
//获取点击位置,把点击位置转化为相机下的3D节点位置
const mousePos = cc.v3(touchPos.x, touchPos.y, 0);
//用摄像机做转换,将触摸点转换到游戏中的世界坐标
let out = cc.v3();
GameManager.instance.Camera3D.getScreenToWorldPoint(mousePos, out);
// 构造一条从原点出发,指向 Z 轴的射线
const outRay = new cc.geomUtils.Ray();
// 获取相机的位置
let cameraPosition = GameManager.instance.Camera3D.node.convertToWorldSpaceAR(cc.v3(0, 0, 0));
cc.geomUtils.Ray["fromPoints"](outRay, cameraPosition, out);
const results:cc.PhysicsRayResult[]
= cc.director.getPhysics3DManager().raycast(outRay, "ground", 1000, false);
if (results && results.length > 0) {
//从世界坐标,获取某个节点中的本地坐标
let localPos = GameManager.instance.StackContainer.node.parent.convertToNodeSpaceAR(results[0].hitPoint);
return localPos;
}
return null;
}
标签:const,cc,results,cocosCreator234,射线,点击,let,touchPos,版本 From: https://www.cnblogs.com/luogyie/p/18428553