| name | fxgl-third-person-3d |
| description | Build a third-person 3D game in FXGL — orbit a camera behind the player, move the character relative to camera direction, rotate the player to face travel direction, jump with manual 3D gravity, smooth the camera with a spring arm, avoid camera clipping, and optionally add lock-on combat behavior.
|
| triggers | ["third person 3d","third person","orbit camera","spring arm","lock on","camera clipping","player faces movement"] |
| compatibility | Java 17+, FXGL 21.x. Requires FXGL 3D mode and builds on fxgl-scene3d.
|
| category | fxgl/3d |
| tags | ["fxgl","java","javafx","3d","game-types","third-person"] |
| metadata | {"author":"fxgl-skills","version":"1.0","fxgl-version":"21.1"} |
| allowed-tools | ["Read","Write","Edit","Bash"] |
FXGL Third-Person 3D
Layering
Use fxgl-scene3d for the baseline 3D scene. This skill adds:
- orbit camera controls
- character-relative movement
- spring-arm smoothing
- lock-on behavior
- third-person combat / traversal structure
Orbit Camera
private Camera3D camera;
private double cameraYaw = 0;
private double cameraPitch = 20;
private double cameraRadius = 8;
private Point3D computeCameraOffset() {
double yawRad = Math.toRadians(cameraYaw);
double pitchRad = Math.toRadians(cameraPitch);
double x = cameraRadius * Math.sin(yawRad) * Math.cos(pitchRad);
double y = -cameraRadius * Math.sin(pitchRad);
double z = cameraRadius * Math.cos(yawRad) * Math.cos(pitchRad);
return new Point3D(x, y, z);
}
Update the camera every frame:
private void updateCamera(double tpf) {
Point3D player.getPosition3D().add(, -, );
target.add(computeCameraOffset());
camera.getTransform();
transform.setX(lerp(transform.getX(), desired.getX(), tpf * ));
transform.setY(lerp(transform.getY(), desired.getY(), tpf * ));
transform.setZ(lerp(transform.getZ(), desired.getZ(), tpf * ));
transform.lookAt(target);
}