You need to enable JavaScript to run this app. HTML 2D Canvas下JavaScript伪3D游戏摄像头转向功能实现求助
优惠活动
大模型
产品
解决方案
定价
更多

HTML 2D Canvas下JavaScript伪3D游戏摄像头转向功能实现求助

要实现左右转头的视角旋转效果,你需要给相机增加水平旋转属性,再通过旋转矩阵对场景中所有实体的坐标做变换后再投影,具体改动如下:

1. 扩展相机属性

给camera对象新增旋转角度和旋转速度的参数,角度用弧度计量:

var camera = {
    xSpeed: 0,
    ySpeed: 0,
    zSpeed: 0,
    rot: 0, // 水平旋转角度,默认朝前
    rotSpeed: 0 // 旋转速度
}

2. 修改实体的更新逻辑

在计算投影前,先对实体的x、z坐标应用旋转变换,模拟相机转动的效果:

update() {
    // 应用相机旋转变换
    const cos = Math.cos(camera.rot);
    const sin = Math.sin(camera.rot);
    const transformedX = cos * this.x + sin * this.z;
    const transformedZ = -sin * this.x + cos * this.z;
    this.transformedZ = transformedZ; // 存下来用于深度排序

    // 投影计算改用变换后的坐标
    this.rs = 400/(400 + transformedZ);
    this.rx = ((transformedX * this.rs) + 400);
    this.ry = (this.y * this.rs) + 400;

    // 移动逻辑不变
    this.x += camera.xSpeed;
    this.y += camera.ySpeed;
    this.z += camera.zSpeed;
}

3. 修改实体深度排序规则

改用变换后的z坐标做排序,保证遮挡关系正确:

entities.sort(function(i, i2) {
    return i2.transformedZ - i.transformedZ;
})

4. 修改可见性判断逻辑

渲染前的可见性判断也要用变换后的z坐标,避免转身后的物体被错误过滤:

//draw entities
for(let i = 0; i < entities.length; i++) {
    if(entities[i].transformedZ > -400) {
        entities[i].render();
    }
}

5. 新增旋转的按键控制

这里我们用A、D键控制左右转头,修改keyDown和keyUp函数:

function keyDown(e) {
    switch(e.keyCode) {
        case 39:
            camera.xSpeed = -5;
            break;
        case 37:
            camera.xSpeed = 5;
            break;
        case 38:
            camera.zSpeed = -5;
            break;
        case 40:
            camera.zSpeed = 5;
            break;
        case 65: // A键 向左转头
            camera.rotSpeed = 0.05;
            break;
        case 68: // D键 向右转头
            camera.rotSpeed = -0.05;
            break;
    }
}

function keyUp(e) {
    switch(e.keyCode) {
        case 39:
        case 37:
            camera.xSpeed = 0;
            break;
        case 38:
        case 40:
            camera.zSpeed = 0;
            break;
        case 65:
        case 68:
            camera.rotSpeed = 0;
            break;
    }
}

6. 每帧更新相机旋转角度

在update函数开头加上相机角度的更新:

function update() {
    // 更新相机旋转角度
    camera.rot += camera.rotSpeed;
    // 原有逻辑不变
    for(let i = 0; i < entities.length; i++) {
        entities[i].update();
    }
    entities.sort(function(i, i2) {
        return i2.transformedZ - i.transformedZ;
    })
    render();
    requestAnimationFrame(update);
}

改完之后按A和D就可以左右转头查看身后的场景了,原有方向键的平移功能也可以正常使用。

内容的提问来源于stack exchange,提问作者ChandraGupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 22:45:04