PDA

View Full Version : Camera



Rajiv Mishra
09-14-2001, 03:25 AM
Hello Friends,
Can I place two camera in any opengl application? What I want for a Appliction two camera place one which directed toward front another one back side,in menu two options one for front camera on and second for back camera on.

with regards
Rajiv Kumar

Ritchie
09-14-2001, 04:27 AM
You can only have one camera, but you can specify it's location using gluLookAt. Figure out your camera positions and toggle between them if necessary

Regards,
Ritchie

ffish
09-14-2001, 05:12 AM
There's no such thing as a "camera", just the modelview and projection matrices that you specify. You can have multiple views dependent on a menu selection (i.e. multiple "cameras") by having different modelview (and possibly projection) matrices. It should be quite easy to do. You can also have multiple viewports (obviously) if you want, like in 3DS Max.

Hope that helps.

Rajiv Mishra
09-14-2001, 07:45 PM
Well ffish,
As you told 3DS MAX have multiple view.I want to implement same,can you tell how different gluLookAt funtion for different view.
with thanks

Ritchie
09-14-2001, 11:50 PM
Hello,

ffish, I agree with you that there is no camera, but pretending there is one, you can get a feeling on how to use gluLookAt. The red book also uses the camera analogy to explain viewing transformations.

As to your problem Rajiv, I guess you can set up multiple viewports and render the scene in each viewport with different angles.

Regards,
Ritchie

ffish
09-15-2001, 12:18 AM
rajiv: If you wanted to do something like 3DS Max, you'd use glViewport(x, y, width, height) to specify the "windows" to draw into. Something like:

// Setup orthogonal projection matrix.
glViewport(0, 0, width/2, height/2);
glMatrixMode(GL_MODELVIEW);
// Setup modelview matrix (e.g. using gluLookAt() if you want).
DrawLowerLeftWindowStuff();
glMatrixMode(GL_PROJECTION);
// Setup orthogonal projection matrix again (unnecessary, I think?)
glViewport(0, height/2, width/2, height);
glMatrixMode(GL_MODELVIEW);
...
DrawUpperLeftWindowStuff();
...
DrawUpperRightWindowStuff();
...
// Setup perspective projection matrix.
glViewport(width/2, 0, width, height/2);
...
DrawLowerRightWindowStuff();

Ritchie: Agreed. gluLookAt() is a good analogy for a camera, if you want to think about it like that. I just prefer to think about the whole thing mathematically using the individual glRotates/glTranslates in my head. It's irrelevant really, both ways are a means to an end as long as you understand how they work and how your matrix is set up.

Hope that helps.

Rajiv Mishra
09-15-2001, 01:30 AM
Hi ffish,
It is correct but in different viewport gluLookAt has different parameter what is the gluLookAt function for different viewport.

Ritchie
09-15-2001, 02:13 AM
Hello,

rajiv: The different parameters are your positions of the 'camera' in each viewport.
If you have two viewports. In the first viewport you look at your objects as if you're standing in front of it, and in the second you have the same objects, now looking at it from the right. Then your display function should be something like this:




// Setup orthogonal projection matrix.
glViewport(0, 0, width/2, height);
glMatrixMode(GL_MODELVIEW);
// Setup modelview matrix (e.g. using gluLookAt() if you want).
gluLookAt (0, 0, 5, // eye coordinates
0, 0, 0, // center coordinates
0, 1, 0); // up vector
DrawLeftWindowStuff();
glMatrixMode(GL_PROJECTION);// Setup orthogonal projection matrix again (unnecessary, I think?)
glViewport(width/2, 0, width/2, height);
glMatrixMode(GL_MODELVIEW);
gluLookAt (5, 0, 0, // eye coordinates
0, 0, 0, // center coordinates
0, 1, 0); // up vector
DrawRightWindowStuff();


ffish: (just to make sure that I understand it all): Am I correct that instead of the gluLookAt functions in the code above can be substituted like this:

gluLookAt (0, 0, 5, // eye coordinates
0, 0, 0, // center coordinates
0, 1, 0); // up vector

is the same as:

glLoadIdentity();
glTranslatef (0, 0, -5);

and

gluLookAt (5, 0, 0, // eye coordinates
0, 0, 0, // center coordinates
0, 1, 0); // up vector

is the same as (I hope I am doing this in the correct order):

glLoadIdentity();
glRotatef(90, 0, 1, 0);
glTranslatef(0, 0, -5);

Regards,
Ritchie

ffish
09-15-2001, 03:31 AM
Ritchie: yeah, that's right (except you got the rotate/translate around the wrong way http://www.opengl.org/discussion_boards/ubb/wink.gif). I kind of prefer doing it manually because it may save function calls, especially for the simple examples. e.g. your first example is a glLoadIdentity and a glTranslate, or one glLoadMatrix whereas gluLookAt will have a fixed number of calls to glTranslate and glRotate no matter what the complexity. Of course, this is unlikely to be the source of a bottleneck in an app anyway, but it is good to save calls whenever possible. On the other hand, gluLookAt may be easier for someone to conceptually deal with, so it has its benefits too.

Hope that helps.

Rajiv Mishra
09-15-2001, 03:37 AM
Ritchie and ffish,
Many Many Thanks of help!!!
Rajiv Kumar