Du bist nicht angemeldet.

Werbeanzeige

1

20.07.2014, 23:37

OpenGL LookAt Funktion

Hi,
ich verwende die LookAt Funktion um ein Viereck das in x und z Richtung eine Ausdehnung hat so dazustellen, dass es räumlich wirkt. Nun hab ich eine Vorstellung wie am Ende mein Viereck aussehen soll. Um dies so zu bewerkstelligen wie ich das möchte, wäre es für mich gut besser die Mathematik hinter der Funktion zu verstehen. Ich weis in welchem Winkel mein Viereck gedreht, das Viereck nach der drehung platziert und die länge der unteren Kante sein soll. Wie könnte ich am besten berechnen, wie die einzelnen Parameter eingestellt werden sollten um die zu bewerkstelligen.


Viele Grüße und vielen Dank schon mal





DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

20.07.2014, 23:55

Mathematik Oberstufe am Gymnasium.
Was du suchst nennt sich "Abbildungen". Hier mal meine LookAt Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void mat4::lookAt(const float x, const float y, const float z, const float xlook, const float ylook, const float zlook, const float xup, const float yup, const float zup){
    mat4 m;
    vec3 dir, right, up, eye;
 
    eye.x = x;
    eye.y = y;
    eye.z = z;

    up.x = xup;
    up.y = yup;
    up.z = zup;

    dir.x = (xlook-x);
    dir.y = (ylook-y);
    dir.z = (zlook-z);
    dir.normalize();

    right.cross(dir, up);
    right.normalize();

    up.cross(right, dir);
    up.normalize();
 
    m.values[0] = right.x;
    m.values[4] = right.y;
    m.values[8] = right.z;
    m.values[12] = -right.dot(eye);
 
    m.values[1] = up.x;
    m.values[5] = up.y;
    m.values[9] = up.z;
    m.values[13] = -up.dot(eye);
 
    m.values[2] = -dir.x;
    m.values[6] = -dir.y;
    m.values[10] = -dir.z;
    m.values[14] = dir.dot(eye);
 
    m.values[3] = 0;
    m.values[7] = 0;
    m.values[11] = 0;
    m.values[15] = 1;

    *this *= m;
}


alles

Es gibt bestimmt auch super Bücher zu dem Thema, auch in Büchern über (modernes) OpenGL. Den Matrizen Stack soll(te) man nicht mehr nutzen.

3

21.07.2014, 11:26

Und wie kann ich aus diesen Informationen über die LookAt Funktion die Parameter berechnen damit mein Viereck wie gewünscht dargestellt wird? Akktuell kann ich mit den Informationen nichts anfangen.

Vielen Dank

4

21.07.2014, 11:37

Mir ist ehrlich gesagt nicht so ganz klar, was genau du machen willst. Was intern so grob passiert, ist das hier:

https://de.wikipedia.org/wiki/Grafikpipeline

Möchtest du aus einem Bild von einem Viereck, dessen Maße du kensnt, die Kameraparameter ausrechnen? Das geht natürlich, aber die Herleitung der Formel könnte etwas Mühe machen.
Lieber dumm fragen, als dumm bleiben!

DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

21.07.2014, 14:09

Du bekommst daraus eine 4x4 Matrix, die multiplizierst du mit deinen Koordinaten, und viola, du hast dein Ergebnis (möglicherweise, weiß auch nicht genau was du vor hast).

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

21.07.2014, 14:29

Er will wissen wie er seine Matrix genau aufbauen muss, damit am Bildschirm sein Quad genau X Pixel breit ist. Das ist an sich aber eine eher unsinnige Forderung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

21.07.2014, 15:12

Die lookat Funktion gibt dir eine Transformationsmatrix zurück, die einen Vektor vom World space in den camera space transformiert und nutzt als Parameter dazu die Position der Kamera in World coordinates, einen Punkt auf den die Kamera schauen soll in World coordinates und einen richtungsvektor, der die nach oben gerichtete Richtung angibt.

Bei unbekannten Wörtern bitte googlen.

Was genau meinst du jetzt unter "die Parameter"?
Was ist denn die gewünschte "räumliche" Darstellung deines Vierecks?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

21.07.2014, 16:00

Der Spaß ist, dass er etwas berechnen will allein über die View-Matrix, wo eigentlich aber View-Matrix und Perspective-Matrix beteiligt sind.

Er sollte definitiv einfach mal ein pixelgenaues Bild von dem malen, was er eigentlich will. Und ich zweifle, dass das ein sinnvolles Ziel ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

23.07.2014, 12:41

Zu meiner Frage nun. Ich hab ein Viereck wie auf diesem bild: es hat eine x und z ausdehnung.
Ich möchte es nun wie hier dagestellt haben: mit einer relativen unteren Kantenlänge in x richtung von 0,6 in beide x ricthungen vom ursprung der bei 0,0,0 liegt ausgesehen. Eben falls soll es einen neigungswinkel von 15° aufweisen.
Wie kann ich das nun mit der lookat funktion realisieren?

Vielen Dank schon mal

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

23.07.2014, 14:01

Gar nicht, denn allein mit Lookat ist das nicht realisierbar. Die Projektionsmatrix ist dafür ebenfalls relevant.
Wozu genau brauchst Du das in der Form? Die vermutlich noch kommenden Quadrate daneben würden ja dann ganz anders aussehen. Sag uns einfach mal was Dein Ziel des Ganzen ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige