feat(ui): Add gizmo manipulator for axis move/rotate (v0.3.0)
- New "操作器" toggle: select a file in the tree and a 3-axis gizmo appears at its center -- XYZ arrows (TranslateManipulator) to move along an axis regardless of view angle, and rotation rings (RotateManipulator) to rotate any angle about an axis - Manipulators bind to a proxy ModelVisual3D; the proxy's transform is mirrored to all target BodyVisuals during drag (GPU-side, temp) - On release the accumulated transform is baked into B-rep via TransformRoot (deferred with Dispatcher.BeginInvoke to avoid reentrancy with the manipulator's own mouse-up handling); the gizmo re-centers on the new bounds - Temporary transforms are cleared with Transform3D.Identity, never null (HelixToolkit GetTransform crashes on null child.Transform) - Selecting another file retargets the gizmo; removing the target hides it - Docs updated (ARCHITECTURE Phase 10, CLAUDE.md, README) Known limitation: gizmo handles are occluded inside solid parts (WPF single depth buffer). Next: always-on-top overlay viewport. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -44,7 +44,12 @@ dotnet publish src/STPViewer -c Release -o publish/STPViewer
|
||||
合併網格的 hit-test 走 `_mergedMap`(合併 Model → leaf);拖曳中邊線用 `_edgesSuspended` 暫停
|
||||
- ⚠️ **`Visual3D.Transform` 永遠不要設成 `null`,清除要用 `Transform3D.Identity`**。HelixToolkit `Viewport3DHelper.GetTransform`
|
||||
對 `child.Transform` 沒做 null 檢查(`GeneralTransform3DGroup.Children.Add(null)` → 拋「無法新增空值到集合中」),
|
||||
之後任何 `FindHits` 都會 crash。v0.2.1 修的就是拖曳放開時把 BodyVisual.Transform 設 null(拖過一次後再點擊就炸)
|
||||
之後任何 `FindHits` 都會 crash。v0.2.1 修的就是拖曳放開時把 BodyVisual.Transform 設 null(拖過一次後再點擊就炸)。
|
||||
Gizmo 的暫時 Transform 清除同理一律用 Identity
|
||||
- Gizmo 操作器:Helix `TranslateManipulator`/`RotateManipulator` ×6 `Bind` 到代理 `ModelVisual3D`,
|
||||
代理 Transform 變更(`DependencyPropertyDescriptor.AddValueChanged`)即時套到目標 BodyVisual(暫時);
|
||||
**放開滑鼠才 `TransformRoot` 烘焙** — MouseUp 被 manipulator 標 handled,MainWindow 用 `AddHandler(..., handledEventsToo: true)` 才收得到。
|
||||
烘焙用 `Dispatcher.BeginInvoke` 延後到 manipulator 自身事件處理完,避免 reentrancy;`_gizmoBaking` 旗標防 Transform 歸零的回呼重入
|
||||
- 干涉/面距/對齊等運算在背景執行緒;`Freeze()` 幾何後才跨執行緒
|
||||
- 匯入在背景執行緒;`Freeze()` 幾何後才跨執行緒
|
||||
- Commit 格式:Conventional Commits(`feat:` / `fix:` / `docs:` …)
|
||||
|
||||
Reference in New Issue
Block a user