From b4fed4fbb882c107e50fc0da0b69287c238654c5 Mon Sep 17 00:00:00 2001 From: Ying-Li Niu <64801511@qq.com> Date: Fri, 12 Jun 2026 08:06:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BF=90=E5=8A=A8=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=BA=A4=E5=8F=A0=E6=97=B6=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=AE=B5=E4=BE=9D=E6=AC=A1=E4=BD=9C=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前只取了第一个活动段 active[0],时间交叠时后面的段被忽略。 改为遍历所有段,按文件顺序依次施加平移和旋转。 排在前面的段优先作用于相机位置(矩阵非对易性保证)。 --- draw.py | 28 +++++++++++++-------------- examples/case06/input/move_camera.txt | 3 ++- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/draw.py b/draw.py index bcbbbca..f22ba9b 100644 --- a/draw.py +++ b/draw.py @@ -598,23 +598,23 @@ if _CAM_MOTION: def _update_motion_camera(f_idx): - """速度段驱动:每帧累加平移/旋转。""" + """速度段驱动:每帧累加平移/旋转。 + + 时间交叠时所有段同时生效,按文件中出现的顺序依次作用。 + 矩阵操作不具有对易性,排在前面的段优先作用于相机位置。 + """ if not _CAM_MOTION: return global _cam_center, _cam_elev, _cam_azim, _cam_dist - # 找当前帧属于哪个段 - active = [seg for seg in _CAM_MOTION - if seg["start"] <= f_idx < seg["end"]] - if not active: - return - seg = active[0] - _cam_center[0] += seg["v"][0] - _cam_center[1] += seg["v"][1] - _cam_center[2] += seg["v"][2] - # rx → elevation, ry → azimuth, rz → 距离变化(绕z=roll/螺旋) - _cam_elev += seg["r"][0] - _cam_azim += seg["r"][1] - _cam_dist += seg["r"][2] * 0 # rz 可以忽略或做其他用途 + # 找当前帧所有活动的段(时间交叠=同时作用),按文件顺序依次应用 + for seg in _CAM_MOTION: + if seg["start"] <= f_idx < seg["end"]: + _cam_center[0] += seg["v"][0] + _cam_center[1] += seg["v"][1] + _cam_center[2] += seg["v"][2] + _cam_elev += seg["r"][0] + _cam_azim += seg["r"][1] + # rz 预留 view.camera.center = tuple(_cam_center) view.camera.distance = _cam_dist diff --git a/examples/case06/input/move_camera.txt b/examples/case06/input/move_camera.txt index 50d45aa..a3063c7 100644 --- a/examples/case06/input/move_camera.txt +++ b/examples/case06/input/move_camera.txt @@ -5,4 +5,5 @@ # rx → elevation(俯仰), ry → azimuth(方位), rz → (预留) # # 示例:前60帧向右平移+绕x旋转,30-90帧向上平移+绕y绕z旋转 -1-200 vx=0.01 +1-60 vx=0.02 rx=1 +30-90 vy=0.02 ry=1 rz=1