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
相关产品推荐
相关产品推荐

