Registriert: Mi Nov 30, 2011 21:41 Beiträge: 136 Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hallo allerseits,
Ich bin mal wieder am verzweifeln. :/ Ich will das wenn ich an einen Ort klicke, ein Objekt an diesem Punkt erscheint, so wie in einem Leveleditor.
Das funktioniert prima, solange ich die Kamera nicht drehe, bzw. nur geringfügig drehe. Die Objekte erscheinen wie geplant auf der xz-Ebene. Sobald ich aber Anfang mich um 90° nach links oder nach recht zu drehen, passiert folgendes: Wenn ich an einen Punkt klicke erscheint der Busch nicht dort, aber in der gleichen xz-Richtung nur mit größerer Entfernung weiter hin. Den folgenden Code verwende ich für die Positionierung des Objektes.
glMatrixMode(GL_MODELVIEW);// Modellmatrix laden, da diese als default aktiviert sein soll.
Projection := MyCamera.ExportPerspectiveToXYZ();// Läd den X,X-Wert der Projektions Matrix in Projection.X und den Y,Y-Wert der Projektions Matrix in Projection.Y
Perspective := MyCamera.ExportToMatrix();// Lädt die Modelview Matrix der Camera in Perspective.
Rotation := MyCamera.Rotation;// unwichtig, hab ich zu Test-Zwecken eingebaut und entferne ich am Ende wieder.
pVX := meGetXVector(Perspective);// 0. Spalte (X-Achse) der Modelview Matrix in X-Achsen Vektor einlesen.
pVY := meGetYVector(Perspective);// 1. Spalte (Y-Achse) der Modelview Matrix in X-Achsen Vektor einlesen.
pVZ := meGetZVector(Perspective);// 2. Spalte (Z-Achse) der Modelview Matrix in X-Achsen Vektor einlesen.
ParX :=(X /960-1);// Hier rechne ich aus, wie viel % des X-Vektors an den Z Vektor angehängt werden müssen damit dem angeklickten Punkt entspricht.
ParY :=-(Y /540-1);// X, Y sind hierbei die auf dem Bildschirm angeklickten Koordinanten, von oben, links. Daher auch das Minus vor dem Y.
// erst der komplette Z-Vektor, dann je nachdem wie weit man nach rechts geklickt hat der ParX Wert multipliziert mit dem X-Wert aus der Projektionsmatrix und das selbe mit dem y-Vektor.
ViewVector := meNormalize(ViewVector);// Brauch man eigentlich nicht aber beim Testen hab ich es einfach mal eingebaut.
// Ab hier dann einfach Schnittpunkte Gerade mit Ebene (z = 0).
FinalPosition.Y:=0;// Schnittpunkt mit der X-Z Ebene ermitteln, wobei (-MyCamera.Position.Y / ViewVector.Y) dem Vielfachen des Vektors entspricht um Y = 0 zu erfüllen.
i :=random(length(MyPosArray));// Zu Testzwecken habe ich bereits Objekte und positioniere nur ein zufälliges von ihnen, am Zielpunkt.
MyPosArray[i].X:= FinalPosition.X;// Nicht wundern, dass hier Y fehlt, das bleibt standardmäßig auf Null.
MyPosArray[i].Y:= FinalPosition.Z;
end;
Wie bereits gesagt, sobald ich die Kamera um mehr nach 90° nach links oder rechts drehe kommen, werden die Objekte weiter weg als mein eigentlicher Mausklick gesetzt. Wenn ihr mir irgendwie helfen könntet wäre ich sehr dankbar.
function meGetXVector(const iMatrix: TMeleeMatrix): TMeleePosition;
begin
result.X := iMatrix[0];
result.Y := iMatrix[1];
result.Z := iMatrix[2];
end;
function meGetYVector(const iMatrix: TMeleeMatrix): TMeleePosition;
begin
result.X := iMatrix[4];
result.Y := iMatrix[5];
result.Z := iMatrix[6];
end;
function meGetZVector(const iMatrix: TMeleeMatrix): TMeleePosition;
begin
result.X := iMatrix[8];
result.Y := iMatrix[9];
result.Z := iMatrix[10];
end;
EDIT: Mir ist letztendhin etwas komischen aufgefallen: Obwohl ich die Kamera nur um die y und x-Achse drehe ist trotzdem der Y-Wert des X-Achsen Vektors nicht 0 noch annähernd 0?
alternativ kannst du natuerlich auch die project funktion nehmen um deine Geometrie nach 2D zu projezieren (funzt aber in diesen Beispiel nicht fuer Ortho)
unproject duerfte aber am leichtesten sein, da die meisten Projekte sowieso tracing fuer Kollision schon haben.
Registriert: Mi Nov 30, 2011 21:41 Beiträge: 136 Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hat funktioniert, ich musste nur vorher die Tranformation der Kamera rückgängig machen bzw. Hab einfach Matrix[12, 13, 14] = 0 gesetzt, weil ja Unproject bereits die Position der Kamera in die Berechnung mit einbezieht. Hab für WinZ einfach 0.5 ingesetzt.
Mein Code falls jemanden interessiert:
Code:
procedure Click(X, Y: integer);
var Perspective, Projection: TGLMatrixd4; Viewport: TGLVectori4;
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.