• ### What is your GameDev Story?

#### Archived

This topic is now archived and is closed to further replies.

# OpenGL [OPENGL] Using Matricies

This topic is 6541 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Ok, I''ve been learning a bit about matricies and I think I might be getting close to being able to use them. Currently I''m using 3 vectors to represent my model in 3d space(no roll). I''d like to be able to just store a matrix with each object and call it to transform it''s location\orientation. Here is what I think might be rightCan someone confirm these, I already have something that minimally works and don''t want to break it if I''m wrong) 1) OpenGL will accept 4*4 matricies only. 2) Given the following 4*4 matrix: ABCD EFGH IJKL MNOP the data I plug in to them is: Vectors: Right/Local X axis/Pitch = AEI Up/Local Y axis/Turn = BFJ Direction/Local Z axis/Roll = CGK Point: Position/World location = MNO 3) If I want to turn to the left a bit I add a vector that something like 0,0,~0.7? Or is there an easier way? My data is a signed char[2] representing a mouse delta in x,y? Then multiply the vector against the correct place in the matrix? 4) To use the matrix for an object I do something like: glPushmatrix() glMultMatrix(m_ObjectMatrix) Draw() glPopMatrix() 5) I''ve heard that I should renormalise the matrix occationally. Is this because as your adding all those rotations\tranlations your making the floats say bigger and loosing numerical precision? If I only do this for moving object in a scene then I could probably do it each time the object moves couldn''t I? 6) The red book states that for performance reasons you shouldn''t use glMulMatrix. I''ve seen some people plugging the the values in to gluLookAt and other using glRotate\glTranslate ... Any comments??? Many thanks for replies on any of these questions. Chris

##### Share on other sites
I usually don''t use matrixs...but if you wanted to turn the "view camera" to the right or left, or up or down...I find it much simpler (for my mind) to use gllookat. since it takes in a starting and end point. I would store a "heading1" for left and right rotations and a "heading2" for up and down. so what you would do is call gllookat like this:
glLookAt(Camerapos.x, camerapos.y, camerapos.z,
lookat.x, lookat.y, lookat.z, 1);

where lookat is the center of the screen and where it''s pointed
and manipulate lookat with sin and cos of the headings...

It''s really the same as the matrixs, but I figure that the amount of multiply is less. Since you have to multiply every element in the matrix anytime you major changes to it (I assume) and here you would use less memory by using only the 6 floats (the x,y,z of the camera and lookat) where you would need 16 floats for the matrix and one of them is never used. (please somebody correct me if I am wrong, it''s been a while)

##### Share on other sites
quote:
Original post by gimp

1) OpenGL will accept 4*4 matricies only.
2) Given the following 4*4 matrix:

ABCD
EFGH
IJKL
MNOP

the data I plug in to them is:

Vectors:
Right/Local X axis/Pitch = AEI
Up/Local Y axis/Turn = BFJ
Direction/Local Z axis/Roll = CGK
Point:
Position/World location = MNO

OpenGL uses column major matrices so the matrix should look like this:

AEIM
BFJN
CGKO
DHLP

The fanatic is incorruptible: if he kills for an idea, he can just as well get himself killed for one; in either case, tyrant or martyr, he is a monster.
--EM Cioran

Opere Citato

##### Share on other sites
i use glMultMatrix/glLoadMAtrix instead of gltranslate + rotating cause the first is quicker + more flexable.
some of your understanding about matrices is wrong i suggest checking out a linear algebra maths book or having a search on google,flipcode, this site.matrice + quaternion faq has got good info.
matrices is a very important subject speed some time to understand them now it''ll save u heaps in the future

http://members.xoom.com/myBollux

##### Share on other sites
Thanks all. I wasn''t concerned originally in knowing the opengl or mat way of storing matricies, I wanted to use it as a black box.

Without any real knowledge I would have assumed that passing the matricies to opengl would anabled any T&L to take place, so that could mean far less processing. My main reasoning is to make client code easier to use and to abstrack all that math in to a simple inteaction mechanism.

zedzek, yes, this was posted after reading the faq you mentioned. I''ve read 3 game books''s sections on this subject. All of them show you how to calculate the internal mechanics etc, etc but not how to put data in them. My above observations were made from the matrix\quat faq at flipcode.

What did I get wrong? I''d really like to know as I''ve decided to embark on a learning journey about this, and write my own core math classes (vector,matrix,sphere,intersection,distance etc) so I understand whats actually happening. Any hints?

Many thanks

Chris

##### Share on other sites
well this

Right/Local X axis/Pitch = AEI
Up/Local Y axis/Turn = BFJ
Direction/Local Z axis/Roll = CGK

and this

3) If I want to turn to the left a bit I add a vector that something like 0,0,~0.7? Or is there an easier way?

though perhaps its something i havent heard about

eg to turn left/right ie on the X axis

make the following matrix
ABC
DEF
GHI

use
A = cos(angle) C = sin(angle) G = -sin(angle) I = cos(angle)
E = 1 and the rest 0

and multiple the current matrix by the above matrix to get the new rotated matrix

http://members.xoom.com/myBollux

##### Share on other sites
Thanks again zedzeek,

I now have a class up and running that can do translation and rotations, however when I attempt to tell my matrix class to "rotate about the Y axis" I can''t find a good way to do so.

Additioanlly I''ve heard that this can lead to numerical error problems. Is there some kind of normalisation that I could do on the rotations portion of the matrix to help that?

Here is my example function:

  void CMatrix::RotateY(const float a_Angle){ float c = Cos(a_Angle); float s = Sin(a_Angle); m[0] = c; m[2] = -s; m[8] = s; m[10] = c;}

As you can see I''m merely setting the rotation. I''d like to know how I can safley call this function every frame to spin a cube without numerical accuracy affecting the class.

##### Share on other sites
u will need to renormalize your matrice every so often
also the cos + sin functions use radians not degrees

http://members.xoom.com/myBollux

• ### What is your GameDev Story?

In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

• 9
• 34
• 16
• 11
• 10
• ### Forum Statistics

• Total Topics
634122
• Total Posts
3015643
×