Jump to content
  • Advertisement

Archived

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

gimp

OpenGL [OPENGL] Using Matricies

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

If you intended to correct an error in the post then please contact us.

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 this post


Link to post
Share on other sites
Advertisement
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
Share on other sites
u will need to renormalize your matrice every so often
also the cos + sin functions use radians not degrees
float c = Cos(a_Angle*DEGREES_TO_RADIANS);

http://members.xoom.com/myBollux

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!