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

41

07.09.2010, 17:40

Ich glaube, ich schrieb bereits, dass du den Winkel noch von Grad in Radiant umrechnen musst!

Außerdem würdest du den Punkt somit auf absolute 360° drehen, was dann nicht wieder dem Ausgangsbild entspricht, da dein Ausgangsbild keinen Winkel von 0° verwendet. Nach dem Drehen darfst auch nicht vergessen, den Positionsvektor wieder hinzuzuaddieren.

Edit: Ich empfehle immer noch, eine Matrix zu setzen und den Punkt dann mit D3DXVec3TransformCoord zu transformieren...

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

42

07.09.2010, 17:41

Sorry, hab den einen Wert überlesen, weil du keine Abstände machst!^^

Ich schau mir das mal genauer an. Hab zu meinem vorherigen Beitrag noch ein Edit gemacht...

43

07.09.2010, 17:46

Zu deinem Edit: Ich will sie nicht um ihre rotieren sondern um meine^^ Also so wie sie jetzt schaut einfach im kreis nach links drehen lassen.
@defaultplayer: Die ganz normale Kamera matrix Transformieren oder wie?
Metal ist keine Musik sondern eine Religion.

44

07.09.2010, 17:55

Nein, nehmen wir an, du schaust standardmäßig von Position (0/0/-10) in positive z-Richtung, also Richtung Ursprung (0/0/0). Weil die Länge nicht wirklich zählt, wählen wir für die Richtung, in die geschaut wird (0/0/1). Diese Richtung müssen wir jetzt drehen und schließlich zur Kameraposition hinzuaddieren:

1. Rotationsmatrix erstellen, damit wir den Punkt transformieren können:

C-/C++-Quelltext

1
2
3
float rotx, roty, rotz; // Rotation; beliebig wählen 
D3DXMATRIX matrix; 
D3DXMatrixRotationYawPitchRoll(&matrix, roty, rotx, rotz);

Wenn du die 3 float-Werte in Grad (°) hast, dann multipliziere sie mit PI/180. Aus 360° wird also beispielsweise 2 PI.

2. Punkt transformieren:

C-/C++-Quelltext

1
2
D3DXVECTOR3 p(0, 0, 1); 
D3DXVec3TransformCoord(&p, &p, &matrix);


3. lookat = cameraposition + p;
---------
Ich denke, so müsste es funktionieren.

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

45

07.09.2010, 17:59

Zu deinem Beispiel.
pAt(-1|-16|0)
Camera(-1|-40|-5)

Du willst die Kamera um die y-Achse deines Koordinatensystems drehen. Also brauchst du eigentlich nur den Abstand auf der x/z-Ebene von der Kamera zu deinem Punkt.
Der beträgt also 5. Wenn du nun auf 360 Grad drehst (also nicht UM 360 Grad), rechnest dir den sinuns und cosinus Wert aus.
sin(360) = 0
cos(360) = 1

Danach einfach mit der Länge multipliziert und zur Kameraposition dazu gerechnet.

pAt' = (-1 + 0 * 5|-16|-5 + 1 * 5) = (-1|-16|0)

Genau die gleichen Werte wie zu Beginn. Auch nicht weiter verwunderlich, weil du genau auf 0 grad bist, wenn du also auf 360 drehst, dann ändert sich nichts. ;)
Du musst dir nur bewusst sein, dass du nicht UM 360 drehst, sondern AUF 360. Ich hoff, du verstehst den Unterschied.

EDIT: Ups, da war ich wohl wieder langsamer!^^

defaultplayer hat dir also nun auch einen Lösungsweg gezeicht, hab ihn mir aber nicht genauer angeschaut. Kannts ja mal beides ausprobieren. ;)

EDIT2: Hier noch die Skizze, damit du nachvollziehen kannst, was ich mir dabei gedacht hab.

(Link)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Käsekönig« (07.09.2010, 18:21)


46

07.09.2010, 20:03

Ich hab mir ein kleines Pogramm geschrieben das mir sinus und cosinus auswirft aber der sagt mit das
sin(360) = 0.95896 --- 1
und
cos(360) = -0.283691 --- 0
also genau umgekehrt?
und bei anderen Zahlen wirds dann immer ungenauer
Metal ist keine Musik sondern eine Religion.

47

07.09.2010, 20:07

X( Hiermit schreibe ich dir jetzt zum dritten Mal, dass du den Winkel für sin und cos im Bogenmaß angeben musst!
bogen = grad / 180° * PI
bogen = 360° / 180° * PI = 2 * PI --> lass sin(2 * PI) berechnen und erhalte 0.00000
http://de.wikipedia.org/wiki/Bogenma%C3%9F

Edit: Wenn man -0.283691 auf 0 runden muss, sollte man aber auch misstrauisch werden :P
Hast eigentlich meine Lösung mit D3DXVec3TransformCoord getestet?

48

07.09.2010, 21:21

@defaultplayer: ne noch nicht mach ich grad aber das umrechnen funktioniert.
@Käsekönig: Ja ich kann die Kamera jetzt drehen :D
Metal ist keine Musik sondern eine Religion.

49

08.09.2010, 22:22

@defaultplayer: könntest du mir das mal mit meinem Beispiel ausführlich erklären? Ich komm da nähmlich grad nicht ganz hinter die Technik.
Metal ist keine Musik sondern eine Religion.

50

08.09.2010, 23:14

Sorry für den Tripple Post aber ich hab jetzt so gemacht:

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
float rotx = 0.0f, roty = 5.0f * D3DX_PI/180, rotz = 0.0f;
D3DXVECTOR3 p(-1.0f,-16.0f,0.0f);

...

D3DXMATRIX ViewMatrix; 
    D3DXMATRIX ProjectionMatrix; 

    cd3d.GetDevice()->SetRenderState(D3DRS_LIGHTING,TRUE);
    cd3d.GetDevice()->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
    cd3d.GetDevice()->SetRenderState(D3DRS_DITHERENABLE,TRUE);
    cd3d.GetDevice()->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);

    
    D3DXMATRIX matrix; 
    D3DXMatrixRotationYawPitchRoll(&matrix, roty, rotx, rotz);

    D3DXMatrixLookAtLH(&ViewMatrix, 
                       &g_vCameraPos,
                       &pAt,
                       &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); 
    
    D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, 
                               D3DX_PI/4, 
                               static_cast<float>(cwind.GetWidth()) / static_cast<float>(cwind.Getheight()), 
                               1.0f, 
                               1000.0f ); 
 
    D3DXVec3TransformCoord(&p, &p, &matrix);
    pAt = g_vCameraPos + p; 

    cd3d.GetDevice()->SetTransform(D3DTS_VIEW, &ViewMatrix); 
    cd3d.GetDevice()->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix); 
...

Ist doch genauso wie oben beschrieben oder?
Metal ist keine Musik sondern eine Religion.

Werbeanzeige