3ds Max 导入到 After Effects 还原摄像机要注意事项--deepseek
我:dp我这有两个脚本分别是syn软件相机导出到max的和syn软件相机导出到ae的,你能看出差别来吗?如果我想把max里的相机导入到ae里,保持原来的位置方向,该怎么做
dp:从这两个脚本可以看出,3ds Max 和 After Effects 在摄像机坐标系和参数传递方式上存在重要差异:
主要差异分析:
-
坐标系差异:
- 3ds Max 使用 Y-up / Z-forward 右手坐标系
- After Effects 使用 Z-up / Y-forward 左手坐标系
- 坐标轴转换需要:
(X, Y, Z) → (X, Z, -Y)
-
参数传递方式:
- MaxScript 直接设置变换矩阵:
newobj.transform = matrix3 [1,0,0][0,0,1][0,-1,0][0,-100,10]
- AE 脚本单独设置位置和旋转参数:
- MaxScript 直接设置变换矩阵:
-
position.setValue([320, 140, -1000]) rotationZ.setValue(-0.0)
FOV 传递差异:
- 3ds Max 使用水平 FOV (45°)
- After Effects 使用垂直 FOV (通过 zoom 值 772.55 推导)
转换解决方案:
-
坐标系转换公式:
# 位置转换 ae_pos = [max_pos.x, max_pos.z, -max_pos.y] # 旋转转换(欧拉角) ae_rot_x = max_rot.x ae_rot_y = max_rot.z ae_rot_z = -max_rot.y
-
FOV 转换算法:
def max_fov_to_ae_zoom(h_fov, film_width=36, resolution=640): focal_length = (film_width/2) / math.tan(math.radians(h_fov/2)) return focal_length * (resolution/film_width)
推荐工作流程:
-
数据提取(3ds Max 端):
-
for t in animationRange do ( at time t ( pos = camera.pos rot = camera.rotation fov = camera.fov ) format "%,%,%,%,%,%,%\n" t pos.x pos.y pos.z rot.x rot.y rot.z fov )
-
AE 导入脚本示例:
// 创建摄像机
var camera = comp.layers.addCamera("MaxCamera", [0,0]);
// 设置坐标系转换后的参数
camera.position.setValueAtTime(time, [
maxData.x * scaleFactor,
maxData.z * scaleFactor,
-maxData.y * scaleFactor
]);
// 设置转换后的旋转参数
camera.rotation.setValueAtTime(time, [
maxRot.x,
maxRot.z,
-maxRot.y
]);
// 设置 FOV
var zoomValue = (36/2) / Math.tan((maxFov * Math.PI/180)/2) * (comp.width/36);
camera.zoom.setValue(zoomValue);
注意事项:
- 使用
Auto-Orient
设置:camera.autoOrient = AutoOrientType.NO_AUTO_ORIENT
- 单位转换:3ds Max 使用系统单位(脚本中是英寸),AE 使用像素,需要比例因子转换
- 时间轴同步:检查帧率设置(30fps)和时间码对齐
- 建议使用中间坐标系转换工具(如 Boujou/PFTrack 的 AE 插件)进行自动转换
验证方法:
- 在 Max 中创建测试立方体(边长=场景单位)
- 导出摄像机后,在 AE 中创建相同尺寸的立方体
- 检查各轴向的对齐情况
- 使用摄像机投影测试纹理匹配度
这种转换需要精确的坐标系映射和单位转换,建议通过脚本自动化处理以避免手动误差。对于复杂动画,建议使用第三方转换工具(如 Lockdown Studio)进行批处理转换。