Kampfsystem - hier: Anker beim Kurzschwert, sowohl für Helden als auch NPC

This commit is contained in:
2026-10-26 12:09:37 +01:00
parent 238776cfde
commit f189e6d81f
6 changed files with 139 additions and 10 deletions

View File

@@ -296,6 +296,13 @@ public class ModelEditorState extends BaseAppState {
updateCharPreviewWeapon();
}
// Orbit-Kamera im Charakter-Preview immer um den aktuellen Hand-Ankerpunkt drehen
// (statt um die Bounding-Box der isolierten Waffe, die am Boden/"Fuß" verankert ist)
if (charPreviewNode != null) {
Vector3f anchor = computeCharAnchorWorld();
if (anchor != null) orbitCenter = anchor;
}
if (input.modelEditorEmbedLodsRequest) {
input.modelEditorEmbedLodsRequest = false;
embedLodsAndSave(input.modelEditorEmbedLodsPath);
@@ -2133,6 +2140,38 @@ public class ModelEditorState extends BaseAppState {
if (modelWrapper != null) modelWrapper.setCullHint(Spatial.CullHint.Inherit);
if (gripGizmoNode != null) gripGizmoNode.setCullHint(Spatial.CullHint.Always);
input.gripEditorCharPreviewReady = false;
updateBounds(); // Orbit-Zentrum zurück auf die Bounding-Box der isolierten Waffe
}
/**
* Liefert die aktuelle Position des Hand-Ankerpunkts (Waffen-Griff bzw. Schild-Anker)
* in Weltkoordinaten, oder null wenn kein Charakter-Preview aktiv ist.
*/
private Vector3f computeCharAnchorWorld() {
if (charPreviewNode == null) return null;
Quaternion charWorldRot = charPreviewNode.getWorldRotation();
Quaternion charWorldRotInv = charWorldRot.inverse();
Vector3f charWorldPos = charPreviewNode.getWorldTranslation();
if (input.shieldEditorActive) {
if (charLeftHandNode == null) return null;
Vector3f leftBoneInChar = charWorldRotInv.mult(
charLeftHandNode.getWorldTranslation().subtract(charWorldPos));
Quaternion leftBoneRotInChar = charWorldRotInv.mult(charLeftHandNode.getWorldRotation());
Vector3f anchorInChar = leftBoneInChar.add(
leftBoneRotInChar.mult(new Vector3f(0f, -input.shieldEditorElbowOffset, 0f)));
return charWorldPos.add(charWorldRot.mult(anchorInChar));
}
if (charHandNode == null) return null;
Vector3f boneInChar = charWorldRotInv.mult(
charHandNode.getWorldTranslation().subtract(charWorldPos));
Quaternion boneRotInChar = charWorldRotInv.mult(charHandNode.getWorldRotation());
Vector3f palmOff = charPalmOffset;
Vector3f attachInChar = (palmOff != null)
? boneInChar.add(boneRotInChar.mult(palmOff.mult(0.5f)))
: boneInChar;
return charWorldPos.add(charWorldRot.mult(attachInChar));
}
private void updateCharPreviewWeapon() {