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

如何提取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轴分量,可通过以下步骤实现:

  1. 将原四元数转换为欧拉角,提取Z轴旋转角度(需匹配原旋转顺序,如XYZ)
  2. 用提取到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:06:29