Hallo erstmal, tolles Forum
!
Ich entwickle momentan einen Terrain-Editor, bei dem ich per Mausklick das Terrain an einer Stelle erhöhen bzw. absenken will.
Mein Ansatz ist der folgende:
Ich "schieße" einen Strahl von der Kamera aus ab.
Die Richtung ist die Blickrichtung der Kamera rotiert je nach Abstand des Mauszeigers vom Mittelpunkt des Bildschirms.
(z.B. Mausklick ganz links am Rand wäre rotiert um -90° um die Y-Achse).
(Hoffentlich habe ich das nicht zu kompliziert ausgedrückt.
)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// Maus-Koordinaten auf [-1.0f;1.0f] skalieren.
mousePos.X = (2.0f * mousePos.X) / 800.0f - 1.0f;
mousePos.Y = (2.0f * mousePos.Y) / 600.0f - 1.0f;
// Koordinaten in Grad der Rotation umrechnen.
mousePos.X *= fov;
mousePos.Y *= fov / (800.0f / 600.0f);
// Rotation mit Kamerarotation kombinieren.
Vector3 rot(Camera->GetRotation());
Matrix mRot(RotationXYZ(rot.X + mousePos.Y, rot.Y + mousePos.X, rot.Z));
// Strahl erstellen (Richtung und Ursprung).
Vector3 dir = mRot.TransformNormal(Vector3(0.0f, 0.0f, 1.0f));
Vector3 orig = Camera->GetPos();
|
Wenn ich testweise mousePos auf (0.0f, 0.0f) setze (also Mitte des Bildschirms) funktioniert es auch (erstes angehängtes Bild), aber ansonsten landet der Strahl leider immer daneben (zwar nicht vollkommen aber schon ein ziemliches Stück).
Im Anhang ist ein Bild davon (grün ist die Stelle wo eigentlich getroffen werden sollte, und rot ist der berechnete Strahl).
Ich bin mittlerweile echt verzweifelt, ich sitze schon über Tage an dem Problem
Vielen Dank im Voraus