229 lines
7.8 KiB
Markdown
229 lines
7.8 KiB
Markdown
# 3D View & Part Preview
|
|
|
|
## Summary
|
|
|
|
The 3D View system provides interactive visualization and manipulation of 3D models and G-code. It combines OpenGL-accelerated rendering with a trackball camera system, object selection, transformation controls, and a hierarchical scene tree.
|
|
|
|
## Technical Description
|
|
|
|
### Core Components
|
|
|
|
The 3D preview system consists of several layered components:
|
|
|
|
```
|
|
View3DWidget
|
|
├── Object3DControlsLayer - Interaction handling, drawing coordination
|
|
│ ├── TrackballTumbleWidgetExtended - Camera rotation/pan/zoom
|
|
│ ├── FloorDrawable - Bed visualization
|
|
│ └── IObject3DControl instances - Transform handles
|
|
├── SelectedObjectPanel - Property editing
|
|
├── TreeView - Scene hierarchy browser
|
|
└── TumbleCubeControl - View orientation indicator
|
|
```
|
|
|
|
### Scene Context (ISceneContext)
|
|
|
|
The `ISceneContext` interface abstracts the 3D editing environment:
|
|
|
|
| Property | Type | Description |
|
|
|----------|------|-------------|
|
|
| `Scene` | `InteractiveScene` | Root scene graph |
|
|
| `World` | `WorldView` | Camera/projection state |
|
|
| `EditContext` | `EditContext` | Source file and content store |
|
|
| `ViewState` | `SceneContextViewState` | View configuration |
|
|
| `BedCenter` | `Vector2` | Print bed center point |
|
|
| `Printer` | `PrinterConfig` | Associated printer (optional) |
|
|
| `GCodeRenderer` | `GCodeRenderer` | G-code visualization |
|
|
|
|
**Key Methods:**
|
|
- `AddToPlate()` - Insert items into scene
|
|
- `ClearPlate()` - Remove all objects
|
|
- `LoadContent()` - Load from file/library
|
|
- `SaveChanges()` - Persist scene to disk
|
|
- `LoadGCode()` - Load G-code for preview
|
|
|
|
### View3DWidget
|
|
|
|
The main 3D viewport widget providing:
|
|
|
|
**Camera Control:**
|
|
- Trackball rotation (middle mouse / drag)
|
|
- Pan (Shift + drag)
|
|
- Zoom (scroll wheel / pinch)
|
|
- View cube for quick orientation
|
|
|
|
**Selection:**
|
|
- Click to select objects
|
|
- Ctrl+Click for multi-select
|
|
- Rectangular selection via drag
|
|
- Tree view synchronization
|
|
|
|
**Transform Modes:**
|
|
- Part Select - Object picking
|
|
- Translate - Move objects
|
|
- Rotate - Rotate around axes
|
|
- Zoom/Scale - Size adjustment
|
|
|
|
### Object3DControlsLayer
|
|
|
|
The interaction layer manages:
|
|
|
|
1. **3D Control Handles**: Transform gizmos for selected objects
|
|
2. **Drawable Registration**: Custom rendering callbacks
|
|
3. **Hit Testing**: Ray casting for object picking
|
|
4. **Floor Rendering**: Bed mesh and grid visualization
|
|
|
|
**Control Types (Flags):**
|
|
| Flag | Purpose |
|
|
|------|---------|
|
|
| `MoveInZ` | Vertical movement handle |
|
|
| `RotateXYZ` | 3-axis rotation gizmo |
|
|
| `RotateZ` | Z-axis only rotation |
|
|
| `ScaleMatrixXY` | XY scaling handles |
|
|
| `Shadow` | Object shadow rendering |
|
|
| `SnappingIndicators` | Snap guide display |
|
|
|
|
### Scene Graph (InteractiveScene)
|
|
|
|
The scene uses a hierarchical object model:
|
|
|
|
```
|
|
InteractiveScene
|
|
├── UndoBuffer - Change history
|
|
├── SelectedItem - Current selection
|
|
└── Children (IObject3D)
|
|
├── Meshes
|
|
├── Groups
|
|
└── Operations (CSG, transforms, etc.)
|
|
```
|
|
|
|
**IObject3D Interface:**
|
|
| Property | Type | Description |
|
|
|----------|------|-------------|
|
|
| `ID` | `string` | Unique identifier |
|
|
| `Name` | `string` | Display name |
|
|
| `Matrix` | `Matrix4X4` | Local transform |
|
|
| `Color` | `Color` | Material color |
|
|
| `MaterialIndex` | `int` | Material assignment |
|
|
| `OutputType` | `PrintOutputTypes` | Print behavior |
|
|
| `Children` | `SafeList<IObject3D>` | Child objects |
|
|
| `Mesh` | `Mesh` | Geometry data |
|
|
|
|
### Camera System
|
|
|
|
The `WorldView` class manages:
|
|
|
|
- **Model Matrix**: Scene rotation/position
|
|
- **View Matrix**: Camera position/orientation
|
|
- **Projection Matrix**: Perspective or orthographic
|
|
- **Near/Far Planes**: Dynamic clipping adjustment
|
|
|
|
**TrackballTumbleWidgetExtended** extends basic trackball with:
|
|
- Smooth momentum rotation
|
|
- Double-click to fit view
|
|
- Keyboard navigation (arrow keys)
|
|
- Dynamic near/far plane calculation
|
|
|
|
### GCode Visualization
|
|
|
|
When viewing G-code:
|
|
|
|
```
|
|
GCodeRenderer
|
|
├── GCodeFile - Parsed G-code data
|
|
├── RenderInfo - Layer/speed coloring
|
|
└── Layer visualization
|
|
├── Travel moves (thin lines)
|
|
├── Extrusion (thick, colored)
|
|
└── Retractions (markers)
|
|
```
|
|
|
|
**Layer Controls:**
|
|
- `ActiveLayerIndex` - Current layer
|
|
- `SliceLayerSelector` - Layer scrubber widget
|
|
- Speed/feature coloring modes
|
|
|
|
### Tree View Integration
|
|
|
|
The scene tree (`TreeView`) provides:
|
|
|
|
- Hierarchical object display
|
|
- Drag-and-drop reordering
|
|
- Right-click context menus
|
|
- Selection synchronization
|
|
- Expand/collapse groups
|
|
|
|
**Object3DTreeBuilder** creates tree nodes from scene:
|
|
```csharp
|
|
treeNodeContainer.AddChild(Object3DTreeBuilder.Build(scene, treeView));
|
|
```
|
|
|
|
### Selected Object Panel
|
|
|
|
Property editing for selected objects:
|
|
|
|
```
|
|
SelectedObjectPanel
|
|
├── Object name/color editors
|
|
├── Transform fields (X, Y, Z, rotation)
|
|
├── Material selection
|
|
└── Operation-specific editors
|
|
├── Primitive parameters
|
|
├── Boolean operation settings
|
|
└── Custom object3D properties
|
|
```
|
|
|
|
### Design Rationale
|
|
|
|
**Layered Architecture**: Separating View3DWidget, Object3DControlsLayer, and TrackballTumbleWidget allows:
|
|
- Independent testing of each layer
|
|
- Flexible composition (e.g., GCode-only vs full editing)
|
|
- Clear responsibility boundaries
|
|
|
|
**ISceneContext Abstraction**: Decouples view from editing context, enabling:
|
|
- Same view for printer beds and standalone designs
|
|
- Consistent API across different content types
|
|
- Easy mocking for tests
|
|
|
|
**Dynamic Near/Far Planes**: Automatically adjusting clipping planes based on scene bounds prevents:
|
|
- Z-fighting on large objects
|
|
- Clipping on small detailed parts
|
|
- Visual artifacts at extreme zooms
|
|
|
|
## Reference
|
|
|
|
### Core Classes
|
|
|
|
| Class | Location | Description |
|
|
|-------|----------|-------------|
|
|
| `View3DWidget` | [View3D/View3DWidget.cs](MatterControlLib/PartPreviewWindow/View3D/View3DWidget.cs) | Main 3D viewport |
|
|
| `Object3DControlsLayer` | [View3D/Object3DControlsLayer.cs](MatterControlLib/PartPreviewWindow/View3D/Object3DControlsLayer.cs) | Interaction layer |
|
|
| `TrackballTumbleWidgetExtended` | [View3D/TrackballTumbleWidgetExtended.cs](MatterControlLib/PartPreviewWindow/View3D/TrackballTumbleWidgetExtended.cs) | Camera controls |
|
|
| `TumbleCubeControl` | [View3D/TumbleCubeControl.cs](MatterControlLib/PartPreviewWindow/View3D/TumbleCubeControl.cs) | View cube widget |
|
|
| `SelectedObjectPanel` | [PartPreviewWindow/SelectedObjectPanel.cs](MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs) | Property panel |
|
|
|
|
### Scene Classes
|
|
|
|
| Class | Location | Description |
|
|
|-------|----------|-------------|
|
|
| `ISceneContext` | [ApplicationView/ISceneContext.cs](MatterControlLib/ApplicationView/ISceneContext.cs) | Scene context interface |
|
|
| `InteractiveScene` | Submodules/agg-sharp/DataConverters3D | Scene root |
|
|
| `IObject3D` | Submodules/agg-sharp/DataConverters3D | Object interface |
|
|
| `EditContext` | [ApplicationView/EditContext.cs](MatterControlLib/ApplicationView/EditContext.cs) | Edit state |
|
|
|
|
### Interaction Classes
|
|
|
|
| Class | Location | Description |
|
|
|-------|----------|-------------|
|
|
| `IObject3DControl` | [View3D/Interaction/IObject3DControl.cs](MatterControlLib/PartPreviewWindow/View3D/Interaction/IObject3DControl.cs) | Control handle interface |
|
|
| `Object3DControl` | [View3D/Interaction/Object3DControl.cs](MatterControlLib/PartPreviewWindow/View3D/Interaction/Object3DControl.cs) | Base control |
|
|
| `SceneActions` | [View3D/SceneActions.cs](MatterControlLib/PartPreviewWindow/View3D/SceneActions.cs) | Scene operations |
|
|
|
|
### Rendering
|
|
|
|
| Class | Location | Description |
|
|
|-------|----------|-------------|
|
|
| `GCodeRenderer` | Submodules/agg-sharp | G-code visualization |
|
|
| `FloorDrawable` | Internal | Bed/grid rendering |
|
|
| `BedMeshGenerator` | [View3D/BedMeshGenerator.cs](MatterControlLib/PartPreviewWindow/View3D/BedMeshGenerator.cs) | Bed geometry |
|
|
| `WorldView` | Submodules/agg-sharp/VectorMath | Camera/projection |
|