camera incline on wall run and normal run
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 21s
Create tag and build when new code gets to main / Export (push) Successful in 6m17s

This commit is contained in:
2025-12-08 12:23:36 +01:00
parent fabafbb35b
commit 2ff8cc74cc
4 changed files with 62 additions and 10 deletions

View File

@@ -129,6 +129,8 @@ CapsuleDefaultHeight = 1.7
[node name="HeadSystem" parent="." instance=ExtResource("11_rxwoh")] [node name="HeadSystem" parent="." instance=ExtResource("11_rxwoh")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0)
CameraInclineAcceleration = 20.0
GroundedCameraIncline = 3.0
[node name="StairsSystem" type="Node3D" parent="."] [node name="StairsSystem" type="Node3D" parent="."]
script = ExtResource("7_bmt5a") script = ExtResource("7_bmt5a")

View File

@@ -476,6 +476,7 @@ public partial class PlayerController : CharacterBody3D
private Vector3 _wallHugStartLocation = Vector3.Zero; private Vector3 _wallHugStartLocation = Vector3.Zero;
private Vector3 _wallHugStartNormal = Vector3.Zero; private Vector3 _wallHugStartNormal = Vector3.Zero;
private Vector3 _wallHugStartProjectedVelocity = Vector3.Zero; private Vector3 _wallHugStartProjectedVelocity = Vector3.Zero;
private Vector3 _currentWallContactPoint = Vector3.Zero;
public void OnWallDetected() public void OnWallDetected()
{ {
@@ -491,12 +492,17 @@ public partial class PlayerController : CharacterBody3D
public void OnWallStarted() public void OnWallStarted()
{ {
_wallHugStartNormal = WallHugSystem.WallHugNormal.UnwrapOr(Vector3.Up); _wallHugStartNormal = WallHugSystem.WallHugNormal.UnwrapOr(Vector3.Up);
_wallHugStartLocation = WallHugSystem.WallHugLocation.UnwrapOr(Vector3.Zero) + _wallHugStartNormal * _playerRadius; _currentWallContactPoint = WallHugSystem.WallHugLocation.UnwrapOr(Vector3.Zero);
_wallHugStartLocation = _currentWallContactPoint + _wallHugStartNormal * _playerRadius;
_wallHugStartProjectedVelocity = Velocity.Slide(_wallHugStartNormal); _wallHugStartProjectedVelocity = Velocity.Slide(_wallHugStartNormal);
} }
public void OnWallStopped() public void OnWallStopped()
{ {
_wallHugStartLocation = Vector3.Zero;
_currentWallContactPoint = Vector3.Zero;
_wallHugStartNormal = Vector3.Zero;
_wallHugStartProjectedVelocity = Vector3.Zero;
} }
public void HandleWallHugging(float delta) public void HandleWallHugging(float delta)
@@ -528,11 +534,10 @@ public partial class PlayerController : CharacterBody3D
Velocity = finalHVel + Vector3.Up*verticalSpeed; Velocity = finalHVel + Vector3.Up*verticalSpeed;
Velocity *= 0.995f; Velocity *= 0.995f;
if (WallRunSnapper.IsColliding()) _currentWallContactPoint = WallHugSystem.WallHugLocation.UnwrapOr(Vector3.Zero);
{
GD.Print((WallRunSnapper.GetCollisionPoint() - WallRunSnapper.GlobalPosition).Length());
}
if (isOnFloorCustom())
_playerState.SendEvent("grounded");
if (!WallHugSystem.IsWallHugging() || Velocity.Length() < WallRunSpeedThreshold) if (!WallHugSystem.IsWallHugging() || Velocity.Length() < WallRunSpeedThreshold)
{ {
_playerState.SendEvent("start_falling"); _playerState.SendEvent("start_falling");
@@ -643,9 +648,14 @@ public partial class PlayerController : CharacterBody3D
return _inputMoveKeyboard; return _inputMoveKeyboard;
} }
public Vector3 GetGlobalMoveInput()
{
return Transform.Basis * HeadSystem.Transform.Basis * GetMoveInput();
}
public Vector3 ComputeHVelocity(float delta, float accelerationFactor, float decelerationFactor, Vector3? direction = null) public Vector3 ComputeHVelocity(float delta, float accelerationFactor, float decelerationFactor, Vector3? direction = null)
{ {
var dir = direction ?? Transform.Basis * HeadSystem.Transform.Basis * GetMoveInput(); var dir = direction ?? GetGlobalMoveInput();
var acceleration = dir.Length() > 0 ? accelerationFactor : decelerationFactor; var acceleration = dir.Length() > 0 ? accelerationFactor : decelerationFactor;
@@ -1096,11 +1106,14 @@ public partial class PlayerController : CharacterBody3D
/////////////////////////// ///////////////////////////
// Stateless logic //////// // Stateless logic ////////
/////////////////////////// ///////////////////////////
private void LookAround() private void LookAround(double delta)
{ {
Vector2 inputLookDir = new Vector2(_inputRotateY, _inputRotateFloorplane); Vector2 inputLookDir = new Vector2(_inputRotateY, _inputRotateFloorplane);
var lookSensitivity = _isUsingGamepad ? _lookSensitivityMultiplier : _mouseSensitivityMultiplier; var lookSensitivity = _isUsingGamepad ? _lookSensitivityMultiplier : _mouseSensitivityMultiplier;
HeadSystem.LookAround(inputLookDir, lookSensitivity);
var wallHugContactPoint = _onWallRunning.Active ? _currentWallContactPoint : Vector3.Zero;
var playerVelocity = GetGlobalMoveInput();
HeadSystem.LookAround(delta, inputLookDir, playerVelocity, wallHugContactPoint, lookSensitivity);
} }
public void MoveOnGround(double delta) public void MoveOnGround(double delta)
@@ -1239,7 +1252,7 @@ public partial class PlayerController : CharacterBody3D
/////////////////////////// ///////////////////////////
public override void _PhysicsProcess(double delta) public override void _PhysicsProcess(double delta)
{ {
LookAround(); LookAround(delta);
CameraModifications((float) delta); CameraModifications((float) delta);
HandleStairs((float) delta); HandleStairs((float) delta);
_plannedMantleLocation = MantleSystem.FindMantleForHeadRotation(HeadSystem.Rotation.Y); _plannedMantleLocation = MantleSystem.FindMantleForHeadRotation(HeadSystem.Rotation.Y);

View File

@@ -1,5 +1,6 @@
using System; using System;
using Godot; using Godot;
using RustyOptions;
namespace Movementtests.systems; namespace Movementtests.systems;
@@ -12,6 +13,15 @@ public partial class HeadSystem : Node3D
[Export(PropertyHint.Range, "0,10,0.1,or_greater")] [Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float LookSensitivity { get; set; } = 1f; public float LookSensitivity { get; set; } = 1f;
[Export(PropertyHint.Range, "0.1,50,0.1,or_greater")]
public double CameraInclineAcceleration { get; set; } = 10f;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float WallRunCameraIncline { get; set; } = 5f;
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
public float GroundedCameraIncline { get; set; } = 5f;
public void Init() public void Init()
{ {
Input.SetMouseMode(Input.MouseModeEnum.Captured); Input.SetMouseMode(Input.MouseModeEnum.Captured);
@@ -25,7 +35,7 @@ public partial class HeadSystem : Node3D
_animationPlayer.Play("mantle"); _animationPlayer.Play("mantle");
} }
public void LookAround(Vector2 lookDir, float sensitivitMultiplier = 1f) public void LookAround(double delta, Vector2 lookDir, Vector3 playerVelocity, Vector3? wallContactPoint = null, float sensitivitMultiplier = 1f)
{ {
// Horizontal movement of head // Horizontal movement of head
float angleForHorizontalRotation = lookDir.X * LookSensitivity * sensitivitMultiplier; float angleForHorizontalRotation = lookDir.X * LookSensitivity * sensitivitMultiplier;
@@ -35,11 +45,33 @@ public partial class HeadSystem : Node3D
Vector3 currentCameraRotation = _cameraAnchor.Rotation; Vector3 currentCameraRotation = _cameraAnchor.Rotation;
currentCameraRotation.X += Convert.ToSingle(lookDir.Y * LookSensitivity * sensitivitMultiplier); currentCameraRotation.X += Convert.ToSingle(lookDir.Y * LookSensitivity * sensitivitMultiplier);
currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f)); currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f));
var isWallRunning = wallContactPoint.HasValue && wallContactPoint.Value.Length() > Mathf.Epsilon;
var cameraIncline = 0f;
if (isWallRunning)
{
var directionToWall = (wallContactPoint.Value - GlobalPosition).Normalized();
var cameraInclineFactor = ComputeCameraInclineFactor(directionToWall);
cameraIncline = Mathf.DegToRad(WallRunCameraIncline * cameraInclineFactor);
}
else
{
var cameraInclineFactor = ComputeCameraInclineFactor(playerVelocity);
cameraIncline = Mathf.DegToRad(GroundedCameraIncline * cameraInclineFactor * -1.0f);
}
currentCameraRotation.Z = (float) Mathf.Lerp(currentCameraRotation.Z, cameraIncline, delta * CameraInclineAcceleration);
_cameraAnchor.Rotation = currentCameraRotation; _cameraAnchor.Rotation = currentCameraRotation;
_camera.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated(); _camera.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated();
} }
public float ComputeCameraInclineFactor(Vector3 direction)
{
var forward = GetForwardHorizontalVector().Normalized();
var crossProduct = forward.Cross(direction);
return crossProduct.Length()*Mathf.Sign(crossProduct.Y);
}
public Vector3 GetForwardHorizontalVector() public Vector3 GetForwardHorizontalVector()
{ {
return GetGlobalTransform().Basis.Z; return GetGlobalTransform().Basis.Z;

View File

@@ -33,6 +33,11 @@ public partial class MantleSystem: Node3D
{ {
return Option<Vector3>.None; return Option<Vector3>.None;
} }
if (_wallInFrontCast3D.GetCollisionNormal(0).Y > 0.8f)
{
GD.Print(_wallInFrontCast3D.GetCollisionNormal(0).Y);
return Option<Vector3>.None;
}
var collisionPoint = _wallInFrontCast3D.GetCollisionPoint(0); var collisionPoint = _wallInFrontCast3D.GetCollisionPoint(0);
var collisionNormal = _wallInFrontCast3D.GetCollisionNormal(0); var collisionNormal = _wallInFrontCast3D.GetCollisionNormal(0);