#include "stdafx.h"
#include "GL/glut.h"
#include "GL/glaux.h"
#include "GL/glu.h"
#include "stdio.h"
void RenderScene (void)
{
// Borra la ventana con el color de borrado actual
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Establecemos el color del cuadrado que queremos dibujar.
glColor3f(0.0f, 0.0f, 1.0f);
glPushMatrix();
glScalef(3.0f, 3.0f, 3.0f);
glBegin(GL_QUADS); // Draw The Cube Using quads
glColor3f(0.0f,1.0f,0.0f); // Color Blue
glVertex3f( 10.0f, 10.0f,-10.0f); // Top Right Of The Quad (Top)
glVertex3f(-10.0f, 10.0f,-10.0f); // Top Left Of The Quad (Top)
glVertex3f(-10.0f, 10.0f, 10.0f); // Bottom Left Of The Quad (Top)
glVertex3f( 10.0f, 10.0f, 10.0f); // Bottom Right Of The Quad (Top)
glColor3f(1.0f,0.5f,0.0f); // Color Orange
glVertex3f( 10.0f,-10.0f, 10.0f); // Top Right Of The Quad (Bottom)
glVertex3f(-10.0f,-10.0f, 10.0f); // Top Left Of The Quad (Bottom)
glVertex3f(-10.0f,-10.0f,-10.0f); // Bottom Left Of The Quad (Bottom)
glVertex3f( 10.0f,-10.0f,-10.0f); // Bottom Right Of The Quad (Bottom)
glColor3f(1.0f,0.0f,0.0f); // Color Red
glVertex3f( 10.0f, 10.0f, 10.0f); // Top Right Of The Quad (Front)
glVertex3f(-10.0f, 10.0f, 10.0f); // Top Left Of The Quad (Front)
glVertex3f(-10.0f,-10.0f, 10.0f); // Bottom Left Of The Quad (Front)
glVertex3f( 10.0f,-10.0f, 10.0f); // Bottom Right Of The Quad (Front)
glColor3f(1.0f,1.0f,0.0f); // Color Yellow
glVertex3f( 10.0f,-10.0f,-10.0f); // Top Right Of The Quad (Back)
glVertex3f(-10.0f,-10.0f,-10.0f); // Top Left Of The Quad (Back)
glVertex3f(-10.0f, 10.0f,-10.0f); // Bottom Left Of The Quad (Back)
glVertex3f( 10.0f, 10.0f,-10.0f); // Bottom Right Of The Quad (Back)
glColor3f(0.0f,0.0f,1.0f); // Color Blue
glVertex3f(-10.0f, 10.0f, 10.0f); // Top Right Of The Quad (Left)
glVertex3f(-10.0f, 10.0f,-10.0f); // Top Left Of The Quad (Left)
glVertex3f(-10.0f,-10.0f,-10.0f); // Bottom Left Of The Quad (Left)
glVertex3f(-10.0f,-10.0f, 10.0f); // Bottom Right Of The Quad (Left)
glColor3f(1.0f,0.0f,1.0f); // Color Violet
glVertex3f( 10.0f, 10.0f,-10.0f); // Top Right Of The Quad (Right)
glVertex3f( 10.0f, 10.0f, 10.0f); // Top Left Of The Quad (Right)
glVertex3f( 10.0f,-10.0f, 10.0f); // Bottom Left Of The Quad (Right)
glVertex3f( 10.0f,-10.0f,-10.0f); // Bottom Right Of The Quad (Right)
glEnd();
glPopMatrix();
//Hace el intercambio de buffers (obligatorio en animaciones)
//Mira mas abajo "glutInitDisplayMode"
glutSwapBuffers();
}
void SetupRC(void)
{
GLubyte *pImage;
GLint iWidth;
//Establece el color azul como color para borrar la ventana.
glClearColor(0.0f,0.0f,1.0f,1.0f);
// Targa's are 1 byte aligned
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}
///////////////////////////////////////////////////////////
// Called by GLUT library when the window has chanaged size
void ChangeSize(int w, int h)
{
GLfloat aspectRatio;
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
// PAGINA 87 LIBRO
glViewport(0, 0, w, h);
// Reestablece el sistema de coordenadas antes de que se ejecute ninguna manipulacion de matr
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establecer el volumen de recorte (clipping volumen)
// (PLANOS izquierdo, derecho, inferior, superior, delantero (o cercano (VENTANA)), trasero (o lejano (DENTRO DEL MONITOR ;))))
aspectRatio = (GLfloat)w / (GLfloat)h;
if (w <= h)
glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 200.0, -200.0);
else
glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 200.0, -200.0);
GLfloat *projection;
GLfloat array[16]={2.5f, 2.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 50.0f, 50.0f, 1.0f};
projection=array;
glLoadMatrixf(projection);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main (void)
{
/*
InitDisplayMode: el modo de presentacion (display) que se usará al crear la ventana.
GLUT_SINGLE: usaremos una ventana de un solo buffer, pero en la mayoria del resto de
los casos (siempre que se requiera animacion) usaremos el doble buffer.
GLUT_RGB: modo de color que usaremos. (RGBA=RGB)
*/
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
//Tamaño de la ventana
glutInitWindowSize(320, 240);
//Crea la ventana y le da un titulo
glutCreateWindow("Simple");
//OJO: RenderScene aparece arriba como funcion
glutDisplayFunc(RenderScene);
//ChangeSize se ejecuta cuando la ventana es cambiada de tamaño y la primera vez
//que le aplicacion es ejecuta
glutReshapeFunc(ChangeSize);
//OJO: RenderScene esta empalmada con otra funcion (mirar arriba)
//Establece el color de borrado de la pantalla pero no la borra.
SetupRC();
//Inicia la estructura principal de GLUT
glutMainLoop();
}
Trying to project a cube to an specific position.
Hi!
with the code below, Im trying to create the OpenGL space that appears at this image:
http://aycu39.webshots.com/image/4118/2005800707481452997_rs.jpg
As you see, I have a cube (20x20x20) in the middle of the OpenGL space, and I want to project its P1, P2, P3 and P4 coordinates to the points (75,25) (25,25) (75,75) (75,25) respectively.
In general, a 3D world-point is projected to a 2D image point by a 3x4 projection Matrix. See here the relation between the matrices:
http://img100.imageshack.us/img100/6710/matrizcu0.th.png
And the equations from that relation in my case are these:
x1 = p11 * X1 + p12 * Y1 + p13 * Z1 + p14
y1 = p21 * X1 + p22 * Y1 + p23 * Z1 + p24
x2 = p11 * X2 + p12 * Y2 + p13 * Z2 + p14
y2 = p21 * X2 + p22 * Y2 + p23 * Z2 + p24
x3 = p11 * X3 + p12 * Y3 + p13 * Z3 + p14
y3 = p21 * X3 + p22 * Y3 + p23 * Z3 + p24
x4 = p11 * X4 + p12 * Y4 + p13 * Z4 + p14
y4 = p21 * X4 + p22 * Y4 + p23 * Z4 + p24
------------------
75 = p11 * 10 + p12 * (-10) + p13 * (-10) + p14
25 = p21 * 10 + p22 * (-10) + p23 * (-10) + p24
25 = p11 * (-10) + p12 *(-10) + p13 * 10 + p14
25 = p21 * (-10) + p22 *(-10) + p23 * 10 + p24
75 = p11 * 10 + p12 * 10 + p13 * 10 + p14
75 = p21 * 10 + p22 * 10 + p23 * 10 + p24
75 = p11 * 10 + p12 * (-10) + p13 * 10 + p14
25 = p21 * 10 + p22 * (-10) + p23 * 10 + p24
And the results, as you see in the code, are these:
p11=2.5 p12=0.0 p13=0.0 p14=50.0
p21=2.5 p22=0.0 p23=0.0 p24=50.0
So in my case, the projection matrix will be this:
2.5 0.0 0.0 50.0
2.5 0.0 0.0 50.0
0.0 0.0 0.0 1.0
and then I load this matrix as the projection matrix but the cube is not projected at the place i want.
Does anybody know why?
[Edited by - tirengarfio on August 23, 2006 7:48:34 AM]
JUst passing through quickly, but you say you need a 3 by 4 projection matrix but you only have a 2 by 4? Why aren't you using this last row, which will affect not projection of points, but projection of lines?
Hopefully, I'm not wrong and leading you down the wrong direction.
Hopefully, I'm not wrong and leading you down the wrong direction.
Are you trying for Orthogonal projection(Not sure if that's the word I'm searching for), like floor plans?
Where Instead of the regular view:
_ -
_ -
-
| <--Camera O <--Object
- _
- _
-
You have:
-----------------
|
|<--Camera 0<--Object
|
-----------------
?
If so, glOrtho() should help. Along with this page.
If not, not sure what you're asking.
Where Instead of the regular view:
_ -
_ -
-
| <--Camera O <--Object
- _
- _
-
You have:
-----------------
|
|<--Camera 0<--Object
|
-----------------
?
If so, glOrtho() should help. Along with this page.
If not, not sure what you're asking.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement