Zum Hauptinhalt springen

9. Conveyor Belt & Pallet Stacking - Förderbänder mit Paletten

Übersicht

Warnung außerhalb der Saison 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>
WICHTIG

Spline muss im i3D als NURBS Curve existieren!

ProductionStateVisuals Parameter

ParameterBeschreibungPflichtStandard
boxesPerCycleAnzahl Boxen pro Zyklus-
outputPerCycleOutput in Litern pro Zyklus-
boxDurationDauer in Sekunden pro Box-
splinePathSpline-Node (Single Lane)-
invertDirectionRichtung invertieren (Single Lane)false
laneModeparallel 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: Immer 0 (für zukünftige Erweiterungen)
  • node: Transform-Node der Box im i3D
WICHTIG

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 Darstellung
  • capacityPerBox - Liter pro Box (z.B. 1000L / 6 Boxen = 166.67L)
Optional

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 Palette
  • capacityPerBox - Liter pro Box (z.B. 250L)
  • rotationY - Rotation in Grad (optional)

DetectionTrigger:

  • Stoppt Produktion wenn Palette nicht entfernt wird
  • Verhindert Paletten-Stapel-Chaos
WICHTIG

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 -->
Hinweis

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
Hinweis

Nutzen: Sieht realistischer aus - eine Palette nach der anderen!

ConveyorLane Parameter

ParameterBeschreibungPflichtStandard
splinePathSpline-Node für diese Lane-
invertDirectionRichtung invertierenfalse
outputFillTypeFillType für Smart Switching-
boxesPerCycleÜberschreibt globalen WertGlobal
outputPerCycleÜberschreibt globalen WertGlobal
boxDurationÜberschreibt globalen WertGlobal

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>
Hinweis

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
WICHTIG

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>
Hinweis

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

  1. Produktion läuft → Boxen spawnen auf Belt
  2. 12 Boxen = Palette fertig → Palette wird gelöscht vom Belt
  3. Counter +1finishedPalletsCount wird erhöht
  4. Visual Slots → Palette erscheint im Regal!

Wichtige Parameter

PalletStacking:

  • mode="visual" - Paletten werden nur visuell gebaut
  • outputPerCycle="1000" - Liter pro Zyklus

VisualSlots:

  • mode="pallets" - Zählt fertige Paletten (nicht prozentual!)
  • litersPerPallet="1000" - Muss mit outputPerCycle ü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)

Tipp

Für realistische Produktionsanlagen:

  • Conveyor Belt für die Produktion (dynamisch)
  • Visual Slots für das Lager (statisch)
  • Perfekte Kombination!

Verwandte Features

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