3D Frustum-Ebene Schneidung in Lua

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • 3D Frustum-Ebene Schneidung in Lua

      Hallo zusammen,

      in meinem letzten Mathethread habe ich über die 2D Ebene-Ebene Schneidung geschrieben, mit Lua Implementierung und tiefer mathematischer Analyse. Basierend auf der gleichen Mathematik möchte ich euch nun die 3D Frustum-Ebene Schneidung vorstellen.

      twitter.com/rplgn/status/1230073312816005120

      Link zur MTA Resource: github.com/quiret/mta_lua_3d_math
      Link zum Thread auf dem offiziellen MTA Forum: forum.mtasa.com/topic/122576-s…e-rendering-in-mtasa-lua/
      Promotional Video: youtube.com/watch?v=RQy3Q4Xe110

      Beschreibung:
      Ein Frustum dient zur Modellierung der Fluchtpunktperspektive. Graphics APIs wie Direct3D oder OpenGL bieten eine schnelle Schnittstelle zur Hardwareimplementierung einer Frustum-Ebene Schneidung. Doch um die Grundlagen des Problems zu verstehen, auf dem die Graphics Industrie ihre GPUs aufbaut, lohnt es sich die Mathematik dahinter anzuschauen und spielerisch mit Software zu lernen.



      Der Quellcode besteht aus einem Frustum-Ebene Schneidungs Solver (math_shared.lua), einer RenderWare DFF Ladungsumgebung (rw_shared.lua) und vieler niedlicher Hilfsstrukturen (Ladebalken für das Zeichnen, vorimplementierten Befehlen für die Zeichnung).

      Benutzung der MTA Resource:
      Einfach in den Server Resources Ordner reinpacken mit dem Namen "math_3d_nonlin" und dann in der Serverconsole tippen:

      Quellcode

      1. refresh
      2. start math_3d_nonlin
      Tutorial: Wie man ein Frustum mit Ebenen schneidet
      Falls du die MTA Resource oben heruntergeladen hast, dann können wir ein wenig mit dieser herumspielen. Erstelle zuerst eine neue Lua Datei namens "_math_test.lua" mit folgendem Inhalt:

      LUA-Quellcode

      1. local viewFrustum = createViewFrustum(
      2. createVector(0, 0, 3),
      3. createVector(5, 0, 0),
      4. createVector(0, 0, 5),
      5. createVector(0, 20, 0)
      6. );
      7. local test_planes = {
      8. createPlane(
      9. createVector(-2, 0, -2),
      10. createVector(4, 0, 0),
      11. createVector(0, 20, 4)
      12. ),
      13. createPlane(
      14. createVector(-2, 25, -2),
      15. createVector(4, 0, 0),
      16. createVector(0, -14, 10)
      17. ),
      18. createPlane(
      19. createVector(-2, 0, -6),
      20. createVector(0, 20, 0),
      21. createVector(0, 0, 20)
      22. ),
      23. createPlane(
      24. createVector(2, 0, -6),
      25. createVector(0, 20, 0),
      26. createVector(0, 0, 20)
      27. )
      28. };
      29. local function task_test_draw(thread)
      30. local bbuf = create_backbuffer(640, 480, 255, 255, 0, 50);
      31. local dbuf = createDepthBuffer(640, 480, 1);
      32. local time_start = getTickCount();
      33. for m,n in ipairs(test_planes) do
      34. local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, n, true);
      35. if ( gotToDraw ) then
      36. outputDebugString( "drawn " .. numDrawn .. " pixels (skipped " .. numSkipped .. ")" );
      37. end
      38. end
      39. local time_end = getTickCount();
      40. local ms_diff = ( time_end - time_start );
      41. outputDebugString( "render time: " .. ms_diff .. "ms" );
      42. taskUpdate( 1, "creating backbuffer color composition string" );
      43. local bbuf_width_ushort = num_to_ushort_bytes( bbuf.width );
      44. local bbuf_height_ushort = num_to_ushort_bytes( bbuf.height );
      45. local pixels_str = table.concat(bbuf.items);
      46. local bbuf_string =
      47. pixels_str ..
      48. ( bbuf_width_ushort ..
      49. bbuf_height_ushort );
      50. taskUpdate( false, "sending backbuffer to clients (render time: " .. ms_diff .. "ms)" );
      51. local players = getElementsByType("player");
      52. for m,n in ipairs(players) do
      53. triggerClientEvent(n, "onServerTransmitImage", root, bbuf_string);
      54. end
      55. outputDebugString("sent backbuffer to clients");
      56. end
      57. addCommandHandler( "testdraw", function(player)
      58. spawnTask(task_test_draw);
      59. end
      60. );
      Alles anzeigen
      Folgende Zeile muss in meta.xml ergänzt werden:

      XML-Quellcode

      1. <script type="server" src="_math_test.lua" />
      Verbindet euch mit eurem MTA Server und startet die Resource neu. Dann führt den Befehl "testdraw" aus. Ihr solltet ungefähr Folgendes sehen:



      Durch Ändern der Ebenen in der Variable "test_planes" kannst du den Inhalt der Zeichnung ändern die dir durch "testdraw" dargestellt wird.

      Nützliche Befehle:
      • draw_model: Zeichne eine DFF und lade sie zu allen Spielern hoch
      • send_bbuf: Zeichne die Szene die am Anfang von math_server.lua definiert worden ist

      Viel Spaß mit dem Code! 8) :D

      Habt Ihr Fragen zur Mathematik oder zur Implementierung? Ich möchte euch so gut wie möglich in diesem Thread beraten.
      Developer of Magic.TXD

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von The_GTA () aus folgendem Grund: Bilder eingefügt, Video eingefügt