From 79f9cf12a3defcf3f389a1dfbbaa5e64769f3733 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 23 Jun 2026 17:44:22 +0200 Subject: [PATCH] Animationen jetzt heil und Keyframes eingebaut --- .../resources/animations/clips/sitting.j3o | Bin 88989 -> 92642 bytes .../animations/sets/human.animset.json | 23 +- .../main/java/de/blight/editor/EditorApp.java | 413 +++++++++--------- .../java/de/blight/editor/SharedInput.java | 9 +- .../blight/editor/state/AnimPreviewState.java | 19 +- .../blight/game/animation/AnimKeyframe.java | 27 ++ .../de/blight/game/animation/AnimSet.java | 21 +- .../game/control/PlayerInputControl.java | 242 +++++----- .../game/state/WorldInteractableState.java | 20 +- 9 files changed, 384 insertions(+), 390 deletions(-) create mode 100644 blight-game/src/main/java/de/blight/game/animation/AnimKeyframe.java diff --git a/blight-assets/src/main/resources/animations/clips/sitting.j3o b/blight-assets/src/main/resources/animations/clips/sitting.j3o index 512e7660333c1c549b64014789d630375bbb143c..80ad1b2650397c25fb1f07a99c5af2989b5e16aa 100644 GIT binary patch literal 92642 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 literal 88989 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

4cE=Ec3N}Nvi9bW62kfXg? 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

M{suQ;${_4_44Tc%S$%?${mrLM|^pQC; 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 animSetClipListView; private ListView animSetActionListView; - private ListView animSetSinkListView; - private ListView animSetAnchorBoneListView; private String animSetPendingPlayClip = null; private ComboBox animSetModelCombo; private boolean animSetDirty = false; private String animSetCurrentName = null; private Path animSetCurrentDir = null; - private java.util.List animJointNames = new java.util.ArrayList<>(); - private Label animSetBonesLabel; + // Motion-Keyframe-Editor (innerhalb AnimSet-Editor) + private javafx.scene.control.ListView animSetKfListView; + private javafx.collections.ObservableList animSetKfList = + javafx.collections.FXCollections.observableArrayList(); + private java.util.Map> + animSetMotionKeyframes = new java.util.LinkedHashMap<>(); // Character-Editor-Zustand private de.blight.editor.ui.DialogEditorView dialogEditorView; @@ -453,19 +455,6 @@ public class EditorApp extends Application { animClipListView.getItems().setAll(newClips); if (!newClips.isEmpty()) animClipListView.getSelectionModel().selectFirst(); } - java.util.List newJoints = input.animPreviewJointNames.getAndSet(null); - if (newJoints != null) { - animJointNames = new java.util.ArrayList<>(newJoints); - if (animSetBonesLabel != null) { - if (animJointNames.isEmpty()) { - animSetBonesLabel.setText("Kein Armature gefunden"); - animSetBonesLabel.setStyle("-fx-font-size: 10; -fx-text-fill: #c66;"); - } else { - animSetBonesLabel.setText(animJointNames.size() + " Joints geladen"); - animSetBonesLabel.setStyle("-fx-font-size: 10; -fx-text-fill: #6a6;"); - } - } - } // AnimSet-Editor: nach Clip-Load automatisch abspielen if (newClips != null && animSetPendingPlayClip != null) { input.animPreviewPlayClip = animSetPendingPlayClip; @@ -8276,7 +8265,25 @@ public class EditorApp extends Application { removeClipBtn.setDisable(true); animSetClipListView.getSelectionModel().selectedItemProperty() - .addListener((obs, ov, nv) -> removeClipBtn.setDisable(nv == null)); + .addListener((obs, ov, nv) -> { + removeClipBtn.setDisable(nv == null); + // Keyframes des alten Clips sichern + if (ov != null && animSetKfList != null) { + animSetMotionKeyframes.put(ov, new java.util.ArrayList<>(animSetKfList)); + } + // Keyframes des neuen Clips laden + if (animSetKfList != null) { + animSetKfList.clear(); + if (nv != null) { + var kfs = animSetMotionKeyframes.getOrDefault(nv, new java.util.ArrayList<>()); + animSetKfList.setAll(kfs); + // Clip direkt in Vorschau abspielen + input.animPreviewPlayClip = nv; + } + } + // KF-Bereich aktivieren/deaktivieren + if (animSetKfListView != null) animSetKfListView.setDisable(nv == null); + }); addClipBtn.setOnAction(e -> { org.slf4j.Logger _log = org.slf4j.LoggerFactory.getLogger("AnimSetClipScan"); @@ -8395,196 +8402,72 @@ public class EditorApp extends Application { HBox.setHgrow(removeActionBtn, Priority.ALWAYS); inner.getChildren().addAll(animSetActionListView, actionBtns); - // ── Bone-Anchoring ──────────────────────────────────────────────────── - inner.getChildren().addAll(new Separator(), sectionTitle("Bone-Anchoring"), new Separator()); + // ── Motion Keyframes ────────────────────────────────────────────────── + inner.getChildren().addAll(new Separator(), sectionTitle("Motion Keyframes"), new Separator()); - Label anchorHint = new Label("Pro Aktion: Knochen angeben, der auf seiner Welt-Y fixiert bleibt (z. B. SIT_DOWN → foot.l). Hat Vorrang vor manuellem Sink."); - anchorHint.setStyle("-fx-font-size: 10; -fx-text-fill: #888;"); - anchorHint.setWrapText(true); - animSetBonesLabel = new Label(animJointNames.isEmpty() ? "Kein Modell geladen" : animJointNames.size() + " Joints geladen"); - animSetBonesLabel.setStyle("-fx-font-size: 10; -fx-text-fill: " + (animJointNames.isEmpty() ? "#888;" : "#6a6;")); + Label kfHint = new Label("TX/TZ = charakter-lokal (seitlich/vorwärts), TY = Welt-Y (hoch/runter). RX/RY/RZ in Grad, additiv zur Startrotation. Zeit ≤ Clip-Dauer (Clip vorab in Vorschau abspielen)."); + kfHint.setStyle("-fx-font-size: 10; -fx-text-fill: #888;"); + kfHint.setWrapText(true); - animSetAnchorBoneListView = new ListView<>(); - animSetAnchorBoneListView.setPrefHeight(110); - if (animSet.getAnchorBoneMap() != null) { - for (var e2 : animSet.getAnchorBoneMap().entrySet()) { - animSetAnchorBoneListView.getItems().add(e2.getKey() + " → " + e2.getValue()); - } + // Keyframes aus AnimSet laden + animSetMotionKeyframes = new java.util.LinkedHashMap<>(); + for (var entry : animSet.getMotionKeyframes().entrySet()) { + animSetMotionKeyframes.put(entry.getKey(), new java.util.ArrayList<>(entry.getValue())); } + animSetKfList = javafx.collections.FXCollections.observableArrayList(); + animSetKfList.addListener((javafx.collections.ListChangeListener) + change -> updateAnimPreviewKfOffset()); - Button addAnchorBtn = new Button("+ Hinzufügen…"); - Button removeAnchorBtn = new Button("- Entfernen"); - addAnchorBtn.setMaxWidth(Double.MAX_VALUE); - removeAnchorBtn.setMaxWidth(Double.MAX_VALUE); - removeAnchorBtn.setDisable(true); - animSetAnchorBoneListView.getSelectionModel().selectedItemProperty() - .addListener((obs, ov, nv) -> removeAnchorBtn.setDisable(nv == null)); - - addAnchorBtn.setOnAction(e -> { - // Pending joint names aus JME3-Thread abholen (falls Timer sie noch nicht konsumiert hat) - java.util.List fresh = input.animPreviewJointNames.getAndSet(null); - if (fresh != null) { - animJointNames = new java.util.ArrayList<>(fresh); - if (animSetBonesLabel != null) { - animSetBonesLabel.setText(animJointNames.isEmpty() ? "Kein Armature gefunden" : animJointNames.size() + " Joints geladen"); - animSetBonesLabel.setStyle("-fx-font-size: 10; -fx-text-fill: " + (animJointNames.isEmpty() ? "#c66;" : "#6a6;")); - } + // ListView mit Zusammenfassung, Doppelklick öffnet Edit-Dialog + animSetKfListView = new javafx.scene.control.ListView<>(animSetKfList); + animSetKfListView.setPrefHeight(150); + animSetKfListView.setPlaceholder(new Label("Keine Keyframes – [+ Keyframe] zum Hinzufügen")); + animSetKfListView.setCellFactory(lv -> new javafx.scene.control.ListCell<>() { + @Override protected void updateItem(de.blight.game.animation.AnimKeyframe kf, boolean empty) { + super.updateItem(kf, empty); + if (empty || kf == null) { setText(null); return; } + setText(String.format("%.3fs | TX%+.3f TY%+.3f TZ%+.3f | RX%+.1f° RY%+.1f° RZ%+.1f°", + kf.time, kf.tx, kf.ty, kf.tz, kf.rx, kf.ry, kf.rz)); } - ComboBox anchorActionCombo = new ComboBox<>(); - anchorActionCombo.getItems().addAll(de.blight.game.animation.AnimationAction.values()); - javafx.util.Callback, - javafx.scene.control.ListCell> acf = - lv -> new javafx.scene.control.ListCell<>() { - @Override protected void updateItem(de.blight.game.animation.AnimationAction it, boolean empty) { - super.updateItem(it, empty); - setText(empty || it == null ? null : it.displayName() + " (" + it.name() + ")"); - } - }; - anchorActionCombo.setCellFactory(acf); - anchorActionCombo.setButtonCell(acf.call(null)); - anchorActionCombo.setMaxWidth(Double.MAX_VALUE); - anchorActionCombo.getSelectionModel().selectFirst(); - - // Joint-Auswahl: ComboBox mit geladenen Namen, editierbar als Fallback - ComboBox boneCombo = new ComboBox<>(); - boneCombo.setEditable(true); - boneCombo.setMaxWidth(Double.MAX_VALUE); - if (animJointNames.isEmpty()) { - boneCombo.setPromptText("Joint-Name (erst Modell laden)"); - } else { - boneCombo.getItems().addAll(animJointNames); - boneCombo.setPromptText("Joint auswählen…"); + }); + animSetKfListView.setOnMouseClicked(ev -> { + if (ev.getClickCount() == 2) { + de.blight.game.animation.AnimKeyframe sel = + animSetKfListView.getSelectionModel().getSelectedItem(); + if (sel != null) showAnimKfDialog(sel); } - - javafx.scene.layout.GridPane anchorGrid = new javafx.scene.layout.GridPane(); - anchorGrid.setHgap(8); anchorGrid.setVgap(6); - anchorGrid.add(new Label("Aktion:"), 0, 0); anchorGrid.add(anchorActionCombo, 1, 0); - anchorGrid.add(new Label("Joint-Name:"), 0, 1); anchorGrid.add(boneCombo, 1, 1); - javafx.scene.layout.ColumnConstraints anchorCc = new javafx.scene.layout.ColumnConstraints(); - anchorCc.setHgrow(Priority.ALWAYS); - anchorGrid.getColumnConstraints().addAll(new javafx.scene.layout.ColumnConstraints(), anchorCc); - - javafx.scene.control.Dialog anchorDlg = new javafx.scene.control.Dialog<>(); - anchorDlg.setTitle("Bone-Anchoring konfigurieren"); - javafx.scene.control.ButtonType okAnchor = new javafx.scene.control.ButtonType("Setzen", - javafx.scene.control.ButtonBar.ButtonData.OK_DONE); - anchorDlg.getDialogPane().getButtonTypes().addAll(okAnchor, javafx.scene.control.ButtonType.CANCEL); - anchorDlg.getDialogPane().setContent(anchorGrid); - anchorDlg.showAndWait().ifPresent(bt -> { - if (bt != okAnchor) { - return; - } - var selAction = anchorActionCombo.getValue(); - String bone = boneCombo.getEditor().getText(); - if (selAction == null || bone == null || bone.isBlank()) { - return; - } - String newEntry = selAction.name() + " → " + bone.trim(); - animSetAnchorBoneListView.getItems().removeIf(it -> it.startsWith(selAction.name() + " → ")); - animSetAnchorBoneListView.getItems().add(newEntry); - animSetDirty = true; - }); }); - removeAnchorBtn.setOnAction(e -> { - String sel = animSetAnchorBoneListView.getSelectionModel().getSelectedItem(); + // initial deaktiviert – wird durch Clip-Selektion gesteuert + animSetKfListView.setDisable(true); + + Button addKfBtn = new Button("+ Keyframe"); + Button removeKfBtn = new Button("- Entfernen"); + addKfBtn.setMaxWidth(Double.MAX_VALUE); + removeKfBtn.setMaxWidth(Double.MAX_VALUE); + addKfBtn.setDisable(true); + removeKfBtn.setDisable(true); + animSetKfListView.getSelectionModel().selectedItemProperty() + .addListener((obs, ov, nv) -> removeKfBtn.setDisable(nv == null)); + // addKfBtn folgt Clip-Selektion + animSetClipListView.getSelectionModel().selectedItemProperty() + .addListener((obs, ov, nv) -> addKfBtn.setDisable(nv == null)); + + addKfBtn.setOnAction(e -> showAnimKfDialog(null)); + + removeKfBtn.setOnAction(e -> { + de.blight.game.animation.AnimKeyframe sel = + animSetKfListView.getSelectionModel().getSelectedItem(); if (sel != null) { - animSetAnchorBoneListView.getItems().remove(sel); + animSetKfList.remove(sel); animSetDirty = true; } }); - HBox anchorBtns = new HBox(6, addAnchorBtn, removeAnchorBtn); - HBox.setHgrow(addAnchorBtn, Priority.ALWAYS); - HBox.setHgrow(removeAnchorBtn, Priority.ALWAYS); - inner.getChildren().addAll(anchorHint, animSetBonesLabel, animSetAnchorBoneListView, anchorBtns); - - // ── Sink-Konfiguration (Fallback) ───────────────────────────────────── - inner.getChildren().addAll(new Separator(), sectionTitle("Manueller Sink-Fallback"), new Separator()); - - Label sinkHint = new Label("Root-Motion-Ersatz: Körper senkt/hebt sich während der Animation.\nNegativ = nach unten (Setzen), Positiv = nach oben."); - sinkHint.setStyle("-fx-font-size: 10; -fx-text-fill: #888;"); - sinkHint.setWrapText(true); - - animSetSinkListView = new ListView<>(); - animSetSinkListView.setPrefHeight(120); - if (animSet.getSinkMap() != null) { - for (var e2 : animSet.getSinkMap().entrySet()) { - animSetSinkListView.getItems().add(e2.getKey() + " → " + e2.getValue()); - } - } - - Button addSinkBtn = new Button("+ Setzen…"); - Button removeSinkBtn = new Button("- Entfernen"); - addSinkBtn.setMaxWidth(Double.MAX_VALUE); - removeSinkBtn.setMaxWidth(Double.MAX_VALUE); - removeSinkBtn.setDisable(true); - animSetSinkListView.getSelectionModel().selectedItemProperty() - .addListener((obs, ov, nv) -> removeSinkBtn.setDisable(nv == null)); - - addSinkBtn.setOnAction(e -> { - ComboBox actionSinkCombo = new ComboBox<>(); - actionSinkCombo.getItems().addAll(de.blight.game.animation.AnimationAction.values()); - javafx.util.Callback, - javafx.scene.control.ListCell> cf2 = - lv -> new javafx.scene.control.ListCell<>() { - @Override protected void updateItem(de.blight.game.animation.AnimationAction it, boolean empty) { - super.updateItem(it, empty); - setText(empty || it == null ? null : it.displayName() + " (" + it.name() + ")"); - } - }; - actionSinkCombo.setCellFactory(cf2); - actionSinkCombo.setButtonCell(cf2.call(null)); - actionSinkCombo.setMaxWidth(Double.MAX_VALUE); - actionSinkCombo.getSelectionModel().selectFirst(); - - Spinner sinkSpinner = new Spinner<>(-3.0, 3.0, 0.0, 0.05); - sinkSpinner.setEditable(true); - sinkSpinner.setMaxWidth(Double.MAX_VALUE); - - javafx.scene.layout.GridPane sinkGrid = new javafx.scene.layout.GridPane(); - sinkGrid.setHgap(8); sinkGrid.setVgap(6); - sinkGrid.add(new Label("Aktion:"), 0, 0); sinkGrid.add(actionSinkCombo, 1, 0); - sinkGrid.add(new Label("Versatz (m):"), 0, 1); sinkGrid.add(sinkSpinner, 1, 1); - javafx.scene.layout.ColumnConstraints sinkCc = new javafx.scene.layout.ColumnConstraints(); - sinkCc.setHgrow(Priority.ALWAYS); - sinkGrid.getColumnConstraints().addAll(new javafx.scene.layout.ColumnConstraints(), sinkCc); - - javafx.scene.control.Dialog sinkDlg = new javafx.scene.control.Dialog<>(); - sinkDlg.setTitle("Sink-Wert setzen"); - javafx.scene.control.ButtonType okSink = new javafx.scene.control.ButtonType("Setzen", - javafx.scene.control.ButtonBar.ButtonData.OK_DONE); - sinkDlg.getDialogPane().getButtonTypes().addAll(okSink, javafx.scene.control.ButtonType.CANCEL); - sinkDlg.getDialogPane().setContent(sinkGrid); - sinkDlg.showAndWait().ifPresent(bt -> { - if (bt != okSink) { - return; - } - var selAction = actionSinkCombo.getValue(); - if (selAction == null) { - return; - } - double val = sinkSpinner.getValue(); - String newEntry = selAction.name() + " → " + val; - // Bestehenden Eintrag für diese Aktion ersetzen - animSetSinkListView.getItems().removeIf(it -> it.startsWith(selAction.name() + " → ")); - animSetSinkListView.getItems().add(newEntry); - animSetDirty = true; - }); - }); - - removeSinkBtn.setOnAction(e -> { - String sel = animSetSinkListView.getSelectionModel().getSelectedItem(); - if (sel != null) { - animSetSinkListView.getItems().remove(sel); - animSetDirty = true; - } - }); - - HBox sinkBtns = new HBox(6, addSinkBtn, removeSinkBtn); - HBox.setHgrow(addSinkBtn, Priority.ALWAYS); - HBox.setHgrow(removeSinkBtn, Priority.ALWAYS); - inner.getChildren().addAll(sinkHint, animSetSinkListView, sinkBtns); + HBox kfBtns = new HBox(6, addKfBtn, removeKfBtn); + HBox.setHgrow(addKfBtn, Priority.ALWAYS); + HBox.setHgrow(removeKfBtn, Priority.ALWAYS); + inner.getChildren().addAll(kfHint, animSetKfListView, kfBtns); // ── Vorschau ───────────────────────────────────────────────────────── inner.getChildren().addAll(new Separator(), sectionTitle("Vorschau"), new Separator()); @@ -8644,6 +8527,117 @@ public class EditorApp extends Application { return panel; } + /** Öffnet den Keyframe-Dialog (null = Hinzufügen, non-null = Bearbeiten). */ + private void showAnimKfDialog(de.blight.game.animation.AnimKeyframe existing) { + boolean isAdd = (existing == null); + // Zeitlimit: zuletzt gemessene Clip-Dauer aus Preview, sonst 999 + float maxTime = input.animPreviewCurrentClipDuration > 0.01f + ? input.animPreviewCurrentClipDuration : 999.0f; + + float initTime = isAdd + ? (animSetKfList.isEmpty() ? 0f : Math.min(animSetKfList.get(animSetKfList.size() - 1).time + 0.5f, maxTime)) + : existing.time; + float initTX = isAdd ? 0f : existing.tx; + float initTY = isAdd ? 0f : existing.ty; + float initTZ = isAdd ? 0f : existing.tz; + float initRX = isAdd ? 0f : existing.rx; + float initRY = isAdd ? 0f : existing.ry; + float initRZ = isAdd ? 0f : existing.rz; + + Spinner spTime = new Spinner<>(0.0, maxTime, initTime, 0.05); + Spinner spTX = new Spinner<>(-10.0, 10.0, initTX, 0.05); + Spinner spTY = new Spinner<>(-10.0, 10.0, initTY, 0.05); + Spinner spTZ = new Spinner<>(-10.0, 10.0, initTZ, 0.05); + Spinner spRX = new Spinner<>(-360.0, 360.0, initRX, 1.0); + Spinner spRY = new Spinner<>(-360.0, 360.0, initRY, 1.0); + Spinner spRZ = new Spinner<>(-360.0, 360.0, initRZ, 1.0); + for (Spinner sp : new Spinner[]{spTime, spTX, spTY, spTZ, spRX, spRY, spRZ}) { + sp.setEditable(true); + sp.setMaxWidth(Double.MAX_VALUE); + } + + String timeLabel = maxTime < 999f + ? String.format("Zeit (0 – %.2fs):", maxTime) + : "Zeit (s):"; + String[][] rows = { + {timeLabel}, {"TX (m):"}, {"TY (m):"}, {"TZ (m):"}, {"RX (°):"}, {"RY (°):"}, {"RZ (°):"} + }; + Spinner[] sps = {spTime, spTX, spTY, spTZ, spRX, spRY, spRZ}; + javafx.scene.layout.GridPane kfGrid = new javafx.scene.layout.GridPane(); + kfGrid.setHgap(8); kfGrid.setVgap(5); + for (int i = 0; i < sps.length; i++) { + kfGrid.add(new Label(rows[i][0]), 0, i); + kfGrid.add(sps[i], 1, i); + } + javafx.scene.layout.ColumnConstraints kfCC = new javafx.scene.layout.ColumnConstraints(); + kfCC.setHgrow(Priority.ALWAYS); + kfGrid.getColumnConstraints().addAll(new javafx.scene.layout.ColumnConstraints(), kfCC); + + javafx.scene.control.Dialog kfDlg = + new javafx.scene.control.Dialog<>(); + kfDlg.setTitle(isAdd ? "Keyframe hinzufügen" : "Keyframe bearbeiten"); + javafx.scene.control.ButtonType okKf = new javafx.scene.control.ButtonType( + isAdd ? "Hinzufügen" : "Übernehmen", + javafx.scene.control.ButtonBar.ButtonData.OK_DONE); + kfDlg.getDialogPane().getButtonTypes().addAll(okKf, javafx.scene.control.ButtonType.CANCEL); + kfDlg.getDialogPane().setContent(kfGrid); + kfDlg.showAndWait().ifPresent(bt -> { + if (bt != okKf) return; + float t = (float) Math.min(spTime.getValue(), maxTime); + if (isAdd) { + de.blight.game.animation.AnimKeyframe kf = new de.blight.game.animation.AnimKeyframe( + t, + spTX.getValue().floatValue(), spTY.getValue().floatValue(), spTZ.getValue().floatValue(), + spRX.getValue().floatValue(), spRY.getValue().floatValue(), spRZ.getValue().floatValue()); + animSetKfList.add(kf); + } else { + existing.time = t; + existing.tx = spTX.getValue().floatValue(); + existing.ty = spTY.getValue().floatValue(); + existing.tz = spTZ.getValue().floatValue(); + existing.rx = spRX.getValue().floatValue(); + existing.ry = spRY.getValue().floatValue(); + existing.rz = spRZ.getValue().floatValue(); + } + animSetKfList.sort(java.util.Comparator.comparingDouble(k -> k.time)); + if (animSetKfListView != null) animSetKfListView.refresh(); + animSetDirty = true; + }); + } + + /** Spielt den Clip der gegebenen Aktion in der Vorschau ab, um animPreviewCurrentClipDuration zu setzen. */ + private void autoPreviewClipForAction(de.blight.game.animation.AnimationAction action) { + if (animSetActionListView == null || action == null) return; + String prefix = action.name() + " → "; + for (String entry : animSetActionListView.getItems()) { + if (entry.startsWith(prefix)) { + String clip = entry.substring(prefix.length()).trim(); + if (!clip.isEmpty()) { + input.animPreviewPlayClip = clip; + } + break; + } + } + } + + private void updateAnimPreviewKfOffset() { + if (animSetKfList == null || animSetKfList.isEmpty()) { + input.animPreviewKfTx = 0f; + input.animPreviewKfTy = 0f; + input.animPreviewKfTz = 0f; + input.animPreviewKfActive = false; + } else { + de.blight.game.animation.AnimKeyframe first = animSetKfList.get(0); + for (de.blight.game.animation.AnimKeyframe k : animSetKfList) { + if (k.time < first.time) { first = k; } + } + input.animPreviewKfTx = first.tx; + input.animPreviewKfTy = first.ty; + input.animPreviewKfTz = first.tz; + input.animPreviewKfActive = true; + } + } + private void previewSelectedClip() { if (animSetClipListView == null) return; String clip = animSetClipListView.getSelectionModel().getSelectedItem(); @@ -8749,28 +8743,21 @@ public class EditorApp extends Application { } } animSet.setActionMap(actionMap); - java.util.Map sinkMap = new java.util.LinkedHashMap<>(); - if (animSetSinkListView != null) { - for (String it : animSetSinkListView.getItems()) { - String[] parts = it.split(" → ", 2); - if (parts.length == 2) { - try { - sinkMap.put(parts[0], Float.parseFloat(parts[1])); - } catch (NumberFormatException ignored) {} - } + // Motion Keyframes: aktuell sichtbare Liste (des selektierten Clips) sichern, dann schreiben + if (animSetClipListView != null) { + String selClip = animSetClipListView.getSelectionModel().getSelectedItem(); + if (selClip != null) { + animSetMotionKeyframes.put(selClip, new java.util.ArrayList<>(animSetKfList)); } } - animSet.setSinkMap(sinkMap); - java.util.Map anchorBoneMap = new java.util.LinkedHashMap<>(); - if (animSetAnchorBoneListView != null) { - for (String it : animSetAnchorBoneListView.getItems()) { - String[] parts = it.split(" → ", 2); - if (parts.length == 2) { - anchorBoneMap.put(parts[0], parts[1]); - } + java.util.Map> kfFinal = + new java.util.LinkedHashMap<>(); + for (var kfEntry : animSetMotionKeyframes.entrySet()) { + if (kfEntry.getValue() != null && !kfEntry.getValue().isEmpty()) { + kfFinal.put(kfEntry.getKey(), kfEntry.getValue()); } } - animSet.setAnchorBoneMap(anchorBoneMap); + animSet.setMotionKeyframes(kfFinal); // Vorschau-Modell-Pfad beibehalten if (animSetModelCombo != null && animSetModelCombo.getValue() != null && !animSetModelCombo.getValue().isBlank()) { animSet.setPreviewModelPath(animSetModelCombo.getValue()); diff --git a/blight-editor/src/main/java/de/blight/editor/SharedInput.java b/blight-editor/src/main/java/de/blight/editor/SharedInput.java index 068c769..bbaa2e3 100644 --- a/blight-editor/src/main/java/de/blight/editor/SharedInput.java +++ b/blight-editor/src/main/java/de/blight/editor/SharedInput.java @@ -567,9 +567,16 @@ public class SharedInput { /** JME3 → JavaFX: Clip-Namen nach Modell-Laden. getAndSet(null) konsumiert. */ public final java.util.concurrent.atomic.AtomicReference> animPreviewClips = new java.util.concurrent.atomic.AtomicReference<>(); - /** JME3 → JavaFX: Joint-Namen des geladenen Armatures (für Bone-Anchoring-Auswahl). */ + /** JME3 → JavaFX: Joint-Namen des geladenen Armatures. */ public final java.util.concurrent.atomic.AtomicReference> animPreviewJointNames = new java.util.concurrent.atomic.AtomicReference<>(); + /** JME3 → JavaFX: Länge des zuletzt gestarteten Clips in Sekunden (0 = unbekannt). */ + public volatile float animPreviewCurrentClipDuration = 0f; + /** JavaFX → JME3: Motion-Keyframe-Vorschau-Versatz (erster KF, tx/ty/tz in Metern). */ + public volatile float animPreviewKfTx = 0f; + public volatile float animPreviewKfTy = 0f; + public volatile float animPreviewKfTz = 0f; + public volatile boolean animPreviewKfActive = false; /** * JME3 → JavaFX: Relativer Asset-Pfad des gerade geladenen Modells. diff --git a/blight-editor/src/main/java/de/blight/editor/state/AnimPreviewState.java b/blight-editor/src/main/java/de/blight/editor/state/AnimPreviewState.java index 7b2a90a..6c91327 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/AnimPreviewState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/AnimPreviewState.java @@ -232,6 +232,16 @@ public class AnimPreviewState extends BaseAppState { axesNode.setLocalTranslation(Vector3f.ZERO); } + // Motion-Keyframe-Vorschau: Versatz auf Modell anwenden (TX/TY/TZ in Welt-Koordinaten) + if (currentModel != null) { + if (input.animPreviewKfActive) { + currentModel.setLocalTranslation( + input.animPreviewKfTx, input.animPreviewKfTy, input.animPreviewKfTz); + } else { + currentModel.setLocalTranslation(Vector3f.ZERO); + } + } + previewScene.updateLogicalState(tpf); previewScene.updateGeometricState(); } @@ -297,13 +307,15 @@ public class AnimPreviewState extends BaseAppState { previewSC != null ? "ok" : "NULL"); } - // Kamera: immer auf Hüfthöhe (0, 1, 0) zielen; Distanz aus BoundingBox + // Kamera: immer auf Hüfthöhe (0, 1, 0) zielen; Distanz aus BoundingBox. + // WICHTIG: BoundingBox wird VOR dem ersten SC-Update berechnet (T-Pose noch nicht sichtbar). + // Deshalb Minimum von 3f + 2m Puffer, damit die Kamera nicht im Körper startet. model.updateGeometricState(); if (model.getWorldBound() instanceof BoundingBox bb) { float ext = Math.max(bb.getXExtent(), Math.max(bb.getYExtent(), bb.getZExtent())); - previewCamDist = ext * 2.8f; + previewCamDist = Math.max(ext * 2.8f, 3f) + 2f; } else { - previewCamDist = 3f; + previewCamDist = 5f; } previewTarget.set(0, 1, 0); input.animPreviewZoom = 1.0f; @@ -381,6 +393,7 @@ public class AnimPreviewState extends BaseAppState { currentClipName = clipName; if (currentAction != null) { currentAction.setSpeed(input.animPreviewSpeed); + input.animPreviewCurrentClipDuration = (float) currentAction.getLength(); LOG.info("[AnimPreview] Play '{}' length={}", clipName, currentAction.getLength()); } } catch (Exception e) { diff --git a/blight-game/src/main/java/de/blight/game/animation/AnimKeyframe.java b/blight-game/src/main/java/de/blight/game/animation/AnimKeyframe.java new file mode 100644 index 0000000..5a115e5 --- /dev/null +++ b/blight-game/src/main/java/de/blight/game/animation/AnimKeyframe.java @@ -0,0 +1,27 @@ +package de.blight.game.animation; + +/** + * Ein Keyframe für manuellen Positions-/Rotations-Versatz während einer blockierenden Animation. + * + * TX/TZ: Versatz in Charakter-lokalem Raum (TX=seitlich, TZ=vorwärts relativ zur Blickrichtung). + * TY: Versatz in Welt-Y (hoch/runter). + * RX/RY/RZ: Additiver Rotations-Versatz in Grad (Euler XYZ, relativ zur Startrotation). + * + * Keyframes einer Aktion werden nach {@code time} sortiert und linear interpoliert. + */ +public class AnimKeyframe { + + public float time; // Sekunden seit Animations-Start + public float tx, ty, tz; // Positions-Versatz (Meter) + public float rx, ry, rz; // Rotations-Versatz (Grad) + + public AnimKeyframe() {} + + public AnimKeyframe(float time, + float tx, float ty, float tz, + float rx, float ry, float rz) { + this.time = time; + this.tx = tx; this.ty = ty; this.tz = tz; + this.rx = rx; this.ry = ry; this.rz = rz; + } +} diff --git a/blight-game/src/main/java/de/blight/game/animation/AnimSet.java b/blight-game/src/main/java/de/blight/game/animation/AnimSet.java index 57cbad0..b0e1a94 100644 --- a/blight-game/src/main/java/de/blight/game/animation/AnimSet.java +++ b/blight-game/src/main/java/de/blight/game/animation/AnimSet.java @@ -26,15 +26,8 @@ public class AnimSet { private Map actionMap = new LinkedHashMap<>(); /** Zuletzt im Editor verwendeter Modell-Pfad (relativ zu Assets-Root). Wird beim Öffnen auto-geladen. */ private String previewModelPath = null; - /** Vertikaler Versatz des Visual-Nodes während der jeweiligen Animation (Root-Motion-Ersatz, Fallback). */ - private Map sinkMap = new LinkedHashMap<>(); - /** - * Pro Aktion konfigurierbarer Anchor-Knochen (z. B. SIT_DOWN → "foot.l", PICK_UP → "hand.r"). - * Wenn für eine Aktion ein Eintrag vorhanden ist, wird Bone-Anchoring verwendet: - * der Knochen bleibt auf seiner Welt-Y vor der Animation fixiert. - * Überschreibt sinkMap für diese Aktion. - */ - private Map anchorBoneMap = new LinkedHashMap<>(); + /** Manueller Positions-/Rotations-Versatz: Aktion → sortierte Keyframe-Liste. */ + private Map> motionKeyframes = new LinkedHashMap<>(); public List getClips() { return clips; } public void setClips(List clips) { this.clips = clips; } @@ -42,10 +35,12 @@ public class AnimSet { public void setActionMap(Map actionMap) { this.actionMap = actionMap; } public String getPreviewModelPath() { return previewModelPath; } public void setPreviewModelPath(String previewModelPath) { this.previewModelPath = previewModelPath; } - public Map getSinkMap() { return sinkMap != null ? sinkMap : new LinkedHashMap<>(); } - public void setSinkMap(Map sinkMap) { this.sinkMap = sinkMap; } - public Map getAnchorBoneMap() { return anchorBoneMap != null ? anchorBoneMap : new LinkedHashMap<>(); } - public void setAnchorBoneMap(Map anchorBoneMap) { this.anchorBoneMap = anchorBoneMap; } + public Map> getMotionKeyframes() { + return motionKeyframes != null ? motionKeyframes : new LinkedHashMap<>(); + } + public void setMotionKeyframes(Map> motionKeyframes) { + this.motionKeyframes = motionKeyframes; + } /** Speichert dieses Set als {@code .animset.json} im Verzeichnis {@code setDir}. */ public void save(Path setDir, String setName) throws IOException { diff --git a/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java b/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java index 1b61bd2..ebf1ca7 100644 --- a/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java +++ b/blight-game/src/main/java/de/blight/game/control/PlayerInputControl.java @@ -49,16 +49,8 @@ public class PlayerInputControl { private AnimComposer animComposer; private String runningClip; - private java.util.Map animSinkMap = java.util.Map.of(); - private java.util.Map animAnchorBoneMap = java.util.Map.of(); - /** Bone-Anchoring: SkinningControl + Referenz-Position vor der Animation (Model-Space, alle Achsen). */ - private com.jme3.anim.SkinningControl skinningControl = null; - private Vector3f preAnimAnchorBoneModel = null; - private Vector3f preAnimVisualTranslation = null; - private String currentAnchorBone = null; - private boolean boneAnchorWarnLogged = false; - private int boneAnchorLogFrames = 0; + private com.jme3.anim.SkinningControl skinningControl = null; private int jumpFrames = 0; private boolean pickupActive = false; private float pickupRemaining = 0f; @@ -69,14 +61,13 @@ public class PlayerInputControl { private float blockingAnimTotal = 0f; private Runnable blockingAnimCallback = null; - /** - * Vertikaler Versatz des Visual-Nodes während einer blockierenden Animation - * (Root-Motion-Ersatz: Körper senkt sich beim Setzen, hebt sich beim Aufstehen). - * visualSinkCurrent wird pro Frame interpoliert. - */ - private float visualSinkStart = 0f; - private float visualSinkTarget = 0f; - private float visualSinkCurrent = 0f; + /** Manueller Motion-Override: pro Aktion konfigurierbare Keyframe-Liste. */ + private java.util.Map> + motionKeyframesMap = java.util.Map.of(); + private java.util.List + currentMotionKfs = null; + private Vector3f preMotionTranslation = null; + private Quaternion preMotionRotation = null; /** Drehung auf der Stelle (kein Vorwärtsbewegen, nur Rotation). */ private boolean turnActive = false; @@ -125,21 +116,19 @@ public class PlayerInputControl { this.runningClip = null; this.animComposer = (visual != null) ? RetargetingSystem.findAnimComposer(visual) : null; log.info("[AnimCtx] AnimComposer gefunden: {}", animComposer != null); - // SinkMap + AnchorBoneMap aus AnimSet laden + skinningControl = findSkinningControl(visual); + log.info("[AnimCtx] SkinningControl gefunden: {}", skinningControl != null); if (animSetName != null && assetRoot != null) { try { java.nio.file.Path setDir = assetRoot.resolve("animations").resolve("sets"); de.blight.game.animation.AnimSet set = de.blight.game.animation.AnimSet.load(setDir, animSetName); - animSinkMap = set.getSinkMap(); - animAnchorBoneMap = set.getAnchorBoneMap(); + motionKeyframesMap = set.getMotionKeyframes(); + log.info("[AnimCtx] MotionKeyframes geladen: {} Aktionen: {}", + motionKeyframesMap.size(), motionKeyframesMap.keySet()); } catch (Exception e) { - animSinkMap = java.util.Map.of(); - animAnchorBoneMap = java.util.Map.of(); + motionKeyframesMap = java.util.Map.of(); } } - skinningControl = findSkinningControl(visual); - log.info("[AnimCtx] SkinningControl gefunden: {}, AnchorBoneMap: {}", - skinningControl != null, animAnchorBoneMap); if (animSetName != null) { String clip = AnimationLibrary.getClipForAction(assetRoot, animSetName, AnimationAction.IDLE); if (clip != null && tryPlay(clip)) { @@ -200,31 +189,25 @@ public class PlayerInputControl { if (duration <= 0f) { duration = resolveClipLength(action, 1.5f); } - // Bone-Anchoring: pro Aktion konfigurierten Knochen laden und Referenz-Y einfrieren - currentAnchorBone = animAnchorBoneMap.get(action.name()); - if (currentAnchorBone != null && !currentAnchorBone.isBlank()) { - preAnimAnchorBoneModel = getBoneModelPos(currentAnchorBone); - preAnimVisualTranslation = visual != null ? visual.getLocalTranslation().clone() : new Vector3f(); - boneAnchorWarnLogged = false; - boneAnchorLogFrames = 0; - log.info("[BoneAnchor] Aktion={} Knochen='{}' preModelY={} (null={})", - action.name(), currentAnchorBone, - preAnimAnchorBoneModel != null ? preAnimAnchorBoneModel.y : Float.NaN, - preAnimAnchorBoneModel == null); + String kfClip = AnimationLibrary.getClipForAction(assetRoot, animSetName, action); + currentMotionKfs = kfClip != null ? motionKeyframesMap.get(kfClip) : null; + if (currentMotionKfs != null && !currentMotionKfs.isEmpty() && visual != null) { + // KF-Werte sind absolute Positionen im Charakter-Lokalraum (nicht additiv) + preMotionTranslation = Vector3f.ZERO; + preMotionRotation = visual.getLocalRotation().clone(); } else { - currentAnchorBone = null; - preAnimAnchorBoneModel = null; - preAnimVisualTranslation = null; - // Fallback: manuellen Sink aus AnimSet-Konfiguration laden - if (animSinkMap.containsKey(action.name())) { - visualSinkTarget = animSinkMap.get(action.name()); + // Keine Keyframes: visuelle Verschiebung aus vorheriger Keyframe-Aktion zurücksetzen + if (visual != null) { + visual.setLocalTranslation(Vector3f.ZERO); } + currentMotionKfs = null; + preMotionTranslation = null; + preMotionRotation = null; } blockingAnimActive = true; blockingAnimRemaining = duration; blockingAnimTotal = duration; blockingAnimCallback = onComplete; - visualSinkStart = visualSinkCurrent; autopilotDir = null; forward = backward = left = right = false; if (physicsChar != null) physicsChar.setWalkDirection(Vector3f.ZERO); @@ -232,14 +215,6 @@ public class PlayerInputControl { currentAnim = action; } - /** - * Überschreibt das Sink-Ziel für die nächste {@link #requestAnimation}-Animation manuell. - * Hat Vorrang vor der AnimSet-Konfiguration wenn VOR requestAnimation aufgerufen. - */ - public void setNextAnimationSink(float targetY) { - this.visualSinkTarget = targetY; - } - /** Liefert die Länge des Clips für {@code action} in Sekunden, oder {@code fallback} wenn nicht ermittelbar. */ private float resolveClipLength(AnimationAction action, float fallback) { if (animComposer == null || animLib == null || animSetName == null) { @@ -295,10 +270,27 @@ public class PlayerInputControl { /** * Spielt eine Animations-Aktion als Dauer-Loop während des Ruhezustands. * Nur sinnvoll nach {@link #lockInPlace()}. + * Hat die Aktion Motion Keyframes, wird der erste Keyframe (time=0) als statischer + * Versatz auf den Visual-Node angewendet. */ public void playLockedAnimation(AnimationAction action) { playAction(action); currentAnim = action; + String lockedClip = AnimationLibrary.getClipForAction(assetRoot, animSetName, action); + java.util.List kfs = + lockedClip != null ? motionKeyframesMap.get(lockedClip) : null; + log.info("[AnimKF] playLockedAnimation({}) clip='{}' → KFs gefunden: {}", + action, lockedClip, kfs != null ? kfs.size() : "null"); + if (kfs != null && !kfs.isEmpty() && visual != null) { + currentMotionKfs = kfs; + preMotionTranslation = Vector3f.ZERO; + preMotionRotation = visual.getLocalRotation().clone(); + applyMotionKeyframes(0f); + log.info("[AnimKF] Offset angewendet: visual.localTranslation={}", visual.getLocalTranslation()); + currentMotionKfs = null; + preMotionTranslation = null; + preMotionRotation = null; + } } private void registerMappings(KeyBindings kb) { @@ -366,34 +358,22 @@ public class PlayerInputControl { if (blockingAnimActive) { blockingAnimRemaining -= tpf; physicsChar.setWalkDirection(Vector3f.ZERO); - - // Visuellen Versatz anpassen: Foot-Anchoring hat Vorrang vor manuellem Sink - if (visual != null) { - if (currentAnchorBone != null && preAnimAnchorBoneModel != null) { - // Bone-Anchoring: 3D-Delta im Model-Space messen und als Visual-Offset anwenden. - // Model-Space ist unabhängig vom Visual-Shift → keine Rückkopplung. - applyBoneAnchorOffset(currentAnchorBone); - } else if (blockingAnimTotal > 0f) { - // Fallback: manueller Sink interpoliert - float t = Math.max(0f, Math.min(1f, 1f - blockingAnimRemaining / blockingAnimTotal)); - visualSinkCurrent = visualSinkStart + (visualSinkTarget - visualSinkStart) * t; - applyVisualSink(); - } - } + float elapsed = blockingAnimTotal - blockingAnimRemaining; + applyMotionKeyframes(elapsed); if (blockingAnimRemaining <= 0f) { blockingAnimActive = false; - if (currentAnchorBone != null && preAnimAnchorBoneModel != null) { - // Bone-Anchoring: letzten Kompensationswert einrasten - applyBoneAnchorOffset(currentAnchorBone); - } else { - // Fallback: Zielwert einrasten - visualSinkCurrent = visualSinkTarget; - applyVisualSink(); - } + applyMotionKeyframes(blockingAnimTotal); // Endwert einrasten + currentMotionKfs = null; + preMotionTranslation = null; + preMotionRotation = null; Runnable cb = blockingAnimCallback; blockingAnimCallback = null; if (cb != null) cb.run(); + // Kein Ruhezustand nach der Animation → visuellen Versatz zurücksetzen + if (!lockedInPlace && visual != null) { + visual.setLocalTranslation(Vector3f.ZERO); + } } else { return; } @@ -489,67 +469,6 @@ public class PlayerInputControl { } } - /** - * Liefert die aktuelle Welt-Y des angegebenen Joints, oder NaN wenn nicht ermittelbar. - * Liest den Joint aus dem SkinningControl (nach AnimComposer-Update = aktueller Frame). - */ - /** - * Gibt die Position des Joints im Model-Space des Armatures zurück. - * Bewusst KEIN Welt-Transform: sonst entsteht eine Rückkopplung mit dem Visual-Offset, - * weil der Visual-Node-Shift den Welt-Transform des Knochens beeinflusst. - */ - private Vector3f getBoneModelPos(String boneName) { - if (skinningControl == null || boneName == null || boneName.isBlank()) { - return null; - } - com.jme3.anim.Armature armature = skinningControl.getArmature(); - if (armature == null) { - return null; - } - com.jme3.anim.Joint joint = armature.getJoint(boneName); - if (joint == null) { - return null; - } - return joint.getModelTransform().getTranslation().clone(); - } - - /** - * Berechnet den Y-Offset des Anchor-Knochens gegenüber seiner Startposition - * (in Model-Space, keine Rückkopplung mit dem Visual-Shift) und setzt die - * Local-Y des Visual-Nodes so, dass der Knochen vertikal fixiert bleibt. - * - * Nur Y wird kompensiert. X/Z-Drift im Model-Space liegt in einem anderen - * Koordinatensystem als der Visual-Node (Blender-Export-Rotation) und würde - * den Charakter horizontal verschieben — das ist falsch. - * - * Formel: visual.localY = preAnimVisualY + (preAnimBone.y - currentBone.y) * scale - */ - private void applyBoneAnchorOffset(String boneName) { - if (visual == null || preAnimAnchorBoneModel == null || preAnimVisualTranslation == null) { - if (!boneAnchorWarnLogged) { - log.warn("[BoneAnchor] applyBoneAnchorOffset abgebrochen: visual={} preModel={} preVis={}", - visual != null, preAnimAnchorBoneModel, preAnimVisualTranslation); - boneAnchorWarnLogged = true; - } - return; - } - Vector3f current = getBoneModelPos(boneName); - if (current == null) { - if (!boneAnchorWarnLogged) { - log.warn("[BoneAnchor] Knochen '{}' nicht im Armature gefunden (skinningControl={})", - boneName, skinningControl != null); - boneAnchorWarnLogged = true; - } - return; - } - float scale = skinningControl != null && skinningControl.getSpatial() != null - ? skinningControl.getSpatial().getWorldScale().y : 1f; - float newY = preAnimVisualTranslation.y + (preAnimAnchorBoneModel.y - current.y) * scale; - visualSinkCurrent = newY; - com.jme3.math.Vector3f t = visual.getLocalTranslation(); - visual.setLocalTranslation(t.x, newY, t.z); - } - /** Durchsucht den Szenegraphen rekursiv nach dem ersten SkinningControl. */ private com.jme3.anim.SkinningControl findSkinningControl(Spatial s) { if (s == null) { @@ -570,14 +489,59 @@ public class PlayerInputControl { return null; } - private void applyVisualSink() { - if (visual == null) { - return; + /** + * Interpoliert die Motion-Keyframes der laufenden Aktion für den Zeitpunkt {@code time} + * und setzt Translation + Rotation des Visual-Nodes. + * TX/TZ werden im Charakter-lokalen Raum (Rotation zu Animations-Start) angewendet. + * Dabei gilt: positive TX = rechts vom Charakter, positives TZ = vor dem Charakter + * (= weg von der Bank), negatives TZ = hinter den Charakter (= zur Bank hin). + * TY ist Welt-Y. RX/RY/RZ sind additiv zur Startrotation. + */ + private void applyMotionKeyframes(float time) { + if (currentMotionKfs == null || currentMotionKfs.isEmpty()) return; + if (preMotionRotation == null || visual == null) return; + + de.blight.game.animation.AnimKeyframe before = null, after = null; + for (de.blight.game.animation.AnimKeyframe kf : currentMotionKfs) { + if (kf.time <= time) { before = kf; } + else if (after == null) { after = kf; break; } } - com.jme3.math.Vector3f t = visual.getLocalTranslation(); - visual.setLocalTranslation(t.x, visualSinkCurrent, t.z); + + float tx, ty, tz, rx, ry, rz; + if (before == null && after == null) { return; } + else if (before == null) { + tx = after.tx; ty = after.ty; tz = after.tz; + rx = after.rx; ry = after.ry; rz = after.rz; + } else if (after == null) { + tx = before.tx; ty = before.ty; tz = before.tz; + rx = before.rx; ry = before.ry; rz = before.rz; + } else { + float t = Math.max(0f, Math.min(1f, + (time - before.time) / (after.time - before.time))); + tx = lerp(before.tx, after.tx, t); + ty = lerp(before.ty, after.ty, t); + tz = lerp(before.tz, after.tz, t); + rx = lerp(before.rx, after.rx, t); + ry = lerp(before.ry, after.ry, t); + rz = lerp(before.rz, after.rz, t); + } + + // TX/TZ im Charakter-lokalen Raum: preMotionRotation dreht den Offset in Welt-Raum. + // Konvention: local -Z = forward (lookAt-Konvention), also tz negativ = hinter Charakter. + Vector3f localXZ = preMotionRotation.mult(new Vector3f(tx, 0f, tz)); + visual.setLocalTranslation(localXZ.x, ty, localXZ.z); + + // Rotation: additiv zur Startrotation via SLERP der Euler-Offsets + Quaternion rotOffset = new Quaternion(); + rotOffset.fromAngles( + rx * FastMath.DEG_TO_RAD, + ry * FastMath.DEG_TO_RAD, + rz * FastMath.DEG_TO_RAD); + visual.setLocalRotation(preMotionRotation.mult(rotOffset)); } + private static float lerp(float a, float b, float t) { return a + (b - a) * t; } + private boolean tryPlay(String clip) { if (animComposer == null || !animLib.applyTo(clip, visual)) { log.info("[Anim] tryPlay('{}') → applyTo FAILED", clip); diff --git a/blight-game/src/main/java/de/blight/game/state/WorldInteractableState.java b/blight-game/src/main/java/de/blight/game/state/WorldInteractableState.java index 7046b21..ca3a048 100644 --- a/blight-game/src/main/java/de/blight/game/state/WorldInteractableState.java +++ b/blight-game/src/main/java/de/blight/game/state/WorldInteractableState.java @@ -399,9 +399,8 @@ public class WorldInteractableState extends BaseAppState { AnimationAction idleAction = isBed ? AnimationAction.LYING : AnimationAction.SITTING; // duration=0 → PlayerInputControl ermittelt die echte Clip-Länge automatisch - // Sink-Wert kommt aus AnimSet-Konfiguration (Animationseditor) playerInput.requestAnimation(action, 0f, () -> { - teleportToRestPos(entry); + if (isBed) teleportToRestPos(entry); playerInput.lockInPlace(); playerInput.playLockedAnimation(idleAction); phase = Phase.RESTING; @@ -432,19 +431,10 @@ public class WorldInteractableState extends BaseAppState { } private void teleportToRestPos(InteractableEntry entry) { - if (physicsChar == null) return; - if (entry.type() == InteractableType.BED) { - Bed bed = BedIO.load(entry.interactableId()).orElse(null); - if (bed != null && bed.isLiegeSet()) - physicsChar.setPhysicsLocation(new Vector3f(bed.getLiegeX(), bed.getLiegeY(), bed.getLiegeZ())); - } else if (entry.type() == InteractableType.BENCH) { - // X/Z aus dem Sitzpunkt, Y bleibt bei der aktuellen Physik-Position (Charakter ist - // bereits auf Bodenhöhe und durch Terrain geerdet — kein Sprung nach oben) - Bench bench = BenchIO.load(entry.interactableId()).orElse(null); - if (bench != null && bench.isSitzSet()) { - float currentY = physicsChar.getPhysicsLocation().y; - physicsChar.setPhysicsLocation(new Vector3f(bench.getSitzX(), currentY, bench.getSitzZ())); - } + if (physicsChar == null || entry.type() != InteractableType.BED) return; + Bed bed = BedIO.load(entry.interactableId()).orElse(null); + if (bed != null && bed.isLiegeSet()) { + physicsChar.setPhysicsLocation(new Vector3f(bed.getLiegeX(), bed.getLiegeY(), bed.getLiegeZ())); } }