You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

3D游戏引擎中相机平面移动、旋转及Z轴距离调整实现咨询

相机控制功能实现方案

前置说明

基于你已实现的look_at函数和旋转/投影矩阵,所有操作都围绕相机位置cam、目标点target两个核心参数修改,无需额外搭建复杂坐标系,适配你当前的等距投影场景。


1. 相机在当前平面内上下左右移动

核心是计算平面内的移动向量,保持相机与目标的相对位置不变:

  • 计算视线方向向量:forward = normalize(target - cam)
  • 计算平面内左右方向向量(基于世界Z轴):right = normalize(cross(forward, vec3(0, 0, 1)))
  • 计算平面内上下方向向量:up_plane = normalize(cross(right, forward))
  • 按键触发移动时,同时更新cam和target:
    • 左右移动:cam += right * move_speed * delta_time;target += right * move_speed * delta_time
    • 上下移动:cam += up_plane * move_speed * delta_time;target += up_plane * move_speed * delta_time

2. 平面绕Z轴旋转

将相机与目标作为整体绕世界Z轴旋转,保持相对位置:

  • 定义旋转增量角度angle_step(根据按键输入设置,如每次按键加/减0.05弧度)
  • 用你已实现的rotate_z(angle_step)矩阵,分别计算相机和目标的新位置:
    • 相机相对原点向量:cam_rel = cam - vec3(0, 0, 0)
    • 新相机位置:new_cam = rotate_z(angle_step) * cam_rel
    • 目标相对原点向量:target_rel = target - vec3(0, 0, 0)
    • 新目标位置:new_target = rotate_z(angle_step) * target_rel
  • 更新cam = new_cam、target = new_target即可完成平面绕Z轴旋转

3. 调整相机所在平面与Z轴的距离

通过缩放相机/目标在XY平面的投影长度实现,保持视线方向不变:

  • 计算相机在XY平面的投影向量:cam_xy = vec3(cam.x, cam.y, 0)
  • 计算当前到Z轴的距离:current_dist = length(cam_xy)
  • 定义缩放因子scale_factor(如大于1增大距离,小于1减小)
  • 新相机投影向量:new_cam_xy = normalize(cam_xy) * (current_dist * scale_factor)
  • 新相机位置:new_cam = vec3(new_cam_xy.x, new_cam_xy.y, cam.z)
  • 同理处理目标点:
    • target_xy = vec3(target.x, target.y, 0)
    • new_target_xy = normalize(target_xy) * (length(target_xy) * scale_factor)
    • new_target = vec3(new_target_xy.x, new_target_xy.y, target.z)
  • 更新cam和target完成距离调整

矩阵 vs 四元数选择

你当前的需求均为绕固定世界Z轴的旋转,且已实现成熟的列主序旋转矩阵,直接用矩阵实现即可:

  • 矩阵代码复用性高,你已有现成的rotate_z函数,无需额外编写四元数转矩阵、四元数乘法等逻辑
  • 四元数优势在于解决万向锁、任意轴旋转或平滑插值,你的场景暂不需要这些特性,引入四元数只会增加不必要的复杂度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:33:38