物理射线使用总结

 

适用:

引擎: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;

    }