Teckids-Wiki

Luantier Motiv - Anleitung (mit Blender 5.0.1 gemacht)

Wie macht man ein Luantier-Motiv, so wie die, welche sich auf den T-Shirts von teckids befinden?
Diese Anleitung soll diese Frage beantworten.

Vorraussetzungen

Luanti, + Mods & Games

Luanti: Wir brauchen die Spiele-Engine/Platform Luanti, um unseren Weltausschnitt in Voxelibre zu bauen.


Voxelibre: Innerhalb von Luanti benötigen wir Voxelibre, ein Minecraft-ähnliches Spiel auf Luanti, welches wir verwenden wollen um den Weltausschnitt zu bauen, damit dieser im Minecraft-Stil ist.


Meshport: Eine Luanti-Mod, die wir benötigen ist, meshport. Diese verwenden wir um unseren Weltausschnitt als 3D-Modell aus Voxelibre zu exportieren.


Worldedit: Wir empfehlen zum Bauen der Welt, Worldedit, eine Mod welcher einem das Bauen des Weltausschnittes extrem erleichtert.


Tier-Mod: Wir benötigen für das Tiermodell (welches nicht mit meshport mit exportiert werden kann) einen beliebigen Tiermod aus Luanti, aus welchem wir dieses beziehen.

Preferierte Tiermods: Wilhelmines Animal World, Animalia

Blender, + add-on

Blender: Zum rendern des Motives bzw. zum Erstellen des Bildes mit dem Weltausschnitt und dem Tier, benötigen wir die 3D-Modellierungssoftware Blender.


.b3d-Importer: Um das Tiermodell in Blender in unseren Weltausschnitt einzufügen, benötigen wir ein add-on welches uns den Import von dem .b3d-Datentypen erlaubt, da Blender selber den .b3d-Datentypen nicht von default aus unterstützt.

Preferiertes add-on: https://github.com/joric/io_scene_b3d (Installationsanleitung ist gegeben)

Anleitung

Weltausschnitt bauen

Welt starten: Wir erstellen eine neue Welt in Voxelibre, diese soll mit dem mapgen singlenode erstellt werden. Außerdem sollte der Kreativmodus aktiviert sein.


Mods aktivieren: Zunächst gehen wir auf unsere Welt und aktivieren folgende mods: meshport & worldedit


Weltausschnitt bauen: Mithilfe von worldedit und vom Kreativmodus bauen wir nun den gewünschten Weltausschnitt. Hierbei sind zwei Dinge zu beachten.


Größe: Der Weltausschnitt sollte 16x16x16 Blöcke groß sein, wobei die Höhe nicht voll beansprucht sein sollte, außer es ist für das Motiv notwendig.


Wasser: Verwendet man Wasser am Rand des Weltausschnittes, so sollte man dieses mit Blöcken eingrenzen. Wenn man dies nicht tut, werden die nach außen zeigenden Seiten des Wassers im Export fehlen.

image.png


Weltausschnitt exportieren

Ausschnitt selektieren: Mit den chat-commands /mesh1 bzw. /mesh2 setzt man zwei Ecken, anhand von welchen eine Auswahl entsteht. Hierbei gibt es 3 Wege, eine Auswahl zu machen:

  1. Man platziert sich jeweils dort, wo man die Ecke platzieren will und führt den command alleine durch (/mesh1 bzw. /mesh2), was die Ecke dort platziert, wo man steht.
  2. Man gibt beim ausführen des commands die Koordinaten an (/mesh x y z), was die Ecke bei den jeweiligen Koordinaten platziert.
  3. Man nutzt den "Meshport Area Selector" (Werkzeug im Spiel) und schlägt den Block, wo man die Ecke platzieren will.

image.png

Ausschnitt exportieren: Um den Ausschnitt, welchen man nun mit meshport selektiert hat zu exportieren, führt man folgenden chat-command aus: /meshport [filename]. Dies exportiert die Selektion als .obj (3D-Modell) mit dazugehörigem .mtl (Material). Der Ort, wo dieser Export gespeichert wurde, wird nach dem Ausführen des commands im chat ausgegeben.

Weltausschnitt importieren

Blender öffnen: Wir öffnen zunächst Blender und entfernen den Kubus (z.B. durch selektieren und das Drücken der Entf bzw. Del Taste.


Modell importieren: Jetzt gehen wir in Blender auf File > Import > Wavefront (.obj) und selektieren aus dem Ordner, wo es sich befindet, das exportierte 3D-Modell und importieren es.

File > Import > Wavefront (.obj)
image.png

Nicht erschrecken, es sieht erstmal so aus:
image.png

Weltausschnitt anpassen

Texturen betrachten: Um nun unseren Weltausschnitt mit Texturen zu sehen, gehen wir oben rechts auf "Viewport Shading: Rendered", dies lässt uns sehen, wie das Endprodukt aussehen wird.
image.png


Beleuchtung anpassen: Im Moment ist das Modell sehr dunkel, unter anderem weil die Lichtquelle schwach und schlecht platziert ist. Um unser Modell besser zu sehen, können wir folgendes machen: Wir können in der Konsole rechts auf World Properties > Surface gehen, hier können wir nun die Farbe auf z.B. weiß setzen und die Stärke hiervon leicht hochdrehen, um das Modell als ganzes stärker zu beleuchten.
World Properties > Surface
image.png
Wir können aber auch die gegebene Lichtquelle bewegen (mit dem "Move" tool) und sowohl ihre Farbe als auch Stärke verändern, wie es uns gefällt. Wir können diese bei der Auflistung von Modellen usw. finden. Wenn man die Stärke, Art der Lichtquelle oder Farbe verändern will, muss man das cyane Symbol anklicken, dann öffnen sich unten rechts die Properties vom Licht.
image.png
World Properties > Surface
image.png


Texturschärfe & Semi-Transparenz: Jetzt, wo wir das Modell besser betrachten können, fällt auf, dass z.B. das Gras oder auch die Blumen einen schwarzen "Hintergrund" haben. In Luanti sind dies transparente Pixel, doch in Blender werden diese erstmals schwarz importiert. Außerdem sehen wir ebenfalls, dass die Texturen ein bisschen unscharf sind.

Aber um dies zu beheben hat uns meshport (die mod zum exportieren des Weltausschnittes), ein python-script mitgegeben, welches wir in Blender ausführen können, damit diese Texturprobleme behoben werden.

Wir gehen nun in Blender also auf den "Scripting" tab:
Screenshot from 2026-02-06 11-25-22.png
Hier gehen wir nun auf "New" und fügen hier den folgenden code ein, welchen wir dann ausführen während wir das Modell selektiert haben:

New:
image.png

Code ausführen:
image.png

image.png

materials.py (der code):

# Original script: random-geek
# Contributors: GreenXenith, sbrl, VorTechnix

### Use better materials and support alpha ###
# Usage: Open or copy script in Blender
# Run script WHILE OBJECT IS SELECTED

import bpy

targetMats = []

for obj in bpy.context.selected_objects:
    for slot in obj.material_slots:
        mat = slot.material

        if mat not in targetMats:
            targetMats.append(mat)

for mat in targetMats:
    nodes = mat.node_tree.nodes
    links = mat.node_tree.links

    # Remove all nodes except texture
    for node in nodes:
        if node.bl_idname != "ShaderNodeTexImage":
            nodes.remove(node)

    # Get texture node
    try:
        tex = nodes["Image Texture"]
    except KeyError:
        print(f"[materials.py] Skipped material '{mat.name}': Image texture not found.")
        continue

    # Change image interpolation
    tex.interpolation = "Closest"
    tex.location = 0, 0

    # Create texture coordinate node
    coord = nodes.new("ShaderNodeTexCoord")
    coord.location = -400, 0

    # Create mapping node
    map = nodes.new("ShaderNodeMapping")
    map.location = -200, 0

    # Create principled shader
    prin = nodes.new("ShaderNodeBsdfPrincipled")
    prin.location = 300, 0
    if int(bpy.app.version_string.split('.')[0]) >= 4:
        prin.inputs["Specular IOR Level"].default_value = 0
    else:
        prin.inputs["Specular"].default_value = 0

    # Create output
    out = nodes.new("ShaderNodeOutputMaterial")
    out.location = 600, 0

    # Link everything
    links.new(coord.outputs["UV"], map.inputs["Vector"])
    links.new(map.outputs["Vector"], tex.inputs["Vector"])
    links.new(tex.outputs["Color"], prin.inputs["Base Color"])
    links.new(tex.outputs["Alpha"], prin.inputs["Alpha"])
    links.new(prin.outputs["BSDF"], out.inputs["Surface"])

    # Deselect all
    for node in nodes:
        node.select = False

    # Set blend mode
    mat.blend_method = "CLIP"


WICHTIG:

Für die hierrauf folgenden Teile der Anleitung wird folgendes wichtig:

Screenshot from 2026-02-06 11-49-59.png


Veränderung feststellen: Wenn wir nun wieder zurück auf den "Layout" tab gehen, merken wir, dass das Programm, die Texturfehler erfolgreich behoben hat und sogar das Wasser leicht durchsichtig gemacht hat (was es vorher nicht war).

Layout tab finden:
image.png


Custom Transparenz bei Wasser: Wenn wir dem Wasser, eine andere Transparenz geben wollen, als der Code es getan hat, dann müssen wir auf den "Shader" tab und ebenfalls die "Material Properties" öffnen. In den "Material Properties" suchen wir nun in der Liste von materials nach dem Namen der Textur des Wassers und selektieren dieses Material.

Nun ist es auch im Shader Editor geöffnet:
image.png

Wir könnten im "Principled BSDF" node oder auch in der "Material Properties" Konsole unter "Surface" den Wert "Alpha" (also die Transparenz) verändern, wenn diese nicht schon vom texture node ("mcl_core_water_flow_animation.png") vorgegeben sein würde.

Wir können aber die Verbdingung vom "Alpha" output vom texture node zum "Alpha" input vom "Principled BSDF" node trennen. Jetzt können wir schließlich den "Alpha" Wert entweder direkt beim "Principled BSDF" node oder auch unter Material Properties > Surface > Alpha verändern, wie wir wollen.


Farben anpassen: Uns fällt nun aber auf, dass die Farbe des Wassers als auch die des Grases und der Blätter der Bäume nicht akkurat sind. Den Grasblöcken fehlt außerdem noch die Seitentextur (diese konnte nicht mit exportier werden), etwas was wir ebenfalls manuell beheben müssen. Dorch erstmal konzentrieren wir uns auf die Farbe der Blätter, des Wassers und der Gras-Dekorationen (nicht die Blöcke, denn bei diesen kommt noch etwas dazu).

image.png

Beispiel "tallgrass":

In der Auflistung der materials suchen wir unsere Textur auf, in diesem Fall: "mcl_flowers_tallgrass.png". Zunächst selektieren wir diese, um sie im Shader Editor farblich anzupassen.

image.png

Nun gehen wir in den Shader Editor und fügen mithilfe von Shift+A hier zwei neue nodes hinzu:

Nodes korrekt verbinden: Zunächst müssen wir die Nodes so verbinden, dass unsere neu erstellte Farbe eine Auswirkung auf das Endprodukt hat.

Wichtig ist für uns dieser Teil des Konstruktes, vom texture node zum Principled BSDF, hier wollen wir nämlich einen Zwischenschritt einfügen, der die neu erstellte Farbe auf die Farbe der Textur (welche hellgrau ist) anwendet.
image.png

Wir fügen hier jetzt die zwei neu erstellten Nodes wie folgt ein:
image.png

Was haben wir hier gemacht?

  1. color output von "mcl_flowers_tallgrass.png" (der Textur) mit dem color input A von dem "Mix" node verbunden.
  2. color output von "Hue/Saturation/Value" (unserer Farbe) mit dem color input B von dem "Mix" node verbunden.
  3. Das Resultat ("Result" output von "Mix") mit dem "Base Color" input von dem "Principled BSDF" node verbunden, sodass die neue Farbe letztendlich auf das Gras angewendet wird.

Man kann, indem man an dem Wert "Factor" von dem "Mix" node dreht, die neu gemachte Farbe mehr oder weniger reinmischen, wie es einem halt besser gefällt.

Nun sehen wir, dass die kurzen Grasdekorationen schön eingefärbt sind:
image.png

Wenn wir das nun für jedes Material bzw. jede Textur, welche eine unpassende Farbe hat machen, kann das Ganze so aussehen:
image.png


Grasblock Seiten: Wir wissen ja, dass die Grasblöcke im Spiel diese schönen Seiten haben:

image.png

Leider sind dies "texture modifier", welche meshport nicht mit exportieren kann. Darum müssen wir sie selber einfügen und ebenfalls einfärben, wenn sie denn farblich nicht passen.

Beispiel Grasblock Seiten (häufig):

In der Auflistung der materials suchen und selektieren wir die Textur, wo der texture modifier, in diesem Fall das überhängende Gras, fehlt. Bei mir ist das diese: "default_dirt.png^mcl_dirt_grass_shadow.png"

Nun gehen wir erneut in den Shader Editor von diesem spezifischen Material und fügen diesmal mit Shift+A aber ganze 5 nodes hinzu:

Diese Nodes fügen wir jetzt wie folgt in das Konstrukt ein:
image.png

Was haben wir hier gemacht?

  1. color output von "default_dirt.png^mcl_dirt_grass_shadow.png" (der neuen Textur) mit dem color input A von dem "Mix" node verbunden.
  2. color output von "Hue/Saturation/Value" (unserer Farbe) mit dem color input B von dem "Mix" node verbunden.
  3. Das Resultat ("Result" output von "Mix") mit dem "Base Color" input von dem oberen "Principled BSDF" node verbunden.
  4. "Alpha" von der texture modification (der obere texture node) mit dem "Factor" vom node "Mix Shader" verbunden.
  5. Die "BSDF" outputs von den "Principled BSDF" nodes mit den "Shader" inputs vom "Mix Shader" node verbunden.
  6. Den "Shader" output vom "Mix Shader" node mit dem "Surface" input vom "Material Output" node verbunden.

Das, was hier also neu dazu gekommen ist (da uns das einfärben ja schon bekannt war), ist das Zusammenfügen von 2 verschiedenen Texturen auf einen Block mithilfe vom "Mix Shader" node. Der 2. "Principled BSDF" node war nötig, damit die neu hinzugefügte Textur nicht von Beleuchtung usw. unbetroffen ist und deswegen "out of place" aussieht, weil sie dann z.B. heller ist als der Rest.

Tiermodell importieren

Modell importieren: Wir gehen in Blender auf File > Import > Datentyp und selektieren das gewünschte Modell.
Ich hab hier "Datentyp" geschrieben, weil es davon abhängt, welchen Datentyp die Tiermod, aus welcher man die Modelle bezieht, für diese verwendet. Meist werden dies aber .b3ds sein.

Wenn wir unser Tier nun importiert haben, sieht das so aus (erneut, nicht erschrecken):
image.png

Tiermodell anpassen

Knochen: Die spitzen pyramidenartigen Objekte sind "Knochen", welche man für Animationen verwendet. Diese sind für uns allerdings unwichtig, weswegen wir sie indem wir sie Einer nach dem Anderen selektieren und Entf bzw. Del drücken, um sie zu löschen, denn sie stören mehr, als sie uns bringen.


Pose: Für diesen Teil sollten wir im "Layout" tab sein. Wenn wir das Tier in eine Pose bringen wollen, sollten wir es erstmal aus dem Weltausschnitt bewegen. Dies machen wir, indem wir alle Einzelteile selektieren und als ganzes bewegen.

Dies können wir erreichen, indem wir Shift gedrückt halten und alle Einzelteile einmal anklicken. Schließlich können wir alle Teile mit dem "Move" tool bewegen.

Nun zum posieren lassen: Wir können einzelne Teile des Tieres selektieren und mit dem "Move" oder auch dem "Rotate" tool, wie gewünscht bewegen und rotieren.


Skalieren: Wenn wir nun wieder alle Einzelteile selektieren, können wir auf das "Scale" tool gehen, S drücken und das Modell beliebig skalieren, indem man die Maus bewegt.


Textur: Wir merken, dass obwohl wir im richtigen Viewport sind, das Tier keine Textur hat, diese müssen wir nämlich manuell anfügen.

Hierfür sollten wir zuerst die vielen Einzelteile zu einem machen: Wir selektieren alle Einzelteile (z.B. durch Shift + nacheinander anklicken) und drücken Strg+J bzw. Ctrl+J. Jetzt ist das Tier ein einzelnes Objekt, und wir können gleich die Textur anwenden.

Um die Textur anzufügen gehen wir wieder zurück in den "Shader" tab und öffnen auch (falls diese nicht schon offen sind) die "Material Properties".
Wir selektieren nun das Modell und erstellen ein neues Material indem wir auf "New" drücken:
image.png

Zunächst selektieren wir das neue Material und fügen in seinem Shader Editor einen node hinzu:

Damit die Textur auch scharf ist, stellen wir beim texture node die erste Zeile von "Linear" auf "Closet". Schließlich verbinden wir den "Color" output vom texture node mit dem "Base color" input beim "Principled BSDF" node.

Tada! Das Tier hat eine Textur.
image.png

Bild rendern

Wir wollen nun dieses Modell, welches wir gemacht haben, als Bild rendern, welches wir nachher auf T-Shirts drucken können. Für den Render ist eines extrem wichtig: Die Ausrichtung und Positionierung der Kamera (Das orangene Pyramidenförmige Objekt). Denn schließlich wird das Bild aus der Perspektive der Kamera gerendered.


Kameraposition: Um diese nun in die gewünschte Position zu bringen können wir folgendes machen: Wir klicken auf das Kamerasymbol oben rechts, dies befördert uns in die Perspektive der Kamera.
Screenshot from 2026-02-03 13-38-06.png

Zunächst drücken wir N und gehen auf den dann auftauchenden View tab. Hier kreuzen wir das Kästchen Lock Camera to View an: nun bewegt sich die Kamera mit uns wenn wir in Blender navigieren, allerdings nur während wir in der Perspektive der Kamera sind.

image.png

Schließlich können wir unsere Kamera bewegen und dabei sehen, wie das Modell aus der Perspektive der Kamera gerendered werden würde. So können wir die Kamera nun in die richtige Position für den erwünschten Render bringen.


Transparenz beim Rendern: Allerdings gibt es noch ein Problem: Wenn wir das Bild jetzt rendern würden, wäre der Hintergrund des Modells nicht transparent, sondern als dunkelgrau gerendered. Um dies zu vermeiden machen wir folgendes:
Wir gehen in der rechten Leiste (wo auch die Material Properties waren) auf Render Properties (das kleine Kamerasymbol über Output Properties, dem Druckersymbol).
Hier gehen wir nun auf Film und kreuzen die Box Transparent an. Nun wird der Hintergrund beim Rendern durchsichtig sein.

image.png


Rendern: Jetzt kommt der letzte Schritt: Wir drücken F12, dies öffnet unser Render-Fenster. Wenn uns das, was wir sehen gefällt, dann können wir jetzt dieses Render (also das Bild) speichern, indem wir oben links auf Image > Save as gehen. Nun speichern wir das Bild unter einem beliebigen Namen und sind fertig mit unserem ersten Luantier Motiv!

image.png


Beispielprodukt (beispielhaft, nicht extrem schön):

Beispiel.png