6.0 KiB
6.0 KiB
3D预览限制说明
重要提示 ⚠️
UI预览和最终渲染使用不同的技术
UI预览(实时预览)
UI中的预览使用以下技术:
-
2D近似模式(默认)
- 使用Canvas 2D渲染
- 通过2D变换模拟3D效果
- 性能好,但不是真正的3D透视
- 适合快速预览和调整
-
3D CSS模式(实验性)
- 使用CSS 3D transforms
- 提供更接近真实的3D效果
- 性能较低,可能有兼容性问题
- 仅用于预览,不影响最终渲染
最终渲染(后端Python)
点击"Run Node"后的最终渲染使用:
- 完整的3D透视投影
- 真实的矩阵变换
- 准确的深度排序
- 正确的透视变形
为什么预览和渲染不同?
技术限制
-
浏览器Canvas 2D
- 不支持真正的3D透视投影
- 只能模拟简单的3D效果
- 无法实现复杂的矩阵变换
-
性能考虑
- 实时预览需要高帧率(30-60fps)
- 完整3D计算会导致卡顿
- 2D近似提供流畅的交互体验
-
WebGL/WebGPU限制
- 需要额外的着色器编程
- 增加代码复杂度
- 兼容性问题
预览的作用
UI预览主要用于:
-
调整图层位置
- 快速移动图层
- 调整X、Y坐标
- 设置Z深度
-
设置关键帧
- 在时间轴上添加关键帧
- 预览动画轨迹
- 调整时间曲线
-
调整摄像机参数
- 设置摄像机位置
- 调整旋转角度
- 设置FOV
-
观察大致效果
- 了解图层的相对位置
- 预览动画的大致流程
- 检查图层是否可见
预览模式对比
2D近似模式
优点:
- ✅ 性能好,流畅
- ✅ 兼容性好
- ✅ 适合快速调整
缺点:
- ❌ 不是真正的3D透视
- ❌ 旋转效果不准确
- ❌ 无法预览复杂的3D变换
适用场景:
- 日常编辑和调整
- 设置关键帧
- 快速预览
3D CSS模式(实验性)
优点:
- ✅ 更接近真实3D效果
- ✅ 支持CSS 3D transforms
- ✅ 可以预览透视变形
缺点:
- ❌ 性能较低
- ❌ 可能有兼容性问题
- ❌ 仍然不是完整的3D渲染
- ❌ 不支持全景模式
适用场景:
- 需要更准确的预览
- 调试复杂的3D场景
- 最终检查前的预览
最终渲染的优势
后端Python渲染提供:
1. 完整的3D透视投影
# 构建透视投影矩阵
proj_matrix = Transform3D.build_projection_matrix(fov, aspect)
# 构建视图矩阵
view_matrix = Transform3D.build_view_matrix(
cam_pos_x, cam_pos_y, cam_pos_z,
cam_yaw, cam_pitch, cam_roll
)
# 构建模型矩阵
model_matrix = Transform3D.build_model_matrix(
x, y, z,
rot_x, rot_y, rot_z,
scale_x, scale_y, scale_z,
anchor_x, anchor_y
)
# MVP矩阵
mvp = proj_matrix @ view_matrix @ model_matrix
2. 准确的透视变换
- 使用OpenCV的
getPerspectiveTransform - 正确的透视除法
- 准确的深度排序
3. 全景模式支持
- 球面投影
- 正确的UV映射
- 支持360度全景图
4. 高质量渲染
- 任意分辨率
- 抗锯齿
- 正确的Alpha混合
工作流程建议
推荐工作流程
-
使用2D近似模式进行编辑
- 添加图层 - 设置位置和关键帧 - 调整摄像机参数 - 快速预览动画 -
切换到3D CSS模式检查
- 检查透视效果 - 验证图层深度 - 确认摄像机角度 -
运行最终渲染
- 点击"Run Node" - 等待渲染完成 - 检查输出结果 -
根据结果调整
- 如果效果不理想 - 返回UI调整参数 - 重新渲染
调试技巧
-
使用低分辨率测试
- 先用640×360测试
- 确认效果后再用高分辨率
-
分段渲染
- 使用start_frame和end_frame
- 只渲染关键帧附近
- 节省时间
-
使用图层Z值标记
- 前景:Z = -200 到 200
- 中景:Z = 0
- 背景:Z = 200 到 500
- 便于理解深度关系
-
摄像机参数记录
- 记录好的摄像机设置
- 创建预设
- 重复使用
全景模式特别说明
全景模式要求
-
必须启用摄像机
- 全景模式需要摄像机才能工作
- 确保"启用"复选框已勾选
-
背景图片比例
- 必须是2:1比例(如4096×2048)
- 允许±35%的误差
- 非2:1图片会使用普通模式
-
预览限制
- UI预览中全景效果可能不准确
- 最终渲染会使用完整的球面投影
全景模式工作原理
# 球面投影
lon = atan2(rx, rz)
lat = asin(ry)
# UV映射
u = (lon / (2π) + 0.5) * imgW
v = (-lat / π + 0.5) * imgH
# 重映射
img_np = cv2.remap(img_np, map_x, map_y,
cv2.INTER_LINEAR,
borderMode=cv2.BORDER_WRAP)
常见问题
Q: 为什么预览和渲染结果不一样?
A: 预览使用2D近似,渲染使用完整3D透视。这是正常的。
Q: 如何获得更准确的预览?
A:
- 切换到"3D CSS"预览模式
- 或者使用低分辨率快速渲染测试
Q: 全景模式在预览中不工作?
A:
- 确保启用了摄像机
- 检查背景图片是否为2:1比例
- 最终渲染会正确应用全景效果
Q: 3D CSS模式很卡怎么办?
A:
- 切换回2D近似模式
- 减少图层数量
- 降低预览分辨率
Q: 如何确认最终效果?
A:
- 使用低分辨率快速渲染
- 检查关键帧
- 确认后再用高分辨率
未来改进计划
- WebGPU实时3D预览
- 更准确的预览算法
- 预览质量选项
- 实时光线追踪预览
- 预览缓存优化
总结
记住:
- ✅ UI预览是近似效果,用于快速调整
- ✅ 最终渲染是准确的3D透视
- ✅ 全景模式需要启用摄像机
- ✅ 使用推荐工作流程提高效率
不要担心:
- ❌ 预览不准确是正常的
- ❌ 最终渲染会给出正确结果
- ❌ 这是技术限制,不是bug
如有疑问,请参考: