PDA

Visualizza la versione completa : [c++]novizio opengl e griglie


giuseppe500
15-06-2008, 17:26
ciao.
Sto scancherando con opengl e non ho capito come questo codice possa creare una griglia di punti.
glPointSize(4.0);
glBegin(GL_POINTS);
for (int x = 0; x < 4; x++)
for (int z = 0; z < 4; z++)
glVertex3f(x, 0, z);
glEnd();

perchŔ incrementa la coordinata z e non la y?non Ŕ la profonditÓ la z?

ho lo stesso problema con questa griglia di triangoli:

glBegin(GL_TRIANGLES);
for (int x = 0; x < 3; x++)
{
for (int z = 0; z < 3; z++)
{
glVertex3f(x, 0.0, z);
glVertex3f((x+1.0), 0.0, z);
glVertex3f(x, 0.0, (z+1.0));
}
}
glEnd();

in piu' qui non capisco l'x+1 e lo z+1.
Ho un po di problemi a figurarmi in testa il 3d per questo chiedo a voi .
Intanto grazie.

giuseppe500
15-06-2008, 21:25
up

XWolverineX
16-06-2008, 00:18
Provo a spiegare io anche se non garantisco...
per fare una griglia (da come leggo bidimensionale) la z giustamente non va incrementata.
Essendo la griglia una serie di rette parallele (per asse x e y) devi disegnare una serie di rette che si differenziano di poco.
Dato quindi x il primo valore, lo incrementi di 1 per spostarti un p˛ sulla destra e disegnare la seconda retta.
Puoi anche diminuire l' "offset". Stessa cosa per la y

giuseppe500
16-06-2008, 20:59
scusa xwolverinex ma non hio capito latua risposta,

la z giustamente non va incrementata
il fatto Ŕ che quel codice disegna effettivamente una griglia icrementando la z e non riesco a capire come.
l'ho trovata su Beginning OpenGL Game Programming.
ti allego l'immagine

giuseppe500
17-06-2008, 14:42
up

pallinopinco
17-06-2008, 15:03
Posta il codice sorgente completo del progetto.

XWolverineX
17-06-2008, 17:20
Potrebbe essere spiegato ammettendo che il programma faccia delle rotazioni tali che gli assi possiamo dire che si "scambino" dando l'effetto nella proiezione 2D

giuseppe500
18-06-2008, 23:53
posto il codice:
#ifdef _WINDOWS
#include <windows.h>
#endif

#include <gl/gl.h>
#include <gl/glu.h>
#include <math.h>
#include "CGfxOpenGL.h"

// disable implicit float-double casting
#pragma warning(disable:4305)

CGfxOpenGL::CGfxOpenGL()
{
}

CGfxOpenGL::~CGfxOpenGL()
{
}

bool CGfxOpenGL::Init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);

return true;
}

bool CGfxOpenGL::Shutdown()
{
return true;
}

void CGfxOpenGL::SetupProjection(int width, int height)
{
if (height == 0) // don't want a divide by zero
{
height = 1;
}

glViewport(0, 0, width, height); // reset the viewport to new dimensions
glMatrixMode(GL_PROJECTION); // set projection matrix current matrix
glLoadIdentity(); // reset projection matrix

// calculate aspect ratio of window
gluPerspective(52.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

glMatrixMode(GL_MODELVIEW); // set modelview matrix
glLoadIdentity(); // reset modelview matrix

m_windowWidth = width;
m_windowHeight = height;
}

void CGfxOpenGL::Prepare(float dt)
{
}

void CGfxOpenGL::Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear screen and depth buffer
glLoadIdentity();
gluLookAt(0.0, 10.0, 0.1, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

// top left
glPushMatrix();
glTranslatef(-6.0f, 0.0f, -4.0f);
DrawPoints();
glPopMatrix();

// top middle
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glTranslatef(-2.0f, 0.0f, -4.0f);
DrawTriangles();
glPopMatrix();

// top right
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glTranslatef(2.0f, 0.0f, -4.0f);
DrawQuads();
glPopMatrix();

// bottom left
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glTranslatef(-6.0f, 0.0f, 0.5f);
DrawTriangleStrip();
glPopMatrix();

// bottom middle
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glTranslatef(-2.0f, 0.0f, 0.5f);
DrawTriangleFan();
glPopMatrix();

// bottom right
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glTranslatef(2.0f, 0.0f, 0.5f);
DrawQuadStrip();
glPopMatrix();
}

// draw grid of points showing dataset we are working with
void CGfxOpenGL::DrawPoints()
{
glPointSize(4.0);
glBegin(GL_POINTS);
for (int x = 0; x < 4; x++)
for (int z = 0; z < 4; z++)
glVertex3f(x, 0, z);
glEnd();
}

// draw grid as individual triangles
void CGfxOpenGL::DrawTriangles()
{
glBegin(GL_TRIANGLES);
for (int x = 0; x < 3; x++)
{
for (int z = 0; z < 3; z++)
{
glVertex3f(x, 0.0, z);
glVertex3f((x+1.0), 0.0, z);
glVertex3f(x, 0.0, (z+1.0));
}
}
glEnd();
}

// draw grid as triangle fan
void CGfxOpenGL::DrawTriangleFan()
{
glBegin(GL_TRIANGLE_FAN);

// center vertex of fan
glVertex3f(0.0, 0.0, 0.0);

// bottom side
for (int x = 4; x > 0; x--)
glVertex3f(x-1, 0.0, 3.0);

// right side
for (int z = 4; z > 0; z--)
glVertex3f(3.0, 0.0, z-1);

glEnd();
}

// draw grid as triangle strips
void CGfxOpenGL::DrawTriangleStrip()
{
// 3 rows of triangle strips
for (int x = 0; x < 3; x++)
{
glBegin(GL_TRIANGLE_STRIP);
for (int z = 0; z < 3; z++)
{
glVertex3f(x, 0.0, z);
glVertex3f((x+1.0), 0.0, z);
glVertex3f(x, 0.0, (z+1.0));
glVertex3f((x+1.0), 0.0, (z+1.0));
}
glEnd();
}
}

// draw grid as individual quads
void CGfxOpenGL::DrawQuads()
{
glBegin(GL_QUADS);
for (int x = 0; x < 3; x++)
{
for (int z = 0; z < 3; z++)
{
glVertex3f(x, 0.0, z);
glVertex3f((x+1.0), 0.0, z);
glVertex3f((x+1.0), 0.0, (z+1.0));
glVertex3f(x, 0.0, (z+1.0));
}
}
glEnd();
}

// draw grid as quad strips
void CGfxOpenGL::DrawQuadStrip()
{
for (int x = 0; x < 3; x++)
{
glBegin(GL_QUAD_STRIP);
for (int z = 0; z < 4; z++)
{
glVertex3f(x, 0.0, z);
glVertex3f((x+1.0), 0.0, z);
}
glEnd();
}
}

giuseppe500
19-06-2008, 14:45
scusate, precisazione:
Nei sorgenti c'era un altra classe ma si occupava solo di gestire la creazione della finestra di opengl.
magari stasera posto anche quella.
ciao.

XWolverineX
19-06-2008, 15:43
Metti il codice tra i code tag

Loading