Ok, I finally managed to implement the Ray casting. However it's not quite working out. The only times that I seem to be able to "hit" and object is when I move backwards while shooting. I know it has "something" to do with the camera, however I can't quite figure out what it is. Also, once moving backwards when shooting, I hit the target even if pointing into opposite directions.
What I did was draw a ray at every "Draw" of the bullet (Please see the code below).
I've had problems drawing the ray, so, I just print the co-ordinates for every "hit". Here an example:
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.075377 Z:-93.97278} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.075377 Z:-93.97278} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.075377 Z:-93.97278} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.075377 Z:-98.97278} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.075377 Z:-93.97278} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:3.94132 Z:-93.91934} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.425062 Y:3.94132 Z:-93.95586} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.22722 Y:3.941321 Z:-93.95522} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.029201 Y:4.008436 Z:-93.98106} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:111.8863 Y:4.20871 Z:-244.3544} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:111.8863 Y:4.20871 Z:-244.3544} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:111.8863 Y:4.20871 Z:-244.3544} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:111.8863 Y:4.20871 Z:-244.3544} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:133.2445 Y:4.275099 Z:-289.479} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:138.7093 Y:4.341291 Z:-300.7091} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:119.8614 Y:4.341294 Z:-266.0376} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:181.6297 Y:4.341298 Z:-201.135} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:172.7936 Y:4.3413 Z:-190.0566} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:168.4389 Y:4.341295 Z:-184.4362} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:150.1676 Y:4.275097 Z:-167.2586} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:124.8685 Y:4.275102 Z:-152.5962} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:97.7438 Y:4.208708 Z:-140.2434} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:69.82182 Y:4.142137 Z:-124.0002} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:40.14538 Y:4.142137 Z:-114.0002} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:10.46892 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
shootingrange.GameWorld.Target Pos: {X:10 Y:-50 Z:-50}, Ray: [ {X:5.522848 Y:4.142136 Z:-94.00018} ]
Code:
Bullet.cs
public override void Draw(GameTime gameTime, Matrix projection, Matrix view) { Matrix[] transforms = new Matrix[_model.Bones.Count]; Vector3 nearSource = new Vector3(cameraPosition.X, cameraPosition.Y, 0.0f); Vector3 farSource = new Vector3(cameraPosition.X, cameraPosition.Y, 1.0f); Vector3 nearPoint = graphics.GraphicsDevice.Viewport.Unproject(nearSource, projection, Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up), Matrix.Identity); Vector3 farPoint = graphics.GraphicsDevice.Viewport.Unproject(farSource, projection, Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up), Matrix.Identity); Vector3 direction = farPoint - nearPoint; direction.Normalize(); // and then create a new ray using nearPoint as the source. Ray ray = new Ray(nearPoint, farPoint); // if (ray.Intersects(this.GetBounds()).HasValue == true) // { // } if (world.BulletCollision(ray)) { redundant = true; return; } if (propagate) { modelPosition.Z += bulletSpeed; } if (modelPosition.Z > 1000.0f) { redundant = true; } _model.CopyAbsoluteBoneTransformsTo(transforms); bounds = new BoundingSphere(); foreach (ModelMesh mesh in _model.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.Projection = Projection; effect.View = Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up); effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(600.0f) * Matrix.CreateScale(0.5f) * Matrix.CreateTranslation(modelPosition); } bounds = BoundingSphere.CreateMerged(bounds, mesh.BoundingSphere); mesh.Draw(); } bounds = bounds.Transform(Matrix.CreateScale(1.0f) * Matrix.CreateTranslation(modelPosition)); }
public bool BulletCollision(Ray ray) { foreach (ISceneObject obj in worldObjects) { if (obj.GetBounds().Radius == -1) { continue; } if (obj.GetType().ToString() != "shootingrange.GameWorld.Target") { continue; } // Use raycasting to determine whether the bullet hits its target if (ray.Intersects(obj.GetBounds()).HasValue == true) { Game.points++; Target t = (Target)obj; Console.WriteLine(obj.GetType() + " Pos: " + t.GetPosition() + ", Ray: [ " + ray.Position + " ]"); return true; } } return false; }
Any more tips? :D Thanks :-)