9. Conveyor Belt & Pallet Stacking - Förderbänder mit Paletten
Übersicht
Mit Conveyor Belt & Pallet Stacking können Boxen auf Förderbändern animiert und zu Paletten gestapelt werden.
📦 Beispiel: Eine Mühle zeigt Mehlsäcke auf einem Förderband, die am Ende zu einer aufnehmbaren Palette gestapelt werden.
Funktionsweise
- Förderband-Animation: Boxen bewegen sich entlang einer Spline-Kurve
- Pallet Stacking: Boxen werden am Ende zu Paletten gestapelt
- Zwei Modi: Visual (nur Anzeige) oder Real (aufnehmbare Paletten)
- Multi-Lane Support: Mehrere parallele oder sequentielle Förderbänder
Basis-Struktur (Single Lane)
<production id="flour_mill">
<productionStateVisuals
boxesPerCycle="6"
outputPerCycle="1000"
boxDuration="30"
splinePath="0>3|0|0"
invertDirection="false">
<!-- Box Template -->
<traveler index="0" node="0>3|0|0|0"/>
<!-- Pallet Stacking -->
<palletStacking mode="visual" capacityPerBox="166.67">
<palletTemplate node="0>3|0|1|0"/>
<spawnNode node="0>3|0|2"/>
<!-- Box Positionen auf Palette -->
<boxPosition index="0" node="0>3|0|3|0"/>
<boxPosition index="1" node="0>3|0|3|1"/>
<boxPosition index="2" node="0>3|0|3|2"/>
<boxPosition index="3" node="0>3|0|3|3"/>
<boxPosition index="4" node="0>3|0|3|4"/>
<boxPosition index="5" node="0>3|0|3|5"/>
</palletStacking>
</productionStateVisuals>
</production>
Spline muss im i3D als NURBS Curve existieren!
ProductionStateVisuals Parameter
| Parameter | Beschreibung | Pflicht | Standard |
|---|---|---|---|
boxesPerCycle | Anzahl Boxen pro Zyklus | ✅ | - |
outputPerCycle | Output in Litern pro Zyklus | ✅ | - |
boxDuration | Dauer in Sekunden pro Box | ✅ | - |
splinePath | Spline-Node (Single Lane) | ❌ | - |
invertDirection | Richtung invertieren (Single Lane) | ❌ | false |
laneMode | parallel oder sequential (Multi-Lane) | ❌ | parallel |
Traveler (Box Template)
Das <traveler> Element definiert das Box-Modell:
<traveler index="0" node="0>3|0|0|0"/>
index: Immer0(für zukünftige Erweiterungen)node: Transform-Node der Box im i3D
Der Node wird automatisch unsichtbar gemacht und für jede Box geklont!
Pallet Stacking Modi
Visual Mode (Nur Anzeige)
Paletten sind NICHT aufnehmbar - nur visuelle Darstellung:
<palletStacking mode="visual" capacityPerBox="166.67">
<palletTemplate node="0>3|0|1|0"/>
<spawnNode node="0>3|0|2"/>
<boxPosition index="0" node="0>3|0|3|0"/>
<boxPosition index="1" node="0>3|0|3|1"/>
<boxPosition index="2" node="0>3|0|3|2"/>
<boxPosition index="3" node="0>3|0|3|3"/>
<boxPosition index="4" node="0>3|0|3|4"/>
<boxPosition index="5" node="0>3|0|3|5"/>
</palletStacking>
Parameter:
mode="visual"- Nur visuelle DarstellungcapacityPerBox- Liter pro Box (z.B. 1000L / 6 Boxen = 166.67L)
Nutzen: Gut für schnelle Prototypen oder wenn keine echten Paletten gewünscht sind!
Real Mode (Aufnehmbare Paletten)
Paletten sind aufnehmbar mit Frontlader:
<palletStacking mode="real">
<palletTemplate node="0>3|0|1|0"/>
<spawnNode node="0>3|0|2"/>
<!-- Real Pallet Config -->
<realPallet
fillType="FLOUR"
filename="$data/objects/pallets/fillablePallet/fillablePallet.i3d"
capacityPerBox="250"
rotationY="0"/>
<boxPosition index="0" node="0>3|0|3|0"/>
<boxPosition index="1" node="0>3|0|3|1"/>
<!-- ... weitere boxPositions ... -->
<boxPosition index="11" node="0>3|0|3|11"/>
<!-- Detection Trigger -->
<detectionTrigger node="0>3|0|4"/>
</palletStacking>
RealPallet Parameter:
fillType- FillType der Palette (z.B. FLOUR, SUGAR)filename- i3D Datei der PalettecapacityPerBox- Liter pro Box (z.B. 250L)rotationY- Rotation in Grad (optional)
DetectionTrigger:
- Stoppt Produktion wenn Palette nicht entfernt wird
- Verhindert Paletten-Stapel-Chaos
fillType muss mit dem Output der Produktion übereinstimmen!
Box Positionen
Die <boxPosition> Nodes definieren wo Boxen auf der Palette platziert werden:
<!-- 2x3 Grid (6 Boxen) -->
<boxPosition index="0" node="0>3|0|3|0"/> <!-- Vorne Links -->
<boxPosition index="1" node="0>3|0|3|1"/> <!-- Vorne Rechts -->
<boxPosition index="2" node="0>3|0|3|2"/> <!-- Mitte Links -->
<boxPosition index="3" node="0>3|0|3|3"/> <!-- Mitte Rechts -->
<boxPosition index="4" node="0>3|0|3|4"/> <!-- Hinten Links -->
<boxPosition index="5" node="0>3|0|3|5"/> <!-- Hinten Rechts -->
Anzahl: Muss mit boxesPerCycle übereinstimmen!
Multi-Lane Configuration
Parallel Mode (Round-Robin)
Boxen werden abwechselnd auf Lanes verteilt:
<productionStateVisuals
boxesPerCycle="12"
outputPerCycle="6000"
boxDuration="20"
laneMode="parallel">
<!-- Lane 1 -->
<conveyorLane splinePath="0>4|0|0">
<traveler index="0" node="0>4|0|0|0"/>
<palletStacking mode="real">
<palletTemplate node="0>4|0|1|0"/>
<spawnNode node="0>4|0|2"/>
<realPallet fillType="SUGAR" filename="$data/objects/pallets/fillablePallet/fillablePallet.i3d" capacityPerBox="500"/>
<boxPosition index="0" node="0>4|0|3|0"/>
<boxPosition index="1" node="0>4|0|3|1"/>
<boxPosition index="2" node="0>4|0|3|2"/>
<boxPosition index="3" node="0>4|0|3|3"/>
<detectionTrigger node="0>4|0|4"/>
</palletStacking>
</conveyorLane>
<!-- Lane 2 -->
<conveyorLane splinePath="0>4|1|0">
<traveler index="0" node="0>4|1|0|0"/>
<palletStacking mode="real">
<!-- ... analog zu Lane 1 ... -->
</palletStacking>
</conveyorLane>
<!-- Lane 3 -->
<conveyorLane splinePath="0>4|2|0">
<traveler index="0" node="0>4|2|0|0"/>
<palletStacking mode="real">
<!-- ... analog zu Lane 1 ... -->
</palletStacking>
</conveyorLane>
</productionStateVisuals>
Verhalten:
- 12 Boxen gesamt
- Box 1 → Lane 1, Box 2 → Lane 2, Box 3 → Lane 3
- Box 4 → Lane 1, Box 5 → Lane 2, etc.
Sequential Mode
Lanes werden nacheinander befüllt:
<productionStateVisuals
boxesPerCycle="12"
outputPerCycle="2400"
boxDuration="15"
laneMode="sequential">
<!-- Lane 1 (erste 6 Boxen) -->
<conveyorLane splinePath="0>5|0|0">
<traveler index="0" node="0>5|0|0|0"/>
<palletStacking mode="visual" capacityPerBox="200">
<palletTemplate node="0>5|0|1|0"/>
<spawnNode node="0>5|0|2"/>
<boxPosition index="0" node="0>5|0|3|0"/>
<!-- ... 5 weitere boxPositions ... -->
</palletStacking>
</conveyorLane>
<!-- Lane 2 (nächste 6 Boxen) -->
<conveyorLane splinePath="0>5|1|0">
<traveler index="0" node="0>5|1|0|0"/>
<palletStacking mode="visual" capacityPerBox="200">
<!-- ... analog zu Lane 1 ... -->
</palletStacking>
</conveyorLane>
</productionStateVisuals>
Verhalten:
- Erste 6 Boxen → Lane 1
- Nächste 6 Boxen → Lane 2
- Lane 2 startet erst wenn Lane 1 voll ist
Nutzen: Sieht realistischer aus - eine Palette nach der anderen!
ConveyorLane Parameter
| Parameter | Beschreibung | Pflicht | Standard |
|---|---|---|---|
splinePath | Spline-Node für diese Lane | ✅ | - |
invertDirection | Richtung invertieren | ❌ | false |
outputFillType | FillType für Smart Switching | ❌ | - |
boxesPerCycle | Überschreibt globalen Wert | ❌ | Global |
outputPerCycle | Überschreibt globalen Wert | ❌ | Global |
boxDuration | Überschreibt globalen Wert | ❌ | Global |
Smart Lane Switching (outputFillType)
Verschiedene Lanes für verschiedene Produkte:
<productionStateVisuals boxesPerCycle="8" outputPerCycle="2000" boxDuration="20">
<!-- Lane für Apfelsaft -->
<conveyorLane splinePath="0>6|0|0" outputFillType="APPLE_JUICE">
<traveler index="0" node="0>6|0|0|0"/>
<palletStacking mode="real">
<realPallet fillType="APPLE_JUICE" filename="$data/objects/pallets/liquidTank/liquidTank.i3d" capacityPerBox="250"/>
<!-- ... -->
</palletStacking>
</conveyorLane>
<!-- Lane für Orangensaft -->
<conveyorLane splinePath="0>6|1|0" outputFillType="ORANGE_JUICE">
<traveler index="0" node="0>6|1|0|0"/>
<palletStacking mode="real">
<realPallet fillType="ORANGE_JUICE" filename="$data/objects/pallets/liquidTank/liquidTank.i3d" capacityPerBox="250"/>
<!-- ... -->
</palletStacking>
</conveyorLane>
</productionStateVisuals>
Kombiniert mit Production Templates für dynamische Rezepte!
Lane-spezifische Overrides
Jede Lane kann eigene Parameter haben:
<productionStateVisuals
boxesPerCycle="10"
outputPerCycle="5000"
boxDuration="25"
laneMode="parallel">
<!-- Schnelle Lane mit wenig Boxen -->
<conveyorLane
splinePath="0>7|0|0"
boxesPerCycle="4"
outputPerCycle="2000"
boxDuration="15">
<!-- ... -->
</conveyorLane>
<!-- Langsame Lane mit vielen Boxen -->
<conveyorLane
splinePath="0>7|1|0"
boxesPerCycle="8"
outputPerCycle="2000"
boxDuration="40">
<!-- ... -->
</conveyorLane>
<!-- Invertierte Lane -->
<conveyorLane
splinePath="0>7|2|0"
invertDirection="true"
boxesPerCycle="6"
outputPerCycle="1000"
boxDuration="30">
<!-- ... -->
</conveyorLane>
</productionStateVisuals>
Spline erstellen (Giants Editor)
Die Spline-Kurve muss im i3D als NURBS Curve existieren:
Wichtig:
- Spline wird automatisch vom System unsichtbar gemacht
- Spline-Länge bestimmt Förderband-Länge
- Mehr Control-Points = glattere Kurve
Die genaue Erstellung der Spline erfolgt im Giants Editor - siehe Giants Documentation
Beispiele
Example 1: Single Lane Visual
Einfachstes Setup - eine Lane mit visuellen Paletten:
<productionStateVisuals boxesPerCycle="6" outputPerCycle="1000" boxDuration="30" splinePath="0>3|0|0">
<traveler index="0" node="0>3|0|0|0"/>
<palletStacking mode="visual" capacityPerBox="166.67">
<palletTemplate node="0>3|0|1|0"/>
<spawnNode node="0>3|0|2"/>
<boxPosition index="0" node="0>3|0|3|0"/>
<boxPosition index="1" node="0>3|0|3|1"/>
<boxPosition index="2" node="0>3|0|3|2"/>
<boxPosition index="3" node="0>3|0|3|3"/>
<boxPosition index="4" node="0>3|0|3|4"/>
<boxPosition index="5" node="0>3|0|3|5"/>
</palletStacking>
</productionStateVisuals>
📁 Siehe: examples/example_01_single_lane_visual.xml
Example 2: Single Lane Real Pallets
Eine Lane mit aufnehmbaren Paletten:
<productionStateVisuals boxesPerCycle="12" outputPerCycle="3000" boxDuration="25" splinePath="0>3|0|0">
<traveler index="0" node="0>3|0|0|0"/>
<palletStacking mode="real">
<palletTemplate node="0>3|0|1|0"/>
<spawnNode node="0>3|0|2"/>
<realPallet
fillType="FLOUR"
filename="$data/objects/pallets/fillablePallet/fillablePallet.i3d"
capacityPerBox="250"
rotationY="0"/>
<!-- 12 Box Positionen (3x4 Grid) -->
<boxPosition index="0" node="0>3|0|3|0"/>
<!-- ... -->
<boxPosition index="11" node="0>3|0|3|11"/>
<detectionTrigger node="0>3|0|4"/>
</palletStacking>
</productionStateVisuals>
📁 Siehe: examples/example_02_single_lane_real_pallets.xml
Example 3: Multi-Lane Parallel
Drei Lanes mit Round-Robin Verteilung:
<productionStateVisuals
boxesPerCycle="12"
outputPerCycle="6000"
boxDuration="20"
laneMode="parallel">
<conveyorLane splinePath="0>4|0|0">
<traveler index="0" node="0>4|0|0|0"/>
<palletStacking mode="real">
<palletTemplate node="0>4|0|1|0"/>
<spawnNode node="0>4|0|2"/>
<realPallet fillType="SUGAR" filename="$data/objects/pallets/fillablePallet/fillablePallet.i3d" capacityPerBox="500"/>
<boxPosition index="0" node="0>4|0|3|0"/>
<boxPosition index="1" node="0>4|0|3|1"/>
<boxPosition index="2" node="0>4|0|3|2"/>
<boxPosition index="3" node="0>4|0|3|3"/>
<detectionTrigger node="0>4|0|4"/>
</palletStacking>
</conveyorLane>
<!-- Lane 2 & 3 analog -->
</productionStateVisuals>
📁 Siehe: examples/example_03_multi_lane_parallel.xml
Example 4: Multi-Lane Sequential
Zwei Lanes nacheinander:
<productionStateVisuals
boxesPerCycle="12"
outputPerCycle="2400"
boxDuration="15"
laneMode="sequential">
<conveyorLane splinePath="0>5|0|0">
<traveler index="0" node="0>5|0|0|0"/>
<palletStacking mode="visual" capacityPerBox="200">
<!-- ... 6 boxPositions ... -->
</palletStacking>
</conveyorLane>
<conveyorLane splinePath="0>5|1|0">
<traveler index="0" node="0>5|1|0|0"/>
<palletStacking mode="visual" capacityPerBox="200">
<!-- ... 6 boxPositions ... -->
</palletStacking>
</conveyorLane>
</productionStateVisuals>
📁 Siehe: examples/example_04_multi_lane_sequential.xml
Example 5: Smart Lane Switching
Verschiedene Lanes für verschiedene Produkte:
<productionStateVisuals boxesPerCycle="8" outputPerCycle="2000" boxDuration="20">
<conveyorLane splinePath="0>6|0|0" outputFillType="APPLE_JUICE">
<!-- ... -->
</conveyorLane>
<conveyorLane splinePath="0>6|1|0" outputFillType="ORANGE_JUICE">
<!-- ... -->
</conveyorLane>
<conveyorLane splinePath="0>6|2|0" outputFillType="GRAPE_JUICE">
<!-- ... -->
</conveyorLane>
</productionStateVisuals>
📁 Siehe: examples/example_05_multi_lane_smart_switching.xml
Example 6: Advanced Mixed
Jede Lane mit unterschiedlicher Konfiguration:
<productionStateVisuals boxesPerCycle="10" outputPerCycle="5000" boxDuration="25" laneMode="parallel">
<!-- Schnelle Lane -->
<conveyorLane splinePath="0>7|0|0" boxesPerCycle="4" outputPerCycle="2000" boxDuration="15">
<!-- ... -->
</conveyorLane>
<!-- Langsame Lane -->
<conveyorLane splinePath="0>7|1|0" boxesPerCycle="8" outputPerCycle="2000" boxDuration="40">
<!-- ... -->
</conveyorLane>
<!-- Invertierte Lane -->
<conveyorLane splinePath="0>7|2|0" invertDirection="true" boxesPerCycle="6" outputPerCycle="1000" boxDuration="30">
<!-- ... -->
</conveyorLane>
</productionStateVisuals>
📁 Siehe: examples/example_06_advanced_mixed.xml
Häufige Fehler
❌ Boxen erscheinen nicht
Ursache: Traveler-Node fehlt oder falsch
<!-- FALSCH -->
<productionStateVisuals splinePath="0>3|0|0">
<!-- Kein <traveler> Tag! -->
</productionStateVisuals>
<!-- RICHTIG -->
<productionStateVisuals splinePath="0>3|0|0">
<traveler index="0" node="0>3|0|0|0"/>
</productionStateVisuals>
❌ Paletten werden nicht gespawnt
Ursache: capacityPerBox fehlt oder falsch berechnet
<!-- FALSCH - capacityPerBox fehlt -->
<palletStacking mode="real">
<realPallet fillType="FLOUR" filename="..."/>
</palletStacking>
<!-- RICHTIG - capacityPerBox angegeben -->
<palletStacking mode="real">
<realPallet fillType="FLOUR" filename="..." capacityPerBox="250"/>
</palletStacking>
Berechnung:
- outputPerCycle / boxesPerCycle = capacityPerBox
- Beispiel: 3000 / 12 = 250 Liter pro Box
❌ Produktion stoppt unerwartet
Ursache: DetectionTrigger blockiert weil Palette nicht entfernt wurde
<!-- Real Mode braucht detectionTrigger -->
<palletStacking mode="real">
<realPallet fillType="FLOUR" filename="..." capacityPerBox="250"/>
<boxPosition index="0" node="..."/>
<!-- ... -->
<detectionTrigger node="0>3|0|4"/> <!-- Wichtig! -->
</palletStacking>
Lösung: Palette mit einem Gabelstapler oder weiteres entfernen.
❌ Multi-Lane funktioniert nicht
Ursache: laneMode nicht gesetzt
<!-- FALSCH - laneMode fehlt -->
<productionStateVisuals boxesPerCycle="12" outputPerCycle="6000" boxDuration="20">
<conveyorLane splinePath="0>4|0|0">...</conveyorLane>
<conveyorLane splinePath="0>4|1|0">...</conveyorLane>
</productionStateVisuals>
<!-- RICHTIG -->
<productionStateVisuals boxesPerCycle="12" outputPerCycle="6000" boxDuration="20" laneMode="parallel">
<conveyorLane splinePath="0>4|0|0">...</conveyorLane>
<conveyorLane splinePath="0>4|1|0">...</conveyorLane>
</productionStateVisuals>
❌ Box-Anzahl passt nicht
Ursache: Anzahl <boxPosition> stimmt nicht mit boxesPerCycle überein
<!-- FALSCH - 6 boxesPerCycle aber nur 4 boxPositions -->
<productionStateVisuals boxesPerCycle="6">
<palletStacking mode="visual">
<boxPosition index="0" node="..."/>
<boxPosition index="1" node="..."/>
<boxPosition index="2" node="..."/>
<boxPosition index="3" node="..."/>
<!-- Fehlt: index 4 und 5! -->
</palletStacking>
</productionStateVisuals>
<!-- RICHTIG - 6 boxesPerCycle = 6 boxPositions -->
<productionStateVisuals boxesPerCycle="6">
<palletStacking mode="visual">
<boxPosition index="0" node="..."/>
<boxPosition index="1" node="..."/>
<boxPosition index="2" node="..."/>
<boxPosition index="3" node="..."/>
<boxPosition index="4" node="..."/>
<boxPosition index="5" node="..."/>
</palletStacking>
</productionStateVisuals>
Performance-Tipps
✅ Nicht zu viele Boxen
<!-- Gut für Performance -->
<productionStateVisuals boxesPerCycle="6">
<!-- Okay -->
<productionStateVisuals boxesPerCycle="12">
<!-- Zu viel - Performance-Probleme möglich -->
<productionStateVisuals boxesPerCycle="30">
✅ Visual statt Real bei vielen Lanes
<!-- Besser für Performance - keine echten Paletten -->
<palletStacking mode="visual" capacityPerBox="166.67">
Integration mit Visual Slots
Seit Version 0.9.0 können fertige Paletten vom Conveyor Belt direkt in Visual Slots "teleportiert" werden!
Kombination: mode="visual" + Visual Slots
Use Case: Paletten werden auf dem Belt gebaut, verschwinden dann und erscheinen im Regal
<production id="sugar_production" cyclesPerHour="2">
<outputs>
<output fillType="SUGAR" amount="1000" />
</outputs>
<!-- Conveyor Belt mit Visual Mode -->
<productionStateVisuals boxesPerCycle="12" outputPerCycle="1000" boxDuration="20" splinePath="0>9|0">
<traveler node="0>9|0|0" />
<palletStacking mode="visual" capacityPerBox="83.3">
<palletTemplate node="0>9|0|2"/>
<spawnNode node="0>9|0|1"/>
<!-- 12 Box Positionen -->
<boxPosition index="0" node="0>9|0|2|0"/>
<!-- ... bis index="11" ... -->
</palletStacking>
</productionStateVisuals>
</production>
<!-- Visual Slots mit Pallets-Modus -->
<visualSlots mode="pallets" litersPerPallet="1000">
<slot node="0>10|0" fillType="SUGAR"/>
<slot node="0>10|1" fillType="SUGAR"/>
<slot node="0>10|2" fillType="SUGAR"/>
<masterObjects>
<pallet node="0>11|0" fillType="SUGAR"/>
</masterObjects>
</visualSlots>
Workflow
- Produktion läuft → Boxen spawnen auf Belt
- 12 Boxen = Palette fertig → Palette wird gelöscht vom Belt
- Counter +1 →
finishedPalletsCountwird erhöht - Visual Slots → Palette erscheint im Regal!
Wichtige Parameter
PalletStacking:
mode="visual"- Paletten werden nur visuell gebautoutputPerCycle="1000"- Liter pro Zyklus
VisualSlots:
mode="pallets"- Zählt fertige Paletten (nicht prozentual!)litersPerPallet="1000"- Muss mitoutputPerCycleübereinstimmen!
Vorteile
✅ Paletten "wandern" vom Belt ins Regal ✅ Exakte Paletten-Counts (nicht prozentual) ✅ Mehr Regal-Slots nötig, aber visuell korrekt ✅ Kombination aus Dynamik (Belt) und Storage (Regal)
Für realistische Produktionsanlagen:
- Conveyor Belt für die Produktion (dynamisch)
- Visual Slots für das Lager (statisch)
- Perfekte Kombination!
Verwandte Features
- Production Templates - Kombinierbar mit Smart Lane Switching
- Visual Slots - Regal-System mit mode="pallets"
Zusammenfassung
✅ Animierte Boxen auf Förderbändern ✅ Visual oder Real Pallet Stacking ✅ Single Lane oder Multi-Lane ✅ Parallel oder Sequential Mode ✅ Smart Lane Switching mit outputFillType ✅ Lane-spezifische Parameter ✅ DetectionTrigger stoppt bei voller Palette ✅ Integration mit Visual Slots (mode="pallets") ✅ Paletten "teleportieren" vom Belt ins Regal ✅ Multiplayer-kompatibel