Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Fluaflubfluc

unregistriert

1

27.10.2011, 21:21

Gegner soll Kamera anschauen

Hi,

in meinem Spiel soll der Gegner die Kamera anschauen. Was für eine Formel benötige ich dafür.
Ich brauche die Formel, die die Winkelzahl in "float EnemyRot" speichert.

Ich freue mich auf Antworten!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.10.2011, 23:31

3D? 2D? Prinzipiell brauchst du nur den Vektor vom Gegner zum Kamera ausrechnen und dann eben eine Matrix bauen, die den Kopf entlang dieses Vektors ausrichtet...

Fluaflubfluc

unregistriert

3

28.10.2011, 11:04

3D, aber wie soll ich das machen? Schick mir mal bitte eine Formel, die die Winkelzahl ausrechnet.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.10.2011, 11:19

Die Formel kannst du dir schön selber überlegen. Wir geben dir aber genug Hinweise, dass du das auch schaffen kannst.
Erster Hinweis: http://de.wikipedia.org/wiki/Tangens und für dich besonders interessant http://de.wikipedia.org/wiki/Arkustangens_und_Arkuskotangens!

PS: Wenn du wirklich in 3D arbeitest, dann hilft dir ein Winkel gar nicht weiter.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

28.10.2011, 14:03

Du brauchst keine Winkel. Vor allem in 3D läufst du praktisch immer in die falsche Richtung wenn du irgendwas mit Winkeln anstellen willst.
Im Prinzip gehst du gleich vor, wie beim Erstellen einer Kameramatrix. Alles was du machen musst, ist die Vektoren finden, die in Richtung der Achsen des Koordinatensystems, in dem du deinen Gegner platzieren willst, zeigen. Erstmal nimmst du den normalisierten Vektor vom Gegner zum Spieler. Damit hast du eine Achse festgelegt (z.B. die z-Achse). Dann definierst du einen zweiten Vektor, der die Rotation um diese Achse festlegt (ein sog. Up-Vektor, weil er anzeigt wo "oben" ist). Dann machst du zwei Kreuzprodukte um aus diesem Vektor und dem ersten Achsenvektor die beiden übrigen Achsen (x- und y-Achse) zu bestimmen. Wenn du alle 3 Achsen hast, dann brauchst du diese nurmehr in die Zeilen bzw. Spalten einer Matrix zu packen und bist fertig.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

29.10.2011, 20:21

Ich hab gerade etwas ähnliches vor, stellst du dir das so vor dot?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
vec3 ich = vec3(-3, -2, -2);
vec3 ziel = vec3(1, 1, 1);

vec3 ICHzuZIEL = (ziel-ich).normalize();

vec3 up = vec3(0, 1, 0);
vec3 x = cross(a, up);
vec3 y = cross(up, a);

// Matrix = ???


Und wie würdest du diese Werte jetzt in die Matrix füllen?

[Edit]

Nur um das nochmal zu sagen: mein Matrix struct kann rotieren, aber anhand einer Gradzahl ;) das ist wahrscheinlich auch das Problem des Threadstarters.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (29.10.2011, 20:43)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

30.10.2011, 14:56

Ich möchte das gerne nochmal aufgreifen:

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
// 0 = Flugzeug, 1 = Pfeil, 2 = Vektor

    vec3 aircraft = objects[0]->getPosition();
    vec3 destination = objects[1]->getPosition();

    vec3 dir = destination-aircraft;
    dir.normalize();
    //objects[0]->addPosition(dir/fps*5);

    vec3 up = vec3(0, 1, 0);
    vec3 x = up.cross(up, dir);
    vec3 y = up.cross(x, dir);

    mat4 m = mat4(x.x, 0, 0, 0,
                  0, y.y, 0, 0,
                  0, 0, dir.z, 0,
                  0, 0, 0, 1);

    // Matrix erstellen
    planeModelview.setIdentity();
    planeModelview.lookAt(view[0], view[1], view[2],
                          view[3], view[4], view[5],
                          view[6], view[7], view[8]);

    planeModelview *= m;


So wird die Matrix erstellt mit der ich später das "Flugzeug" rendere. Das funktioniert auch, allerdings dreht sich das Teil nicht auf allen Achsen in Richtung Zielpunkt (hier der rote Pfeil).


(Link)


Die Szene jeweils mit 4 verschiedenen Positionen des Pfeils (Kamera verschiebt sich nicht).

Ich denke es liegt daran wie ich die Vektoren in die Matrix fülle. Aber das hast du auch nicht genau beschrieben dot. Deshalb hab ich mal gegooglet: http://wiki.delphigl.com/index.php/Tutor…ne_Achse_drehen
Aber da blick ich nicht so ganz durch ^^ könntest du das also nochmal kurz beschreiben?

[Edit]

*hust* ok


(Link)


C-/C++-Quelltext

1
2
3
4
mat4 m = mat4(x.x, x.y, x.z, 0,
                  y.x, y.y, y.z, 0,
                  dir.x, dir.y, dir.z, 0,
                  0, 0, 0, 1);


Aber das Teil wird immer falsch skaliert. Also was fehlt noch? Mathe ist echt nicht mein Ding.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (30.10.2011, 15:04)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

30.10.2011, 15:15

Deine Vektoren sind wohl nicht normalisiert...

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

30.10.2011, 15:53

Danke, funktioniert :)

Werbeanzeige