如何提取3D欧拉旋转相机的水平旋转分量并生成新相机
提取3D相机的水平旋转分量(仅保留Z轴旋转)
针对你的需求——复制带欧拉旋转动画的3D相机并仅保留水平(Z轴)旋转分量,以下是三种可通过脚本实现的方案,适配不同的旋转表示方式:
方法1:直接从欧拉角提取(最简便,适配原相机的欧拉动画)
由于原相机使用欧拉旋转动画,直接提取Z轴的旋转关键帧即可,新相机的X、Y轴旋转固定为0。
Fusion Lua脚本示例
-- 选中原相机后运行此脚本 local originalCam = comp.ActiveTool if not originalCam or originalCam.ID ~= "Camera3D" then print("请选中一个3D相机") return end -- 创建新相机 local newCam = comp:AddTool("Camera3D") newCam:SetAttrs({TOOL_Name = originalCam.Name .. "_OnlyZRot"}) -- 复制非旋转属性(位置、FOV等) newCam.Center:SetValue(originalCam.Center:GetValue()) newCam.FOV:SetValue(originalCam.FOV:GetValue()) newCam.NearClip:SetValue(originalCam.NearClip:GetValue()) newCam.FarClip:SetValue(originalCam.FarClip:GetValue()) -- 处理旋转动画:仅保留Z轴关键帧 local originalRot = originalCam.Rotation local newRot = newCam.Rotation -- 清除新相机默认旋转关键帧 newRot:DeleteAllKeys() -- 遍历原相机旋转关键帧,仅复制Z分量 for keyIdx = 1, originalRot:GetNumKeys() do local keyTime = originalRot:GetKeyTime(keyIdx) local rotValues = originalRot:GetKeyValue(keyIdx) -- X、Y设为0,仅保留Z轴旋转值 newRot:SetKey(keyTime, {X = 0, Y = 0, Z = rotValues.Z}) end
方法2:通过四元数提取Z轴旋转分量
如果需要从四元数格式的旋转中提取Z轴分量,可通过以下步骤实现:
- 将原四元数转换为欧拉角,提取Z轴旋转角度(需匹配原旋转顺序,如XYZ)
- 用提取到的Z轴角度生成仅绕Z轴旋转的新四元数
Python示例代码
import math def quat_to_z_yaw(w, x, y, z): """将四元数转换为Z轴旋转角(弧度,XYZ旋转顺序)""" yaw = math.atan2(2 * (w * z + x * y), 1 - 2 * (y**2 + z**2)) return yaw def z_yaw_to_quat(yaw): """用Z轴旋转角生成仅绕Z轴旋转的四元数""" half_yaw = yaw / 2 return (math.cos(half_yaw), 0, 0, math.sin(half_yaw)) # 示例用法:假设原相机四元数为(w, x, y, z) original_quat = (0.9848, 0.0, 0.0, 0.1736) # 对应10度Z轴旋转 z_yaw = quat_to_z_yaw(*original_quat) new_quat = z_yaw_to_quat(z_yaw)
方法3:通过旋转矩阵提取Z轴旋转分量
从旋转矩阵中提取Z轴旋转角,再生成仅含Z轴旋转的矩阵:
Python示例代码
import math def matrix_to_z_yaw(rot_matrix): """从3x3旋转矩阵提取Z轴旋转角(弧度,XYZ旋转顺序)""" return math.atan2(rot_matrix[1][0], rot_matrix[0][0]) def z_yaw_to_matrix(yaw): """生成仅绕Z轴旋转的3x3矩阵""" cos_y = math.cos(yaw) sin_y = math.sin(yaw) return [ [cos_y, -sin_y, 0], [sin_y, cos_y, 0], [0, 0, 1] ]
关键注意事项
- 旋转顺序一致性:不同软件的欧拉角/四元数旋转顺序可能不同(如ZXY、YXZ),必须与原相机的旋转顺序匹配,否则提取的Z轴角度会出现偏差。Fusion默认使用XYZ旋转顺序,方法1可直接适配。
- 若原相机的旋转是通过关键帧动画实现,方法1的脚本可直接继承动画曲线的缓动、插值等属性,无需额外转换。
内容的提问来源于stack exchange,提问作者Jacob Danell
相关产品推荐
相关产品推荐

