implement view bobbing
This commit is contained in:
@@ -22,8 +22,14 @@ public class FpsCameraController {
|
|||||||
private float velocityY = 0f;
|
private float velocityY = 0f;
|
||||||
private boolean grounded = false;
|
private boolean grounded = false;
|
||||||
|
|
||||||
|
// view bobbing
|
||||||
|
private float bobTime = 0f;
|
||||||
|
private float bobOffsetY = 0f;
|
||||||
|
private final float bobAmount = 0.04f; // amplitude in world units
|
||||||
|
private final float bobSpeed = 16f;
|
||||||
|
|
||||||
// --- approximation toggles
|
// --- approximation toggles
|
||||||
private final boolean retroQuantization = true;
|
private final boolean retroQuantization = false;
|
||||||
|
|
||||||
// how coarse the rotation is (0.25f = round to 0.25°)
|
// how coarse the rotation is (0.25f = round to 0.25°)
|
||||||
private final float yawStepDegrees = 0.2f;
|
private final float yawStepDegrees = 0.2f;
|
||||||
@@ -104,6 +110,10 @@ public class FpsCameraController {
|
|||||||
|
|
||||||
/** Update each frame with delta time */
|
/** Update each frame with delta time */
|
||||||
public void update(float delta, World3D world) {
|
public void update(float delta, World3D world) {
|
||||||
|
camera.position.y -= bobOffsetY;
|
||||||
|
bobOffsetY = 0f;
|
||||||
|
|
||||||
|
|
||||||
if (!mouseCaptured) {
|
if (!mouseCaptured) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -307,6 +317,27 @@ public class FpsCameraController {
|
|||||||
camera.position.y = Math.round(camera.position.y * q) / q;
|
camera.position.y = Math.round(camera.position.y * q) / q;
|
||||||
camera.position.z = Math.round(camera.position.z * q) / q;
|
camera.position.z = Math.round(camera.position.z * q) / q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =========================================================
|
||||||
|
// 4) VIEW BOBBING (purely visual)
|
||||||
|
// =========================================================
|
||||||
|
// horizontal movement magnitude (world units per frame)
|
||||||
|
float horizLen = (float)Math.sqrt(moveX * moveX + moveZ * moveZ);
|
||||||
|
|
||||||
|
if (grounded && horizLen > 0.0001f) {
|
||||||
|
// scale bob speed by how fast you're moving
|
||||||
|
float speedFactor = horizLen / (settings.moveSpeed * delta + 1e-6f);
|
||||||
|
bobTime += delta * bobSpeed * speedFactor;
|
||||||
|
|
||||||
|
bobOffsetY = (float)Math.sin(bobTime) * bobAmount;
|
||||||
|
} else {
|
||||||
|
// not moving or in the air → relax bobbing back to zero
|
||||||
|
bobTime = 0f;
|
||||||
|
// optional: smooth return to 0 instead of snapping
|
||||||
|
bobOffsetY += (0f - bobOffsetY) * 10f * delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
camera.position.y += bobOffsetY;
|
||||||
}
|
}
|
||||||
private void updateCameraDirection() {
|
private void updateCameraDirection() {
|
||||||
// build direction vector from yaw/pitch
|
// build direction vector from yaw/pitch
|
||||||
|
|||||||
Reference in New Issue
Block a user