Sfoglia il codice sorgente

Fixing character controller

BearishSun 9 anni fa
parent
commit
eb8034e70d

+ 1 - 0
Source/BansheePhysX/Source/BsPhysXCharacterController.cpp

@@ -69,6 +69,7 @@ namespace BansheeEngine
 	{
 	{
 		PxCapsuleControllerDesc pxDesc = toPxDesc(desc);
 		PxCapsuleControllerDesc pxDesc = toPxDesc(desc);
 		pxDesc.reportCallback = this;
 		pxDesc.reportCallback = this;
+		pxDesc.material = gPhysX().getDefaultMaterial();
 
 
 		mController = static_cast<PxCapsuleController*>(manager->createController(pxDesc));
 		mController = static_cast<PxCapsuleController*>(manager->createController(pxDesc));
 		mController->setUserData(this);
 		mController->setUserData(this);

+ 7 - 6
Source/MBansheeEditor/Scene/Gizmos/CharacterControllerGizmo.cs

@@ -18,18 +18,19 @@ namespace BansheeEditor
         {
         {
             SceneObject so = controller.SceneObject;
             SceneObject so = controller.SceneObject;
 
 
-            Vector3 offset = so.Position;
             Quaternion rotation = Quaternion.FromToRotation(Vector3.YAxis, controller.Up);
             Quaternion rotation = Quaternion.FromToRotation(Vector3.YAxis, controller.Up);
 
 
             // Rotate around origin
             // Rotate around origin
-            Matrix4 rotMatrix = Matrix4.TRS(offset, Quaternion.Identity, Vector3.One) *
-                Matrix4.TRS(Vector3.Zero, rotation, Vector3.One) *
-                Matrix4.TRS(-offset, Quaternion.Identity, Vector3.One);
+            Matrix4 rotMatrix = Matrix4.TRS(Vector3.Zero, rotation, Vector3.One);
 
 
             Gizmos.Color = Color.Green;
             Gizmos.Color = Color.Green;
-            Gizmos.Transform = so.WorldTransform * rotMatrix;
+            Gizmos.Transform = Matrix4.TRS(so.Position, so.Rotation, Vector3.One) * rotMatrix;
 
 
-            Gizmos.DrawWireCapsule(offset, controller.Height, controller.Radius);
+            Vector3 scale = so.Scale;
+            float scaledHeight = controller.Height * 2.0f * scale.y;
+            float scaledRadius = controller.Radius * MathEx.Max(scale.x, scale.z);
+
+            Gizmos.DrawWireCapsule(Vector3.Zero, scaledHeight, scaledRadius);
         }
         }
     }
     }
 }
 }

+ 1 - 1
Source/MBansheeEngine/Physics/CapsuleCollider.cs

@@ -11,7 +11,7 @@ namespace BansheeEngine
         private float radius = 0.2f;
         private float radius = 0.2f;
 
 
         [SerializeField]
         [SerializeField]
-        private float halfHeight = 0.5f;
+        private float halfHeight = 1.0f;
 
 
         [SerializeField]
         [SerializeField]
         private Vector3 normal = Vector3.YAxis;
         private Vector3 normal = Vector3.YAxis;

+ 7 - 5
Source/MBansheeEngine/Physics/CharacterController.cs

@@ -212,13 +212,15 @@ namespace BansheeEngine
         /// Does not account for gravity, you must apply it manually.
         /// Does not account for gravity, you must apply it manually.
         /// </summary>
         /// </summary>
         /// <param name="position">Position to move the controller to, in world space.</param>
         /// <param name="position">Position to move the controller to, in world space.</param>
-        public void Move(Vector3 position)
+        public CharacterCollisionFlag Move(Vector3 position)
         {
         {
             if (native == null)
             if (native == null)
-                return;
+                return 0;
 
 
-            native.Move(position);
+            CharacterCollisionFlag output = native.Move(position);
             UpdatePositionFromController();
             UpdatePositionFromController();
+
+            return output;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -338,8 +340,8 @@ namespace BansheeEngine
             public float stepOffset = 0.5f;
             public float stepOffset = 0.5f;
             public Radian slopeLimit = new Degree(45.0f);
             public Radian slopeLimit = new Degree(45.0f);
             public float minMoveDistance = 0.0f;
             public float minMoveDistance = 0.0f;
-            public float height = 0.0f;
-            public float radius = 1.0f;
+            public float height = 1.0f;
+            public float radius = 0.25f;
             public Vector3 up = Vector3.YAxis;
             public Vector3 up = Vector3.YAxis;
             public CharacterClimbingMode climbingMode = CharacterClimbingMode.Normal;
             public CharacterClimbingMode climbingMode = CharacterClimbingMode.Normal;
             public CharacterNonWalkableMode nonWalkableMode = CharacterNonWalkableMode.Prevent;
             public CharacterNonWalkableMode nonWalkableMode = CharacterNonWalkableMode.Prevent;

+ 3 - 3
Source/MBansheeEngine/Physics/NativeCharacterController.cs

@@ -94,9 +94,9 @@ namespace BansheeEngine
             Internal_Destroy(mCachedPtr);
             Internal_Destroy(mCachedPtr);
         }
         }
 
 
-        public void Move(Vector3 position)
+        public CharacterCollisionFlag Move(Vector3 position)
         {
         {
-            Internal_Move(mCachedPtr, ref position);
+            return Internal_Move(mCachedPtr, ref position);
         }
         }
 
 
         private void Internal_DoOnColliderHit(ScriptControllerCollision scriptCollisionData)
         private void Internal_DoOnColliderHit(ScriptControllerCollision scriptCollisionData)
@@ -140,7 +140,7 @@ namespace BansheeEngine
         private static extern void Internal_Destroy(IntPtr thisPtr);
         private static extern void Internal_Destroy(IntPtr thisPtr);
 
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_Move(IntPtr thisPtr, ref Vector3 position);
+        private static extern CharacterCollisionFlag Internal_Move(IntPtr thisPtr, ref Vector3 position);
         
         
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 position);
         private static extern void Internal_GetPosition(IntPtr thisPtr, out Vector3 position);

+ 1 - 1
Source/SBansheeEngine/Include/BsScriptCharacterController.h

@@ -41,7 +41,7 @@ namespace BansheeEngine
 		static void internal_CreateInstance(MonoObject* instance, CHAR_CONTROLLER_DESC* initData);
 		static void internal_CreateInstance(MonoObject* instance, CHAR_CONTROLLER_DESC* initData);
 		static void internal_Destroy(ScriptCharacterController* thisPtr);
 		static void internal_Destroy(ScriptCharacterController* thisPtr);
 
 
-		static CharacterCollisionFlags internal_Move(ScriptCharacterController* thisPtr, Vector3* displacement);
+		static UINT32 internal_Move(ScriptCharacterController* thisPtr, Vector3* displacement);
 
 
 		static void internal_GetPosition(ScriptCharacterController* thisPtr, Vector3* position);
 		static void internal_GetPosition(ScriptCharacterController* thisPtr, Vector3* position);
 		static void internal_SetPosition(ScriptCharacterController* thisPtr, Vector3* position);
 		static void internal_SetPosition(ScriptCharacterController* thisPtr, Vector3* position);

+ 3 - 1
Source/SBansheeEngine/Source/BsScriptCharacterController.cpp

@@ -30,10 +30,12 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_SetFootPosition", &ScriptCharacterController::internal_SetFootPosition);
 		metaData.scriptClass->addInternalCall("Internal_SetFootPosition", &ScriptCharacterController::internal_SetFootPosition);
 		metaData.scriptClass->addInternalCall("Internal_SetRadius", &ScriptCharacterController::internal_SetRadius);
 		metaData.scriptClass->addInternalCall("Internal_SetRadius", &ScriptCharacterController::internal_SetRadius);
 		metaData.scriptClass->addInternalCall("Internal_SetHeight", &ScriptCharacterController::internal_SetHeight);
 		metaData.scriptClass->addInternalCall("Internal_SetHeight", &ScriptCharacterController::internal_SetHeight);
+		metaData.scriptClass->addInternalCall("Internal_SetUp", &ScriptCharacterController::internal_SetUp);
 		metaData.scriptClass->addInternalCall("Internal_SetClimbingMode", &ScriptCharacterController::internal_SetClimbingMode);
 		metaData.scriptClass->addInternalCall("Internal_SetClimbingMode", &ScriptCharacterController::internal_SetClimbingMode);
 		metaData.scriptClass->addInternalCall("Internal_SetNonWalkableMode", &ScriptCharacterController::internal_SetNonWalkableMode);
 		metaData.scriptClass->addInternalCall("Internal_SetNonWalkableMode", &ScriptCharacterController::internal_SetNonWalkableMode);
 		metaData.scriptClass->addInternalCall("Internal_SetMinMoveDistance", &ScriptCharacterController::internal_SetMinMoveDistance);
 		metaData.scriptClass->addInternalCall("Internal_SetMinMoveDistance", &ScriptCharacterController::internal_SetMinMoveDistance);
 		metaData.scriptClass->addInternalCall("Internal_SetContactOffset", &ScriptCharacterController::internal_SetContactOffset);
 		metaData.scriptClass->addInternalCall("Internal_SetContactOffset", &ScriptCharacterController::internal_SetContactOffset);
+		metaData.scriptClass->addInternalCall("Internal_SetStepOffset", &ScriptCharacterController::internal_SetStepOffset);
 		metaData.scriptClass->addInternalCall("Internal_SetSlopeLimit", &ScriptCharacterController::internal_SetSlopeLimit);
 		metaData.scriptClass->addInternalCall("Internal_SetSlopeLimit", &ScriptCharacterController::internal_SetSlopeLimit);
 		metaData.scriptClass->addInternalCall("Internal_SetLayer", &ScriptCharacterController::internal_SetLayer);
 		metaData.scriptClass->addInternalCall("Internal_SetLayer", &ScriptCharacterController::internal_SetLayer);
 
 
@@ -71,7 +73,7 @@ namespace BansheeEngine
 		thisPtr->mCharacterController = nullptr;
 		thisPtr->mCharacterController = nullptr;
 	}
 	}
 
 
-	CharacterCollisionFlags ScriptCharacterController::internal_Move(ScriptCharacterController* thisPtr, Vector3* displacement)
+	UINT32 ScriptCharacterController::internal_Move(ScriptCharacterController* thisPtr, Vector3* displacement)
 	{
 	{
 		return thisPtr->mCharacterController->move(*displacement);
 		return thisPtr->mCharacterController->move(*displacement);
 	}
 	}