Kampfsystem - hier: Anker beim Kurzschwert, sowohl für Helden als auch NPC
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user