diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index 679be1e98..28efcaa44 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -150,7 +150,6 @@ CharacterController::CollisionFlags CharacterController::SimpleMove(const Vector Vector3 displacement = speed; displacement += GetPhysicsScene()->GetGravity() * deltaTime; displacement *= deltaTime; - return Move(displacement); } @@ -162,7 +161,8 @@ CharacterController::CollisionFlags CharacterController::Move(const Vector3& dis const float deltaTime = Time::GetCurrentSafe()->DeltaTime.GetTotalSeconds(); result = (CollisionFlags)PhysicsBackend::MoveController(_controller, _shape, displacement, _minMoveDistance, deltaTime); _lastFlags = result; - SetPosition(PhysicsBackend::GetControllerPosition(_controller)); + Vector3 position = PhysicsBackend::GetControllerPosition(_controller) - _center; + SetPosition(position); } return result; } @@ -178,10 +178,11 @@ void CharacterController::DrawPhysicsDebug(RenderView& view) const float minSize = 0.001f; const float radius = Math::Max(Math::Abs(_radius) * scaling, minSize); const float height = Math::Max(Math::Abs(_height) * scaling, minSize); + const Vector3 position = _transform.LocalToWorld(_center); if (view.Mode == ViewMode::PhysicsColliders) - DEBUG_DRAW_TUBE(_transform.LocalToWorld(_center), Quaternion::Euler(90, 0, 0), radius, height, Color::LightYellow, 0, true); + DEBUG_DRAW_TUBE(position, Quaternion::Euler(90, 0, 0), radius, height, Color::LightYellow, 0, true); else - DEBUG_DRAW_WIRE_TUBE(_transform.LocalToWorld(_center), Quaternion::Euler(90, 0, 0), radius, height, Color::GreenYellow * 0.8f, 0, true); + DEBUG_DRAW_WIRE_TUBE(position, Quaternion::Euler(90, 0, 0), radius, height, Color::GreenYellow * 0.8f, 0, true); } void CharacterController::OnDebugDrawSelected() @@ -190,7 +191,8 @@ void CharacterController::OnDebugDrawSelected() const float minSize = 0.001f; const float radius = Math::Max(Math::Abs(_radius) * scaling, minSize); const float height = Math::Max(Math::Abs(_height) * scaling, minSize); - DEBUG_DRAW_WIRE_TUBE(_transform.LocalToWorld(_center), Quaternion::Euler(90, 0, 0), radius, height, Color::GreenYellow, 0, false); + const Vector3 position = _transform.LocalToWorld(_center); + DEBUG_DRAW_WIRE_TUBE(position, Quaternion::Euler(90, 0, 0), radius, height, Color::GreenYellow, 0, false); // Base Collider::OnDebugDrawSelected(); @@ -204,7 +206,8 @@ void CharacterController::CreateController() ASSERT(_controller == nullptr && _shape == nullptr); _cachedScale = GetScale(); const float scaling = _cachedScale.GetAbsolute().MaxValue(); - _controller = PhysicsBackend::CreateController(GetPhysicsScene()->GetPhysicsScene(), this, this, _contactOffset, _transform.Translation, _slopeLimit, (int32)_nonWalkableMode, Material.Get(), Math::Abs(_radius) * scaling, Math::Abs(_height) * scaling, _stepOffset, _shape); + const Vector3 position = _transform.LocalToWorld(_center); + _controller = PhysicsBackend::CreateController(GetPhysicsScene()->GetPhysicsScene(), this, this, _contactOffset, position, _slopeLimit, (int32)_nonWalkableMode, Material.Get(), Math::Abs(_radius) * scaling, Math::Abs(_height) * scaling, _stepOffset, _shape); // Setup PhysicsBackend::SetControllerUpDirection(_shape, _upDirection); @@ -280,6 +283,7 @@ void CharacterController::OnActiveTransformChanged() _isUpdatingTransform = true; Transform transform; PhysicsBackend::GetRigidActorPose(PhysicsBackend::GetShapeActor(_shape), transform.Translation, transform.Orientation); + transform.Translation -= _center; transform.Orientation = _transform.Orientation; transform.Scale = _transform.Scale; SetTransform(transform); @@ -360,9 +364,10 @@ void CharacterController::OnTransformChanged() Actor::OnTransformChanged(); // Update physics + const Vector3 position = _transform.LocalToWorld(_center); if (!_isUpdatingTransform && _controller) { - PhysicsBackend::SetControllerPosition(_controller, _transform.Translation); + PhysicsBackend::SetControllerPosition(_controller, position); const Float3 scale = GetScale(); if (!Float3::NearEqual(_cachedScale, scale)) UpdateGeometry(); @@ -370,7 +375,7 @@ void CharacterController::OnTransformChanged() } else if (!_controller) { - _box = BoundingBox(_transform.Translation); + _box = BoundingBox(position); BoundingSphere::FromBox(_box, _sphere); } }