probabilmente sono saltate le normali... posta il codice...
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];
posta anche l'altra funzione che chiami... DrawGameCube
//************************ 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();
Appena ho tempo faccio qualche prova. Sono un po' fuori allenamento per le OpenGL
#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();}