[MonoGame] Ray BoundingBox Intersection Bug

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von φConst.

    [MonoGame] Ray BoundingBox Intersection Bug

    Guten Abend,
    Ist das etwa ein Ray Bug, oder mein Fehler:(Anhang)

    Code:

    C#-Quellcode

    1. public DefaultCubeStructure? Remove(Ray r, float max_distance)
    2. {
    3. var Chunk = GetChunkArea(Camera3D.CameraPosition);
    4. int? DistanceToCube = null;
    5. DefaultCubeStructure? Cube = null;
    6. if (Chunk != null)
    7. {
    8. for (int i = Chunk.RenderingCubes.Count - 1; i >= 0; i--)
    9. {
    10. int Index = Chunk.RenderingCubes[i];
    11. DistanceToCube = (int?)Chunk.ChunkData[Index].BoundingBox.Intersects(r);
    12. if (DistanceToCube.HasValue && DistanceToCube > (int)max_distance)
    13. {
    14. BoundingBoxRenderer.Render(Chunk.ChunkData[Index].BoundingBox, Global.GlobalShares.GlobalDevice, Camera3D.ViewMatrix, Camera3D.ProjectionMatrix, Color.Red);
    15. Cube = Chunk.ChunkData[Index];
    16. break;
    17. }
    18. }
    19. }
    20. return Cube;
    21. }



    Woran liegt das?

    Danke.
    Bilder
    • Screenshot (425).png

      705,47 kB, 1.920×1.080, 160 mal angesehen
    • Screenshot (429).png

      578,66 kB, 1.920×1.080, 154 mal angesehen
    Und Gott alleine weiß alles am allerbesten und besser.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „φConst“ ()

    Hab's..

    Die Remove-Methode gibt alle Cubes zurück, die vom Ray geschnitten wird.

    Einfach nach Distanz sortieren, dann klappt's pefekt.

    C#-Quellcode

    1. public IEnumerable<BoundingBox> Remove(Ray r, float max_distance)
    2. {
    3. var Chunk = GetChunkArea(Camera3D.CameraPosition);
    4. float DistanceToCube = .0f;
    5. int Face = 0;
    6. if (Chunk != null)
    7. {
    8. for (int i = Chunk.IndexRenderer.Count - 1; i >= 0; i--)
    9. {
    10. int Index = Chunk.IndexRenderer[i];
    11. DistanceToCube = 0;
    12. if (BoundingBoxRenderer.IntersectRayVsBox(Chunk.ChunkData[Index].BoundingBox, r, out DistanceToCube, out Face))
    13. yield return Chunk.ChunkData[Index].BoundingBox;
    14. }
    15. }
    16. }


    Zur Extraktion des Würfels, dass anvisiert ist:

    C#-Quellcode

    1. var Value = ChunkManager.Remove(Camera3D.Ray, 13).ToList();
    2. Value = Value.OrderBy(p => (p.Min - Camera3D.CameraPosition).Length()).ToList();
    3. if(Value.Count > 0)
    4. BoundingBoxRenderer.Render(Value[0], GraphicsDevice, Camera3D.ViewMatrix, Camera3D.ProjectionMatrix, Color.Red);


    Liebe Grüße.
    Und Gott alleine weiß alles am allerbesten und besser.