Ich hab jetzt mal mit dem Code von @ronald drunk rumgetüftelt. Dabei bekomme ich die besten Ergebnisse bei diesem Code:
local rotGrid = Matrix.create(Vector3(-x, -y + h / 2, 1), Vector3(0, 0, r)) --x + y: Position des Rotationspunktes, r: Rotation, h: Höhe (Länge) des Grids
local p = Vector3(wx, wy, 1) --wx + wy: Punkte auf dem MTA Grid
local newP = rotGrid:transformPosition(p)
Und zurück aufs MTA Grid:
local rotGrid = Matrix.create(Vector3(-x, -y + h / 2, 1), Vector3(0, 0, r)) --x + y: Position des Rotationspunktes, r: Rotation, h: Höhe (Länge) des Grids
local p = Vector3(px, py, 1) --px + py: Punkt auf rotiertem Grid
local mtaGrid = rotGrid:inverse()
local newP = mtaGrid:transformPosition(p)
Das ganze Funktioniert aber nur wenn das Grid nicht rotiert ist, sondern nur auf der x und y Achse verschoben ist.
Ist das Grid rotiert sieht das so aus:
Zur Erklärung:
Schwarze Linien: Das rotierte Grid.
Rote, Grüne, Blaue Linien: Stellen das Koordinatensystem von MTA dar. Der Punkt ist auch gleichzeitig der Rotationspunkt.
Zur weißen und violetten Linie: Die violette Linie folgt stets der Maus, diese kann also ignoriert werden. Die weiße Linie folgt auch der Maus, aber nur in gerundeten Schritten auf dem rotiertem Grid. Dazu wird die Position der Maus auf das Grid konvertiert, der Wert wird auf ganze Zahlen gerundet und dann wieder auf die Weltkoordinaten konvertiert, damit die weiße Linie an der richtigen Stelle gezeichnet werden kann.
Wie gesagt, wenn das Grid nicht rotiert ist klappt das, wenn es rotiert ist nicht.