NSA - Non Solo Amiga
SOFTWARE => Linguaggi di programmazione e scripting => Topic aperto da: raistlin77it - 10 Ottobre 2011, 19:08:24
-
ho un piccolissimo problema da esporvi.
nella mia scena disegno un cubo colorato tramite glColor3ub , il cubo è di una unità ed ha le normali già calcolate fisse
nella scena ho anche 2 luci.
quando con glScalef scalo a metà il mio cubo, magicamente perdo il colore.
se scalo e spengo le luci invece il cubo mantiene il colore.
why ?
-
probabilmente sono saltate le normali... posta il codice...
-
probabilmente sono saltate le normali... posta il codice...
Si molto probabilmente sono le normali, ma perchè saltano?
if (Tutorial_Cube[i][0][0].solid!=64 /*|| Tutorial_Cube[i][0][0].Dig_Anim==1*/) {
glColor3ub(Tutorial_Cube[i][0][0].rcol,Tutorial_Cube[i][0][0].gcol,Tutorial_Cube[i][0][0].bcol);
glPushMatrix();
glTranslatef((float)i,0,0);
if (Tutorial_Cube[i][0][0].Dig_Anim==1) {
glPushMatrix();
glColor3ub(Tutorial_Cube[i][0][0].rcol,Tutorial_Cube[i][0][0].gcol,Tutorial_Cube[i][0][0].bcol);
glScalef(sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)));
DrawGameCube(Tutorial_Cube[i][0][0];
le normali sono hardcoded nel drawgamecube, perciò dici di ricalcolarle sempre ogni volta che scalo?
è una smarronata :) visto che faccio sparire i cubi scalandoli a 0
-
posta anche l'altra funzione che chiami... DrawGameCube
-
posta anche l'altra funzione che chiami... DrawGameCube
E' tutta così un quad alla volta
//************************ LEFT FACE *************************
glBegin(GL_QUADS);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//lNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, +0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, -0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, -0.5f);
glEnd();
Le normali sono hardcoded, perchè il cubo ha sempre le stesse coordinate, lo traslo lo ruoto e lo scalo poi a piacere
questo è quello che ottengo
(http://http://img195.imageshack.us/img195/2877/image18i.png) (http://http://imageshack.us/photo/my-images/195/image18i.png/)
-
Boh è proprio strano... su che OS lo stai provando?
-
su windows (sdl+gl)
Ah mi ero scordato, naturalmente è attivato il GL_COLOR_MATERIAL
mah , sa il cavolo perchè non va....
per ora risolvo spegnendo le luci, e riaccendendole dopo che ho disegnato il cubo rimpicciolito
da altre prove anche se ingrandisco il cubo, mi cambia colore, questa volta al posto di virare al bianco scurisce il cubo , bho...
-
Appena ho tempo faccio qualche prova. Sono un po' fuori allenamento per le OpenGL
-
Appena ho tempo faccio qualche prova. Sono un po' fuori allenamento per le OpenGL
Ho qui giusto pronto un listato :D :D :D :D
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <GL/gl.h>
#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
typedef int bool;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif
#define DegToRad(a) ( (a) * 0.01745329252f )
#define RadToDeg(a) ( (a) * 57.29577951f )
typedef struct Game_cube { // cube struct for the game
int xtex,ytex,ztex;
int solid;
int guaranteed;
int rcol,gcol,bcol;
int hiding;
int Frame;
int Paint_Anim;
int Dig_Anim;
}Game_cube;
typedef struct GRRLIB_texImg
{
/*unsigned*/ int w; /**< Texture width. */
/*unsigned*/ int h; /**< Texture height. */
int handlex; /**< Texture handle x. */
int handley; /**< Texture handle y. */
int offsetx; /**< Texture offset x. */
int offsety; /**< Texture offset y. */
bool tiledtex; /**< Texture is tiled if set to true. */
unsigned int tilew; /**< Width of one tile. */
unsigned int tileh; /**< Height of one tile. */
unsigned int nbtilew; /**< Number of tiles for the x axis. */
unsigned int nbtileh; /**< Number of tiles for the y axis. */
unsigned int tilestart; /**< Offset to tile starting position. */
float ofnormaltexx; /**< Offset of normalized texture on x. */
float ofnormaltexy; /**< Offset of normalized texture on y. */
int tex_id; /**< Texture ID. */
}GRRLIB_texImg;
GRRLIB_texImg *numbers;
Game_cube Tutorial_Cube[5][1][1];
int FRAMES_PER_SECOND = 10;
int frame = 0;
int startTicks = 0;
int currentTicks=0;
int elapsedTime =0;
int SCREENW=800;
int SCREENH=600;
SDL_Event event;
float LightPos[4]={0.0f,5.0f,20.0f,0.0f};
float grayDiffuseLight[] = {0.5, 0.5, 0.5}; //{0.5, 0.5, 0.5};
float whiteDiffuseLight[] = {1.0,1.0,1.0};
void glEnable2D()
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 800, 600, 0, -1, 1 );
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.375, 0.375, 0.);
glPushAttrib(GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
void glDisable2D()
{
glPopAttrib();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
void DrawGameCube(Game_cube gc);
void DrawWireCube();
int main(int argc, char *argv[]) {
int done;
int frame=0;
SDL_Surface *screen;
int i,k;
int xrot;
int yrot;
int button;
int cubenumber=0;
SDL_Init(SDL_INIT_VIDEO );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
screen = SDL_SetVideoMode( SCREENW, SCREENH, 32, SDL_OPENGL /*| SDL_FULLSCREEN*/);
glViewport( 0, 0, SCREENW, SCREENH );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, 1.0 * SCREENW/SCREENH, 0.1, 400.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,18,0.0,0.0,0.0,0.0,1.0,0.0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
/*************************************************************/
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT0,GL_POSITION,LightPos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDiffuseLight);
glLightfv(GL_LIGHT1,GL_POSITION,LightPos);
glLightfv(GL_LIGHT1, GL_DIFFUSE, grayDiffuseLight);
glEnable( GL_LINE_SMOOTH );
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glLineWidth(2);
/*************************************************************/
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor( 1, 1, 1, 1);
done=0;
xrot=30;
yrot=80;
for (i=0;i<5;i++) {
Tutorial_Cube[i][0][0].xtex=255;
Tutorial_Cube[i][0][0].ytex=255;
Tutorial_Cube[i][0][0].ztex=255;
Tutorial_Cube[i][0][0].solid=1;
Tutorial_Cube[i][0][0].rcol=156;
Tutorial_Cube[i][0][0].gcol=101;
Tutorial_Cube[i][0][0].bcol=231;
Tutorial_Cube[i][0][0].Frame=0;
}
while(!done) {
startTicks=SDL_GetTicks();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(SDL_PollEvent(&event)) {
if (event.type==SDL_KEYDOWN & event.key.keysym.sym == SDLK_ESCAPE) done=1;
if (event.type==SDL_MOUSEBUTTONDOWN) button=1;
if (event.type==SDL_MOUSEBUTTONUP) button=0;
}
if (button>0) {
button=0;
Tutorial_Cube[cubenumber][0][0].solid = 65;
Tutorial_Cube[cubenumber][0][0].Frame=0;
Tutorial_Cube[cubenumber][0][0].Dig_Anim=1;
cubenumber++;
}
glPushMatrix();
glRotatef(xrot,1,0,0);
glRotatef(yrot,0,1,0);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(.5, .5);
glPushMatrix();
glScalef(1.5,1.5,1.5);
glTranslatef(-2.0f,0.0f,0.0f);
for(i=0;i<5;i++) {
if (Tutorial_Cube[i][0][0].solid!=64 ) {
glColor3ub(Tutorial_Cube[i][0][0].rcol,Tutorial_Cube[i][0][0].gcol,Tutorial_Cube[i][0][0].bcol);
glPushMatrix();
glTranslatef(1.0*i,0,0);
if (Tutorial_Cube[i][0][0].Dig_Anim==1) {
glPushMatrix();
glScalef(sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)),sin(DegToRad(Tutorial_Cube[i][0][0].Frame+90)));
DrawGameCube(Tutorial_Cube[i][0][0]);
glColor3ub(0,0,0);
DrawWireCube();
Tutorial_Cube[i][0][0].Frame+=6;
if (Tutorial_Cube[i][0][0].Frame==90) {Tutorial_Cube[i][0][0].solid=64;Tutorial_Cube[i][0][0].Dig_Anim=0;Tutorial_Cube[i][0][0].Frame=0;}
glPopMatrix();
} else {
DrawGameCube(Tutorial_Cube[i][0][0]);
glColor3ub(0,0,0);
DrawWireCube();
}
glPopMatrix();
}
}
glPopMatrix();
glPopMatrix();
elapsedTime = (SDL_GetTicks() - startTicks);
if( elapsedTime < 1000 / FRAMES_PER_SECOND ) SDL_Delay( ( 1000 / FRAMES_PER_SECOND ) - elapsedTime );
frame++;
SDL_GL_SwapBuffers();
}
SDL_Quit();
return 0;
}
void DrawGameCube(Game_cube gc) { // draw the game cube calc the normals etc.
float s1, s2, t1, t2;
// The 0.001f/x is the frame correction formula by spiffen
if (gc.ztex<255) {
glEnable( GL_TEXTURE_2D );
//******************** TILE CALC *************************
glBindTexture(GL_TEXTURE_2D, numbers->tex_id);
s1 = (gc.ztex % numbers->nbtilew) * numbers->ofnormaltexx;
s2 = s1 + numbers->ofnormaltexx;
t1 = ((int)(gc.ztex/numbers->nbtilew)) * numbers->ofnormaltexy;
t2 = t1 + numbers->ofnormaltexy;
//******************** FRONT FACE *************************
glBegin(GL_QUADS);
glNormal3f(0.000000,0.000000,1.000000);
glTexCoord2f(s1, t2);
//glTexCoord2f (0.0f, 1.0f);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(0.000000,0.000000,1.000000);
// glTexCoord2f (1.0f, 1.0f);
glTexCoord2f(s2, t2);
glVertex3f( +0.5f, -0.5f, +0.5f);
glNormal3f(0.000000,0.000000,1.000000);
//glTexCoord2f (1.0f, 0.0f);
glTexCoord2f(s2, t1);
glVertex3f( +0.5f, +0.5f, +0.5f);
glNormal3f(0.000000,0.000000,1.000000);
//glTexCoord2f (0.0f, 0.0f);
glTexCoord2f(s1, t1);
glVertex3f( -0.5f, +0.5f, +0.5f);
glEnd();
//*********************** BACK FACE ****************************
glBegin(GL_QUADS);
glNormal3f(0.000000,0.000000,-1.000000);
// glTexCoord2f (1.0f, 1.0f);
glTexCoord2f(s2, t2);
glVertex3f( -0.5f, -0.5f, -0.5f);
glNormal3f(0.000000,0.000000,-1.000000);
// glTexCoord2f (1.0f, 0.0f);
glTexCoord2f(s2, t1);
glVertex3f( -0.5f, +0.5f, -0.5f);
glNormal3f(0.000000,0.000000,-1.000000);
// glTexCoord2f (0.0f, 0.0f);
glTexCoord2f(s1, t1);
glVertex3f( +0.5f, +0.5f, -0.5f);
glNormal3f(0.000000,0.000000,-1.000000);
// glTexCoord2f (0.0f, 1.0f);
glTexCoord2f(s1, t2);
glVertex3f( +0.5f, -0.5f, -0.5f);
glEnd();
glDisable( GL_TEXTURE_2D );
} else {
//******************** FRONT FACE *************************
glBegin(GL_QUADS);
glNormal3f(0.000000,0.000000,1.000000);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(0.000000,0.000000,1.000000);
glVertex3f( +0.5f, -0.5f, +0.5f);
glNormal3f(0.000000,0.000000,1.000000);
glVertex3f( +0.5f, +0.5f, +0.5f);
glNormal3f(0.000000,0.000000,1.000000);
glVertex3f( -0.5f, +0.5f, +0.5f);
glEnd();
//********************* BACK FACE **************************
glBegin(GL_QUADS);
glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, -0.5f);
glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, -0.5f);
glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, +0.5f, -0.5f);
glNormal3f(0.000000,0.000000,-1.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, -0.5f, -0.5f);
glEnd();
}
if (gc.xtex<255) {
glEnable( GL_TEXTURE_2D );
//******************** TILE CALC *************************
glBindTexture(GL_TEXTURE_2D, numbers->tex_id);
s1 = (gc.xtex % numbers->nbtilew) * numbers->ofnormaltexx;
s2 = s1 + numbers->ofnormaltexx;
t1 = ((int)(gc.xtex/numbers->nbtilew)) * numbers->ofnormaltexy;
t2 = t1 + numbers->ofnormaltexy;
//************************ LEFT FACE *************************
glBegin(GL_QUADS);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//glTexCoord2f (1.0f, 1.0f);
glTexCoord2f(s2, t2);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 0.0f);
glTexCoord2f(s2, t1);
glVertex3f( -0.5f, +0.5f, +0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//glTexCoord2f (0.0f, 0.0f);
glTexCoord2f(s1, t1);
glVertex3f( -0.5f, +0.5f, -0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
//glTexCoord2f (0.0f, 1.0f);
glTexCoord2f(s1, t2);
glVertex3f( -0.5f, -0.5f, -0.5f);
glEnd();
//************************ RIGHT FACE ****************************
glBegin(GL_QUADS);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 1.0f);
glTexCoord2f(s2, t2);
glVertex3f( +0.5f, -0.5f, -0.5f);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 0.0f);
glTexCoord2f(s2, t1);
glVertex3f( +0.5f, +0.5f, -0.5f);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (0.0f, 0.0f);
glTexCoord2f(s1, t1);
glVertex3f( +0.5f, +0.5f, +0.5f);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (0.0f, 1.0f);
glTexCoord2f(s1, t2);
glVertex3f( +0.5f, -0.5f, +0.5f);
glEnd();
glDisable( GL_TEXTURE_2D );
} else {
//************************ LEFT FACE *************************
glBegin(GL_QUADS);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//lNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, +0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, -0.5f);
glNormal3f(-1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, -0.5f);
glEnd();
//************************ RIGHT FACE ****************************
glBegin(GL_QUADS);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, -0.5f, -0.5f);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, +0.5f, -0.5f);
glNormal3f(1.000000,0.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, +0.5f, +0.5f);
glNormal3f(1.000000,0.000000,0.000000);// glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, -0.5f, +0.5f);
glEnd();
}
if (gc.ytex<255) {
glEnable( GL_TEXTURE_2D );
//******************** TILE CALC *************************
glBindTexture(GL_TEXTURE_2D, numbers->tex_id);
s1 = (gc.ytex % numbers->nbtilew) * numbers->ofnormaltexx;
s2 = s1 + numbers->ofnormaltexx;
t1 = ((int)(gc.ytex/numbers->nbtilew)) * numbers->ofnormaltexy;
t2 = t1 + numbers->ofnormaltexy;
//***************************** TOP FACE **************************
glBegin(GL_QUADS);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (0.0f, 1.0f);
glTexCoord2f(s1, t2);
glVertex3f( -0.5f, +0.5f, +0.5f);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 1.0f);
glTexCoord2f(s2, t2);
glVertex3f( +0.5f, +0.5f, +0.5f);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 0.0f);
glTexCoord2f(s2, t1);
glVertex3f( +0.5f, +0.5f, -0.5f);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (0.0f, 0.0f);
glTexCoord2f(s1, t1);
glVertex3f( -0.5f, +0.5f, -0.5f);
glEnd();
//************************* BOTTOM FACE ****************************
glBegin(GL_QUADS);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (0.0f, 0.0f);
glTexCoord2f(s1, t1);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (0.0f, 1.0f);
glTexCoord2f(s1, t2);
glVertex3f( -0.5f, -0.5f, -0.5f);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 1.0f);
glTexCoord2f(s2, t2);
glVertex3f( +0.5f, -0.5f, -0.5f);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
// glTexCoord2f (1.0f, 0.0f);
glTexCoord2f(s2, t1);
glVertex3f( +0.5f, -0.5f, +0.5);
glEnd();
glDisable( GL_TEXTURE_2D );
} else {
//***************************** TOP FACE **************************
glBegin(GL_QUADS);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, +0.5f);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, +0.5f, +0.5f);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, +0.5f, -0.5f);
glNormal3f(0.000000,1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, +0.5f, -0.5f);
glEnd();
//************************* BOTTOM FACE ****************************
glBegin(GL_QUADS);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, +0.5f);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( -0.5f, -0.5f, -0.5f);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, -0.5f, -0.5f);
glNormal3f(0.000000,-1.000000,0.000000);//glNormal3f(Norm.x,Norm.y,Norm.z);
glVertex3f( +0.5f, -0.5f, +0.5);
glEnd();
}
}
void DrawWireCube() { // draws the wire cube to display the grid
// FRONT
glBegin(GL_LINE_LOOP);
glVertex3f( -0.5f, -0.5f, +0.5f);
glVertex3f( +0.5f, -0.5f, +0.5f);
glVertex3f( +0.5f, +0.5f, +0.5f);
glVertex3f( -0.5f, +0.5f, +0.5f);
glEnd();
// BACK
glBegin(GL_LINE_LOOP);
glVertex3f( -0.5f, -0.5f, -0.5f);
glVertex3f( -0.5f, +0.5f, -0.5f);
glVertex3f( +0.5f, +0.5f, -0.5f);
glVertex3f( +0.5f, -0.5f, -0.5f);
glEnd();
// LEFT
glBegin(GL_LINE_LOOP);
glVertex3f( -0.5f, -0.5f, +0.5f);
glVertex3f( -0.5f, +0.5f, +0.5f);
glVertex3f( -0.5f, +0.5f, -0.5f);
glVertex3f( -0.5f, -0.5f, -0.5f);
glEnd();
// RIGHT
glBegin(GL_LINE_LOOP);
glVertex3f( +0.5f, -0.5f, -0.5f);
glVertex3f( +0.5f, +0.5f, -0.5f);
glVertex3f( +0.5f, +0.5f, +0.5f);
glVertex3f( +0.5f, -0.5f, +0.5f);
glEnd();
// TOP
glBegin(GL_LINE_LOOP);
glVertex3f( -0.5f, +0.5f, +0.5f);
glVertex3f( +0.5f, +0.5f, +0.5f);
glVertex3f( +0.5f, +0.5f, -0.5f);
glVertex3f( -0.5f, +0.5f, -0.5f);
glEnd();
// BOTTOM
glBegin(GL_LINE_LOOP);
glVertex3f( -0.5f, -0.5f, +0.5f);
glVertex3f( -0.5f, -0.5f, -0.5f);
glVertex3f( +0.5f, -0.5f, -0.5f);
glVertex3f( +0.5f, -0.5f, +0.5f);
glEnd();
}
quando premi il mouse incomincia a rimpicciolire i cubi.
l'ho messo a 10 fps per notare meglio il colore che "sbianca "
-
Trovato :D :D
Giustamente il titolo della guida che ho seguito è "Avoiding 16 Common OpenGL Pitfalls"
E spiega che anche se io scalo prima di disegnare il cubo, le normali vengono alterate da opengl, la soluzione + semplice è chiamare glEnable(GL_NORMALIZE); che riporta le normali a 1.0 oppure scalare i vertici a "manina" prima di disegnarli (figuramoci, non siamo mica con le gl4.0 )
dalle gl 2.1 in poi si può usare glEnable(GL_RESCALE_NORMAL); che non ricalcola le normali ma le riscala inversamente rispetto all'opeazione fatta con glscale
-
Ci avrei giurato che ti riscalava le normali, ma non essendo un graphics programmer non ero sicurissimo al 100%
:-)