摄像机跟随3D角色移动,坐标不同步

需求:角色前后移动时摄像机跟随;左右移动时不跟随。

update(deltaTime: number) {
    if (this.radian != 0) {
        let move = new Vec3(Math.cos(this.radian) * this.speed.x, 0, -Math.sin(this.radian) * this.speed.z);
        this.node.translate(move, 1);
        let move2 = new Vec3(0, 0, move.z);
        this.camera.translate(move2, 1);
    }
}

这个移动摄像机的视角会变化,观察旋转没变。为什么位置增量不一样呢?

额,我们节点没有 translate 接口啊,你自己实现的?

有这个方法啊。可以正常运行呢。

哦,我刚刚看错文件。

需要描述清楚一些表现是什么样的

将摄像机直接绑在角色节点上,摄像机跟随是正常的。

将摄像机从角色节点中移出来,用角色位置的增量变量来设置摄像机的增量变化,z轴的跟随效果不对(不管x是否同步修改)。

update(deltaTime: number) {
if (this.radian != 0) {
let move = new Vec3(Math.cos(this.radian) * this.speed.x, 0, -Math.sin(this.radian) * this.speed.z);
this.node.translate(move, 1);
let move2 = new Vec3(0, 0, move.z);
this.camera.translate(move2, 1);
}
}

node 是角色节点
camera 是摄像机节点

两个节点没有父子关系。

可以移动前后对比一下两者的 world transform。尝试一下当两者在同一个父节点下的时候是不是正确的

两者在同一个父节点下的时候和在Scene下是一样的。

移动前后对两者的 world transform变化增量的值不一样。在提问时就测试过了。

你的 translate 传递的参数是世界坐标(第二个参数坐标系是 WORLD),
那么父节点中的旋转和缩放都会影响实际在各轴向的增量值,可能的看看 demo 才有可能判断了,不确定是不是有问题

test.zip (952.9 KB)

简单demo,直接运行可以看到效果:

现象:role节点和camera节点无父子关系,增加同样的增量,视角会变.

调整了一下场景结构先解决了问题



用只包含位移信息的 camera holder 来跟踪即可。

之前的效果问题主要是因为 Camera 上包含旋转,而在位移增量通过旋转的逆计算之后,变成了 Y 和 Z 两个轴向上的增量,导致摄像机除了前移还会向上移动,具体这个表现是否正确我们还在确认