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

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

1

04.10.2013, 13:44

Probleme mit tbObjekt (Relative Rotation)

Liebe Leser

Ich weis das es hierzu bereiz einige Themen gibt. aber mir hat es leider nicht weitergeholfen

Ich Entwickle grade mein erstes Spiel. (Action-Adventure)

Ich Arbeite Grade an der Steuerung des Spielers. Der Spieler soll sich um
die Y Achse (rechts / links schauen) und um die X Achse(oben / unten schauen).
Wie die Ego_Shouter Perspective;

Wen ich den Spieler etwas um die Y Achse drehe und danach um die X Achse. Dreht der Spieler sich plötzlich mit um die Z Achse. Je weiter ich mich vom Ursprung entferne desto größer ist die Rotation um die Z Achse.
Obwohl m_vRotation.z = 0 ist.

Hier ist der Code. Ich haben ihn etwas gekützt

Die Klasse CPlayer Stellt einen Spieler dar. Sie ist ähnlich wie CShip in Galactica aufgebaut

CPlayer

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
// Den Spieler Steuen Lassen 
Control(fTime); 

//Bewegungsvector Begrenzen 
if (m_vVelocity.x > 2.75f) m_vVelocity.x = 2.75f; 
else if (m_vVelocity.x < -2.75f) m_vVelocity.x = -2.75f; 
if (m_vVelocity.z > 2.75f) m_vVelocity.z = 2.75f; 
else if (m_vVelocity.z < -2.75f) m_vVelocity.z = -2.75f; 


//Drehung begrenzen 
if (m_vRotation.y > 1.75f) m_vRotation.y = 1.75f; 
else if (m_vRotation.y < -1.75f) m_vRotation.y = -1.75f; 
if (m_vRotation.x > 1.75f) m_vRotation.x = 1.75f; 
else if (m_vRotation.x < -1.75f) m_vRotation.x = -1.75f; 

//BewegungsVector Abschwäschen 
if(pf_Button[TB_KEY_A] == FALSE && pf_Button[TB_KEY_D] == FALSE && pf_Button[TB_KEY_S] == FALSE && pf_Button[TB_KEY_W] == FALSE) 
m_vVelocity = m_vVelocity / 1.10f; 

//Rotation Abschwäschen 
if(pf_Button[TB_KEY_LEFT] == FALSE && pf_Button[TB_KEY_RIGHT] == FALSE && pf_Button[TB_KEY_UP] == FALSE && pf_Button[TB_KEY_DOWN] == FALSE) 
m_vRotation = m_vRotation / 1.20; 

// Bewegung einsetzen 
AddVelocityRel(mv_Steering * fTime); 
AddRotationRel(mv_Rotation * fTime); 

// Matrix Updaten und Bewegung Starten 
Update(); 
Move(fTime);


Die CPlayer::Control Methode Steuert den Spieler. Sie wird in Move aufgerufen

C-/C++-Quelltext

1
2
3
4
5
6
7
// Bewegung Durchführen 
mv_Steering.x = ((pf_Button[TB_KEY_D] - pf_Button[TB_KEY_A]) * 4); 
mv_Steering.z = ((pf_Button[TB_KEY_W] - pf_Button[TB_KEY_S]) * 4); 

// Rotation Durchführen 
mv_Rotation.y =(( pf_Button[TB_KEY_RIGHT] - pf_Button[TB_KEY_LEFT])* 4); 
mv_Rotation.x =(( pf_Button[TB_KEY_UP] - pf_Button[TB_KEY_DOWN])* 4);


Die CGame::SetProjection erstellt und Setzt Kamera und Projectionsmatrix.

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
tbDirect3D &D3D = tbDirect3D::Instance(); 

// Parameter 
float f_Clipping; 
float f_FOV; 
tbVector3 v_CameraPos; 
tbVector3 v_CameraLock; 
tbVector3 v_CameraUp; 
tbMatrix m_Camera; 
tbMatrix m_Projection; 

// Parameter Werte zuweisen 
f_Clipping = 500.0f; 
v_CameraPos = mp_Player->RelToAbsPos(tbVector3(0.0f,0.5f,0.0f)); 
v_CameraLock = v_CameraPos + mp_Player->m_vZAxis; 
v_CameraUp = mp_Player->m_vYAxis ; 
f_FOV = TB_DEG_TO_RAD(70.0f); 

// Matrizen erzeugen 
m_Camera = tbMatrixCamera(v_CameraPos,v_CameraLock,v_CameraUp); 
m_Projection = tbMatrixProjection(f_FOV,D3D.GetAspect(),0.005f,f_Clipping); 

// Matrizen einsetztem 
D3D.SetTransform(D3DTS_VIEW, m_Camera); 
D3D.SetTransform(D3DTS_PROJECTION, m_Projection);


Ich hoffe einer von euch kann mir helfen

Liebe Grüße
Sebastian Müller

FSA

Community-Fossil

  • Private Nachricht senden

2

27.10.2013, 17:06

Wenn ich nicht irre müsste das Stichwort Kugelkoordinaten dir weiterhelfen.

Zitat

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