public bool PointRaycast(PhysicsObject me, Vector3 origin, Vector3 direction, float maxDist, out Vector3 contactPoint, out PhysicsObject didHit) { contactPoint = Vector3.Zero; didHit = null; ClosestRayResultCallback cb; var from = origin.Cast(); var to = (origin + direction * maxDist).Cast(); if (me != null) { cb = new KinematicClosestNotMeRayResultCallback(me.RigidBody); cb.RayFromWorld = from; cb.RayToWorld = to; } else { cb = new ClosestRayResultCallback(ref from, ref to); } using (cb) { btWorld.RayTestRef(ref from, ref to, cb); if (cb.HasHit) { didHit = cb.CollisionObject.UserObject as PhysicsObject; contactPoint = cb.HitPointWorld.Cast(); return(true); } return(false); } }
new void Update() { var rayCalback = new KinematicClosestNotMeRayResultCallback(_ghostObject); rayCalback.CollisionFilterMask = (int)CollisionFilleters.Look; rayCalback.CollisionFilterGroup = (int)CollisionFilleters.Look; //var test1 = Vector3.Cross(new Vector3(-6.84475f, 1.5930859f, 11.550375f) - camera.GetPos, (camera.GetLook * 10 * -Vector4.UnitZ).Xyz); //Console.WriteLine("{0} {1} {2}", camera.GetPos.Convert(), (camera.GetLook * 10 * -Vector4.UnitZ).Xyz.Convert(), test1.Length / (camera.GetLook * 10 * -Vector4.UnitZ).Xyz.Length); world.RayTest(camera.GetPos.Convert(), (camera.GetLook * 10 * new Vector4(0, 0, -1, 1)).Xyz.Convert(), rayCalback); if (rayCalback.HasHit) { // Console.WriteLine("Hit ON {0}",rayCalback.HitNormalWorld); if (rayCalback.CollisionObject.UserIndex == 1) { if (activeObject != rayCalback.CollisionObject) { activeObject = rayCalback.CollisionObject; lookCallback?.Invoke(null); lookCallback = (Action <SceneNode>)activeObject.UserObject; } lookCallback(camera.Node); } } /* * else if (activeObject != null) * { * //reset look * lookCallback(Vector3.Zero); * lookCallback = null; * activeObject = null; * } */ var keyState = GLWindow.gLWindow.KeyboardState; if (game.IsFocused && keyState.IsKeyDown(Keys.Up)) { Walk(-Vector3.UnitZ); } else if (game.IsFocused && keyState.IsKeyDown(Keys.Down)) { Walk(Vector3.UnitZ); } else if (game.IsFocused && keyState.IsKeyDown(Keys.Left)) { Walk(-Vector3.UnitX); } else if (game.IsFocused && keyState.IsKeyDown(Keys.Right)) { Walk(Vector3.UnitX); } else if (game.IsFocused && keyState.IsKeyDown(Keys.Space)) { Jump(); } else { Stop(); } base.Update(); }