摄像机与碰撞检测的bug,是我写的有问题吗?

问题: 一个工程中有两个摄像机分别渲染两个不同对象,这两个对象都有 碰撞盒子 移动其中一个摄像机,另外一个摄像机渲染的对象的碰撞盒子也动了但是渲染的图片没动.


简单的概括就是 移动一个摄像机(Main Camrea)所有的碰撞盒子都跟着动,.

移动另外一个摄像机, 它所渲染的对象跟着动了但是碰撞盒子没动.

移动对象它的包围盒子也没有还原到起始位置.


###测试用例

const {ccclass, property} = cc._decorator;

@ccclass
export default class MoveCamera extends cc.Component {

    @property(cc.Camera)
    mainCamera: cc.Camera = null;

    @property(cc.Node)
    platform: cc.Node = null;

    onLoad () {
        var manager = cc.director.getCollisionManager();
        manager.enabled = true;
        manager.enabledDebugDraw = true;
    }

    start () {
        this.node.on(cc.Node.EventType.TOUCH_MOVE,this.move,this);
        this.platform.on(cc.Node.EventType.TOUCH_MOVE,this.moveP,this);
    }

    move(e) {
        // 移动主摄像机(Main Camera)
        let t = e.getDelta();
        this.mainCamera.node.x -= t.x;
        this.mainCamera.node.y -= t.y;
    }

    moveP(e) {
        // 移动另外一个摄像机(Other Camera)所渲染的对象
        e.stopPropagation();
        let t = e.getDelta();
        this.platform.x += t.x;
        this.platform.y += t.y;
    }

    // update (dt) {}
}

引擎版本: Cocos Creator 2.0.5
操作系统: Win10

没人回复???

摄像机移动并不会影响碰撞盒以及精灵的真实位置(世界坐标),摄像机只负责渲染,并不负责节点的坐标。你看到的node节点位置有移动,只是因为两个摄像机渲染的原因导致最终的渲染结果是看上去在一起的,实际上这两个节点的真实位置并没有产生位移,因此碰撞盒也是不移动的。

这个是初始位置

移动主摄像机(Main Camera)

移动对象

@BigBear 但是我移动摄像机(Main Creama) 其他摄像机机(Other Camera)渲染的碰撞盒子跟着动 这就有点不好吧, 导致我移动一下这个对象 还没碰撞 碰撞检测的回调 就相应了 , 我下面有一些 截图的实例. 你在看一下呵.

你要搞清楚一点就是节点的世界位置以及最终的渲染位置,以及camera的cullingmask,cullingflag。你渲染出来眼睛看到的节点位置,并不一定是节点真实的位置。中间和你的逻辑相关,需要你自己把这块的逻辑理清楚

@BigBear 我也遇到了同样的问题,碰撞盒子跟着摄像机移动,感觉好像碰撞盒子是摄像机的子节点,这是啥情况 官方大佬能不能帮忙解决一哈 万分感谢:pray:

@BigBear 那我问一个问题 你看看我这些测试东西对吗 这些是测试工程的一些截图





这是我这几个对象属性信息

方便的话把工程给我

@BigBear 可以 NewProject_1.zip (207.3 KB)

@BigBear 麻烦了,你可以看一下,刚才那个工程里面都是测试用例,没用的东西太多了,我就把这个单独拆出来了,给你了一个测试用例.

NewProject_1.zip (553.4 KB)
我在你工程的基础上加了一个碰撞回调的脚本,用于查看是否发生碰撞,碰撞时会将node的color改为红色,无碰撞时恢复。

    onCollisionEnter (other, self) {
        other.node.color = cc.color(255,0,0,255);
        self.node.color = cc.color(255,0,0,255);
    },

    onCollisionExit (other, self) {
        other.node.color = cc.color(255,255,255,255);
        self.node.color = cc.color(255,255,255,255);
    }

另外加了一个小地图,用于查看节点的真实位置

你可以运行后看一下,节点的真实位置并没有随着摄像机的移动而改变,只有真正在真实坐标上发生碰撞,才会改变颜色。

@BigBear 好我看一下,我那里说的移动只是为了描述现象,我知道,它在世界中是没有动的

@BigBear 嗯,好我知道怎么回事了,多谢.