Pouit Matic



Matice identity: 
Matice je to co dl na aplikaci 3d. Jestlie by jsme nemli matice, rotace a posuny by byly prakticky nemon. My bychom museli pmo run zadvat kad vrchol ve scn! To je stran pedstava pro kadho 3d programtora . Standardn matice v 3d je 4x4.

[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]
 
Jestlie by jste vynsobili bod  matic nahoe,(ekvivalent nsoben jednou)  dn zmna by se nekonala. To je nazvno matic identity. Pirozen my chceme trochu vc ne toto,proto my tak mme... 

Matice posunu:

tx, ty a tz pedstavovuj nae hodnoty posunu. 

[ 1,  0,  0, 0]
[ 0,  1,  0, 0]
[ 0,  0,  1, 0]
[tx, ty, tz, 1]


Matice rotace:

Rotace kolom x osy:
[ 1,         0,          0, 0]
[ 0, cos(xrot), -sin(xrot), 0]
[ 0, sin(xrot),  cos(xrot), 0]
[ 0,         0,          0, 1]


Rotace kolem Y osy:
[ cos(yrot), 0, sin(yrot), 0]
[         0, 1,         0, 0]
[-sin(yrot), 0, cos(yrot), 0]
[         0, 0,         0, 1]

Rotace kolem Z osy:

[ cos(zrot), -sin(zrot), 0, 0]
[ sin(zrot),  cos(zrot), 0, 0]
[         0,          0, 1, 0]
[         0,          0, 0, 1]

Zmenen/zvten matice:   
sx, sy a sz pedstavovuj rove zmenen/zvten. 		

			
[ sx, 0, 0, 0]
[  0, sy, 0, 0]
[  0, 0, sz, 0]
[  0, 0, 0, 1]
			

	Vy mete matice kombinovat tak tak, e je mezi sebou vynsobte.Mete transformovat bod prostednictvm nkter z tchto matic msto pouit funkc glTranslate glRotate a glScale.   
Poznamenm, e posun vymn osu za njakou jinou. Jestlie vy jste se posunuli o -5, a rotovali na y ose, stedn osa bude na souadnicch 0, 0, -5.   	
          
                                                            Napsal: Paul Frazee (The Rainmaker)
                                                            Peloil:Pemysl Jaro 

Dodatek pekladatele:
Pomoc uvedench vpot se mete vyhnout pouit  pkaz glRotate a  glTranslate. Mete si modelovou matici  spotat sami a pak ji pouze pedat  OpenGL pomoc pkazu  glLoadMatrix pesn takhle to dl napklad Quake III  Arena.

Pstup k modelov matici
Z modelov matice mete libovoln st i do  n zapisovat. Zpis do matice  se uskuteuje pomoc funkce glLoadMatrix, 
ten za  pomoci funkce 
glGetDoublev(GL_MODELVIEW_MATRIX,  nzev_pole_do_kterho_se_m_nast);

Vpoty s maticemi
Nsleduj funkce demonstuj pouit matice4x4

Tato fce. jak plyne z nzvu resetuje matici uloenou v poli m
void Load_Identity(void)
{
  int i;

  for(i = 0; i < 16; i++)
    m[i] = 0.0f;

  m[0] =  1.0f;
  m[5] =  1.0f;
  m[10] = 1.0f;
  m[15] = 1.0f;
};

Nkdy budete chtt pout matici3x3(obsahuje pouze informace o rotaci) jej zskn z matice 4x4 demonstruje nsledujc funkce
void MATRIX3x3Convert_From_MATRIX4x4( MATRIX4x4 m1)
{
  m[0] = m1.m[0];
  m[1] = m1.m[1];
  m[2] = m1.m[2];

  m[3] = m1.m[4];
  m[4] = m1.m[5];
  m[5] = m1.m[6];

  m[6] = m1.m[8];
  m[7] = m1.m[9];
  m[8] = m1.m[10];
};
Jak vidte je to jednoduch sta pvodn matici oezat o posledn dek a sloupec.

Nsleduj funkce kter pebraj aktuln matici a vynsob j bod nebo vektor k zskn jeho
skuten pozice v prostoru.Argumenty funkce by mli bt jasn je to matice a vektor nebo bod.
Jednodue funkci pedme aktualn modelovou matici a vektor nebo bod a funkce nm pot 
vrt jeho absolutn pozici v prostoru. Bez toho by prakticky neli potat kolize.
Poprv s vektorem
VECTOR Matrix_krt_vektor( MATRIX4x4 m1, VECTOR v1)
{
  VECTOR temp;

  temp.vx = v1.vx * m1.m[0] + v1.vy * m1.m[4] + v1.vz * m1.m[8] +
            m1.m[12];

  temp.vy = v1.vx * m1.m[1] + v1.vy * m1.m[5] + v1.vz * m1.m[9] +
            m1.m[13];

  temp.vz = v1.vx * m1.m[2] + v1.vy * m1.m[6] + v1.vz * m1.m[10] +
            m1.m[14];

  return temp;
};

Pro zmnu s bodem
VERTEX3D Matrix_krt_bod( MATRIX4x4 m1, VERTEX3D p1)
{
  VERTEX3D temp;

  temp.x = (float)(p1.x * m1.m[0] + p1.y * m1.m[4] + p1.z * m1.m[8] +
            m1.m[12]);

  temp.y = (float)(p1.x * m1.m[1] + p1.y * m1.m[5] + p1.z * m1.m[9] +
            m1.m[13]);

  temp.z = (float)(p1.x * m1.m[2] + p1.y * m1.m[6] + p1.z * m1.m[10] +
            m1.m[14]);

  return temp;
};

T jet jednou to sam ale s pouitm matice3x3
S vektorem
VECTOR Matrix_krat_vector(MATRIX3x3 m1,VECTOR v1)
{
  VECTOR temp;

  temp.vx = v1.vx * m1.m[0] + v1.vy * m1.m[3] + v1.vz * m1.m[6];

  temp.vy = v1.vx * m1.m[1] + v1.vy * m1.m[4] + v1.vz * m1.m[7];

  temp.vz = v1.vx * m1.m[2] + v1.vy * m1.m[5] + v1.vz * m1.m[8];

  return temp;
};

A s bodem
VERTEX3D Matrix_krat_bod(MATRIX3x3 m1,VERTEX3D p1)
{
  VERTEX3D temp;

  temp.x = (float)(p1.x * m1.m[0] + p1.y * m1.m[3] + p1.z * m1.m[6]);

  temp.y = (float)(p1.x * m1.m[1] + p1.y * m1.m[4] + p1.z * m1.m[7]);

  temp.z = (float)(p1.x * m1.m[2] + p1.y * m1.m[5] + p1.z * m1.m[8]);

  return temp;
};

Vpoty s maticemi maj mnohem vce monost nap. jsem vbec neuvedl jak spotat
v matici posun a rotaci , a jak vsledek pedat OpenGL.Tm bychom se vyhli pouit funkc
glRotate a glTranslate.
Dal podrobnosti najdete nap. v NeHe lekci 30, v tid Tmatrix v souboru Tmatrix.cpp a
Tmatrix.h. Z tohoto zdroje jsem erpal. 
Jak u jsem napsal pomoc matic se hlav zskv skuten pozice bodu (kdy zadvme jeho hodnoty
funkci glVertex po pouit fc. glScale a glTranslate neodpovdaj skutenosti pomoc tchto
funkc se mn matice), skutenou pozici potebujete pi vpotech koliz.

Piloen zdrjov kd demonstruje jak zskat skutenou pozici bodu za pouit modelov matice
Po pouit funkc glTranslate a glRotate vykreslme krychli a zpotme pozice jejch vrchol,
kter vykreslme vpravo nahoru.
                                
                                                                             Pemysl Jaro    



