c# matrix 3d xna collision

c# - Las matrices de colisión XNA 3D no funcionan



matrix collision (2)

Previamente hice una pregunta sobre por qué mi colisión no funcionaba. Obtuve una buena respuesta que tiene sentido: aplicar las mismas transformaciones que hice en el método DrawModel al método isCollision. Esto sin embargo, no funcionó. No pude averiguar cómo hacer las mismas transformaciones en el método isCollision. Sería genial si alguien pudiese ayudarme. ¡Gracias! Aquí están los métodos:

private bool checkPlayerCollision(Model model1, Matrix world1) { //Make floor matrix Matrix floorMatrix = Matrix.CreateTranslation(new Vector3(0, 0, 0)); //Make ship1 matrix Matrix ship1WorldMatrix = Matrix.CreateTranslation(ship1loc); //Make ship2 matrix Matrix ship2WorldMatrix = Matrix.CreateTranslation(ship2loc); //Check for collision with floor if (IsCollision(model1, world1, floor, floorMatrix)) return true; //Check for collision with ship1 if (IsCollision(model1, world1, model, ship1WorldMatrix)) return true; //Check for collision with ship2 if (IsCollision(model1, world1, model, ship2WorldMatrix)) return true; return false; }

Esa fue la colisión del jugador de cheques donde verifico todos los modelos para colisión con el modelo de jugador.

private bool IsCollision(Model model1, Matrix world1, Model model2, Matrix world2) { for (int meshIndex1 = 0; meshIndex1 < model1.Meshes.Count; meshIndex1++) { BoundingSphere sphere1 = model1.Meshes[meshIndex1].BoundingSphere; sphere1 = sphere1.Transform(world1); for (int meshIndex2 = 0; meshIndex2 < model2.Meshes.Count; meshIndex2++) { BoundingSphere sphere2 = model2.Meshes[meshIndex2].BoundingSphere; sphere2 = sphere2.Transform(world2); if (sphere1.Intersects(sphere2)) return true; } } return false; }

Ese fue el método donde realmente verifico la colisión.

private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection, Vector3 loc) { Matrix gameWorldRotation = Matrix.CreateRotationX(MathHelper.ToRadians(RotationX)) * Matrix.CreateRotationY(MathHelper.ToRadians(RotationY)); Matrix[] transforms = new Matrix[model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(transforms); foreach (ModelMesh mesh in model.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.World = gameWorldRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(loc); GraphicsDevice.RenderState.DepthBufferEnable = true; effect.EnableDefaultLighting(); //effect.World = world; effect.View = view; effect.Projection = projection; } mesh.Draw(); } }

Y ese fue el método donde dibujo los modelos y hago las transformaciones matriciales. Más código está disponible bajo petición junto con más información.


Debes construir tus matrices mundiales a partir de las tres transformaciones (escala, rotación, traducción, en ese orden). Si usaste solo traducción en tu juego, entonces tu método debería funcionar bien. Tal vez tu modelo está en mal estado. Intenta renderizar esferas delimitadoras para ver si realmente se cruzan. Aquí hay una clase BoundingSphereRenderer realmente buena.


No pude averiguar cómo hacer las mismas transformaciones en el método isCollision. Sería genial si alguien pudiese ayudarme

Para ello, crea la matriz de transformación en el método de actualización después de aplicar cualquier movimiento o rotación. Luego guarde esa matriz construida y páselo para utilizar tanto en el método de prueba de colisión como en el método de dibujo.

Matrix TransformationMatrix; void Update() { TransformationMatrix = Matrix.Create...X(RotationX) * Matrix.Create...Y(RotationY) * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(loc); }

entonces

(IsCollision(TransformationMatrix ) { sphere.Transform(TransformationMatrix ); }

y

DrawModel(TransformationMatrix ) { effect.World = TransformationMatrix ; }