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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

03.06.2012, 21:28

Winkel zwischen Vektoren

[Hallo. In meinem Editor soll eine Schwenkfunktion automatisch passieren. Die Kamera braucht dafür 2 Winkel: X und Y(Drehwinkel). Die muss ich berechnen mit 2 Richtungsvektoren. Ich habe die Blickrichtung der Kamera und die Richtung, wo sie sich hin drehen muss. Ich dachte auch mit dem Punktprodukt geht das. Tut es jedoch nicht. Denn ich brauche die Winkel einzeln. Den Winkel für X/Z Ebene habe ich so gefunden:

C-/C++-Quelltext

1
2
float ang = acosf( ( v1.x * v2.x+ v1.z * v2.z )
/ sqrtf( ( v1.x * v1.x + v1.z * v1.z ) * ( v2.x * v2.x + v2.z * v2.z ) ) );

Doch bei Y gibt das Probleme:

C-/C++-Quelltext

1
2
float ang2 = acosf( ( v1.y * v2.y)
/ sqrtf( ( v1.y * v1.y ) * ( v2.y * v2.y ) ) );

Wenn einer der Beiden Vektoren 0 ist habe ich eine 0-Division. Aber wie kann ich jetzt die einzelnen Winkel extrahieren? Z.B.: Vektor1.y = 0 Vektor2.y = 1. Das sollte einen Winkel von 90° ergeben. Mit der Rechnung oben habe ich: §\arccos( 0/\sqrt(0) )§
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.06.2012, 21:44

Ich vermute, dass deine Schwenkfunktion sich über Quaternionen und sphärische Interpolation einfacher lösen ließe ;)

Wie genau soll dieser Schwenk denn aussehen?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

03.06.2012, 21:54

Schnell und zum Ende immer Langsamer. Das habe ich zwar schon hin bekommen, aber ich brauche halt die Winkel :D

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

03.06.2012, 21:57

Wieso genau brauchst du die Winkel?

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

5

03.06.2012, 22:21

Damit berechne ich das schwenken:
CameraWinkelX = CameraWinkelX+WinkelZwischenVektoren*TimeStep.
Diese Berechnung muss ich für x und y durchführen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

03.06.2012, 22:28

Naja, da es sich ja nur um sphärische Koordinaten handelt, wäre wohl der Arkustangens eine Lösung um an die entsprechenden Winkel zu kommen, insbesondere die Funktion atan2() ;)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

04.06.2012, 07:13

Ich brauche aber nicht den Winkel der Kamera. Ich brauche die spährischen Koordinaten des Richtungsvektors von der Kamera zum Objekt.
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

04.06.2012, 07:27

Oh Sorry. In Wikipedia steht ja alles :)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

9

04.06.2012, 19:45

So habe nun meine Versuche getan:

C-/C++-Quelltext

1
2
3
4
5
6
7
Vector3 V;
V = m_Camera->GetCameraPos() - m_ObjectHandler->GetSelectedObjectPosition();
vRot.y = atan2f(V.y, V.x);
//vRot.x = acosf( V.z / (  sqrtf(V.x*V.x + V.y*V.y + V.z*V.z)  ) );
vRot.x = atan2f(sqrtf(V.x*V.x + V.y*V.y + V.z*V.z), V.z);
vRot.x -= m_Camera->GetCameraAngleX() /*- vRot.x*/;
vRot.y -= m_Camera->GetCameraAngleY() /*- vRot.y*/;


Leider ohne Erfolg. Die Kamera dreht sich irgendwo hin. Wenn ich dann noch die vRot.xy mit DEG_TO_RAD in Radiant umwandle dreht sie sich zwar nicht unkontrolliert, aber sie dreht sich Richtung (0,0,1) und bleibt kurz vorher stehen. Irgendwas stimmt da noch nicht...
In jedem Frame wird übrigens mit:

C-/C++-Quelltext

1
2
 m_Camera->SetCameraAngleX( m_Camera->GetCameraAngleX() + vRot.x * fTime );
        m_Camera->SetCameraAngleY( m_Camera->GetCameraAngleY() + vRot.y * fTime );

gearbeitet.
Wer den Fehler findet bitte schreiben :)
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

10

04.06.2012, 20:17

Fehler gefunden. Ich habe meinen Richtungsvektor falschrum berechnet.
Danke an alle.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige