Matrizen (aus Soufians Uservorstellung entfernt)

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Matrizen (aus Soufians Uservorstellung entfernt)

Beitrag von cloidnerux » Di Jan 20, 2009 5:00 pm

So, eine Matrice(Matrix) ist eine 3x3 (X x X) Feld, also zB. sowas:

Code: Alles auswählen

1 1 1
1 1 1
1 1 1
Damit kann man dann verschiedene Rechenungen Durchführen(*,/,+,-).
In der 3D Programmierung werden dadurch Transformationen an Objekten durchgeführt, heißt man speichert die Tarnsformation in eine Matrix und wendet die Matrix dann auf das Objekt an.
Ein Vector ist im Grundegenommen eine Positionsmarke(x,y,z). Mit Vectoren werden aber alles Mögliche gesteuert, z.B KAmera ausrichtung...
Hier mal ein Paar code snippets eines mit DirectX von mir programmierten Ego-Shooters(ist noch in der Entwicklung):

Code: Alles auswählen

float kamera::kamera_schwenken(float seit, float hoch)
{
	D3DXVECTOR3 blick, norm;
	D3DXMATRIX dreh;

	blick = da_gucke_ich_hin - hier_bin_ich;
	D3DXVec3Normalize(&blick, &blick);
	if(blick.x*blick.x + blick.z*blick.z < 0.005)
	{
		if(((blick.y > 0) && (hoch > 0)) || ((blick.y < 0) && (hoch < 0))) hoch=0;
	}
	D3DXVec3Cross(&norm, &blick, &D3DXVECTOR3(0,1,0));
	D3DXMatrixRotationAxis(&dreh, &norm, hoch);
	D3DXVec3TransformNormal(&blick, &blick, &dreh);
	D3DXMatrixRotationY(&dreh, seit);
	D3DXVec3TransformNormal(&blick, &blick, &dreh);
	da_gucke_ich_hin = hier_bin_ich + blick;
	return seit;
}
Damit wird die Kamera geschwenkt.

Code: Alles auswählen

	int z=0, s=0;
	D3DXMATRIX world;
	D3DXMATRIX view;
	D3DXMATRIX player3, player2;
	D3DXMATRIX view2;
//	player.punkt1=D3DXVECTOR2(player_position.x+10,player_position.z+5);
//	player.punkt2=D3DXVECTOR2(player_position.x-10,player_position.z-5);
	//D3DXVECTOR3 kamera2 = D3DXVECTOR3(da_gucke_ich_hin.x+10, da_gucke_ich_hin.y, da_gucke_ich_hin.z);
	mein_timer.start();
	mein_directx.device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(128,255,255),1.0f, 0);
	mein_directx.device->BeginScene();
	//
	//Kamera Setzen
	//
	D3DXMatrixLookAtLH( &view, &meine_kamera.hier_bin_ich, &meine_kamera.da_gucke_ich_hin, &D3DXVECTOR3(0.0f, 1.0f,0.0f));
	meine_map.map_objekt.draw();
	//
	//Player Spwanen
	//
	//D3DXMatrixTranslation(&world2, w_x,w_y, w_z);
	D3DXMatrixTranslation(&player3, mein_player.pos.x, mein_player.pos.y, mein_player.pos.z);
	D3DXMatrixRotationY( &player2 , mein_player.player_rotation_y);
	D3DXMatrixMultiply(&player3, &player2, &player3);
	mein_directx.device->SetTransform(D3DTS_WORLD, &player3);
	mein_player.player_objekt.draw();
Und das ist der anfagngsteil meiner render() funktion.
Aber bevor du auhc nur ein Bisschen DirectX oder OpenGL Programmieren kannst, musst du C++ beherschen.

Und noch ein Buch Tipp: Spieleprogrammieren mit C++ und DirectX von Dr. Ulrich Kaiser und Phillip Lensing.
Und damit du mit C++ nicht zu kurz kommst: C++ von A bis Z von Jürgen Wolf.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Soufian

Beitrag von Dirty Oerti » Di Jan 20, 2009 5:59 pm

Ein Vector ist im Grundegenommen eine Positionsmarke(x,y,z).
Ein Vector ist wie der Zeiger einer Uhr.
Damit KANN man eine Position (relativ zu einem Ausgangspunkt) angeben.



a--------->b

Das ist ein (eindimensionaler) Vector : (10)
Das heißt, der Zeiger zeigt von a (per Definition bei Vectoren = 0) nach b.
In X-Richtung zeigt er 10 EInheiten, andere Richtungen gibt es nicht.



a----->
´´´´´´´´´|
´´´´´´´´´|
´´´´´´´´V
´´´´´´´´´b

Dieser Vector ist 2 Dimensional.
Er zeigt 6 Einheiten in x-Richtung und 3 Einheiten in y-Richtung.
Schreiben würde man das so (eigntl die Zahlen übereinander) (6 | 3)

Das ganze geht natürlich auch in 3D.

Mit Vectoren kannst du vieles darstellen. Bewegungen, Kräfte, Normalen etc.
Oder auch eine Position.
Dabei zeigt der Vector vom Nullpunkt deines Systems zur Position.

Hast du nun einen Geschwindigkeitsvector kannst du ihn zur Position addieren und bekommst die neue Position.

Pos: ( 10 | 10 | 10 )
Geschwindigkeit (z.b. in Einheiten pro Frame): ( 1 | -1 | -2 )

Nach einem Frame bist du dann an Position: ( 11 | 9 | 8 )
Nach N Frames bist du an Position

( 10 + 1*N | 10 + (-1)*N | 10 + (-2)*N )

Aber lass das mit 3d erstmal ;)

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten