Domanda

Sono nuovo di OpenGL ES e si stanno sviluppando in Objective-C per iPhone.

Quello che sto cercando di capire è come la luce è posizionata nel mio tronco di cono. Questo è come lo faccio:

creo un quadrato e messo come "piano" nel mio tronco di cono. Sto mettendo la luce, proprio sopra, al centro del pavimento e puntare la direzione della luce destra verso il basso. Ora, mi aspetto che il cerchio di luce sul pavimento per essere nel mezzo. Ma non è, it'r di più per la parte posteriore (futher di distanza). Come mai?

near = 8.0
far = 28
light position = {0.0, 0.0, -10.0}
light direction = {0.0, -1.0, 0.0}

Floor coordinates = {-0.3153, -0.473, -20.0},
{-0.3153, -0.473, 0.0},
{0.3153, -0.473, -20.0},
{0.3153, -0.473, 0.0},

Non dovrebbe questo insieme formano il cerchio di luce di essere nel centro del pavimento e non posizionato un po 'indietro?

Ecco il mio codice di significativa:

Impostazione della vista:

 -(void)setupView:(TDRoomView*)view
    {


    const GLfloat zNear = 8, zFar = 28, fieldOfView = 5; 

 GLfloat size; 
 glEnable(GL_DEPTH_TEST);
 glMatrixMode(GL_PROJECTION); 
 size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0); 
 NSLog(@"tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0); %f ", tanf(DEGREES_TO_RADIANS(fieldOfView)/2.0));

 CGRect rect = view.bounds; 
 glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / 
      (rect.size.width / rect.size.height), zNear, zFar);  
 glViewport(-size, size, rect.size.width, rect.size.height);  
 glMatrixMode(GL_MODELVIEW);
    glShadeModel(GL_SMOOTH);
 glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

 static const Color3D light0Ambient[] = {{1.0, 1.0, 1.0, 1.0}};
 glLightfv(GL_LIGHT0, GL_AMBIENT, (const GLfloat *)light0Ambient);

    static const Color3D light0Diffuse[] = {{0.5, 0.5, 0.5, 1.0}};
 glLightfv(GL_LIGHT0, GL_DIFFUSE, (const GLfloat *)light0Diffuse);

    static const Color3D light0Specular[] = {{0.5, 0.5, 0.5, 1.0}};
    glLightfv(GL_LIGHT0, GL_SPECULAR, (const GLfloat *)light0Specular);

    static const Vertex3D light0Position[] = {{0.0, 0.473, -10.0}};
 glLightfv(GL_LIGHT0, GL_POSITION, (const GLfloat *)light0Position); 

 static const Vertex3D lightVector= {0.0, -1.0, 0.0};

    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, (GLfloat *)&lightVector);

    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 85);

 glLoadIdentity(); 
 glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 

    }

e il disegno:

     -(void)drawView:(TDRoomView*)view
    {

        static const Vertex3D vertices[]= {
  {-0.3153, -0.473, -20.0},
  {-0.3153, -0.473, 0.0},
  {0.3153, -0.473, -20.0},
  {0.3153, -0.473, 0.0},
  {-0.1, -0.25, -3.0},
  {0.0, 0.0, -10.0},
  {0.1, -0.25, -3.0}
 };

 static const Color3D colors[] = {
  {0.7, 0.7, 0.7, 1.0},
  {0.7, 0.7, 0.7, 1.0},
  {0.7, 0.7, 0.7, 1.0},
  {0.7, 0.7, 0.7, 1.0},
  {1.0, 0.0, 0.0, 1.0},
  {0.0, 1.0, 0.0, 1.0},
  {0.0, 0.0, 1.0, 1.0}
       };


 static const GLubyte roomFaces[] = {
  0, 1, 2,
  1, 2, 3};


        static const Vector3D normals[] = {
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000},
  {0.000000, 1.000000, 0.000000}
 };

    glLoadIdentity();

    glClearColor(0.7, 0.7, 0.7, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_COLOR_ARRAY);
 glEnableClientState(GL_NORMAL_ARRAY);

        glVertexPointer(3, GL_FLOAT, 0, vertices);
 glColorPointer(4, GL_FLOAT, 0, colors);
 glNormalPointer(GL_FLOAT, 0, normals);
 glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_BYTE, roomFaces);

        glDisableClientState(GL_NORMAL_ARRAY);
 glDisableClientState(GL_VERTEX_ARRAY);
 glDisableClientState(GL_COLOR_ARRAY); }

Inoltre, ho Recon cambiare la

static const Vertex3D light0Position[] = {{0.0, 0.473, -10.0}};

a

static const Vertex3D light0Position[] = {{0.0, 0.473, -8.0}}; 

il bord si oscura, nessuna luce brilla su di esso. Perché, mi sono trasferito solo la luce due passi più vicino ...? Le stesse cose accadono se mi muovo due passi più in là in questo modo:

static const Vertex3D light0Position[] = {{0.0, 0.473, -12.0}};

Qualsiasi aiuto al fine di "far luce som" sul mio problema è molto apprezzato! (Non poteva farne a meno ...;))

Grazie in anticipo!

È stato utile?

Soluzione

Vi suggerisco di fare una griglia più grande, con più vertici, preferibilmente n da n piazze. Cercate di non avere troppo lunghi triangoli sottili. Questo renderà più facile vedere dove la luce sembra essere come la luce viene calcolato per ogni vertice e non per pixel per la superficie.

http://www.opengl.org/resources/features/KilgardTechniques/ oglpitfall /

  

2. Povero Tessellation Hurts Illuminazione

     

i calcoli di illuminazione di OpenGL sono fatte per-vertice. Ciò significa che i calcoli ombreggiatura dovuti a sorgenti di luce che interagiscono con il materiale della superficie di un oggetto 3D vengono calcolate solo nei vertici dell'oggetto. In genere, OpenGL solo interpola o lisce sfumature tra i colori dei vertici. illuminazione per vertice di OpenGL funziona abbastanza bene tranne quando un effetto di illuminazione quale una luce speculare o un riflettore viene persa o sfocata perché l'effetto non è sufficientemente campionato da vertici di un oggetto. Tale sotto-campionamento di effetti di luce si verifica quando gli oggetti sono grossolanamente modellati di utilizzare un numero minimo di vertici.

     

     

programmatori alle prime armi OpenGL sono spesso tentati di abilitare la funzionalità Spotlight di OpenGL e puntare i riflettori su una parete modellato come un unico enorme poligono. Sfortunatamente, nessun modello riflettori tagliente apparirà come il novizio previsto; probabilmente non si vedrà alcun riflettori effetto a tutti. Il problema è che taglio del riflettore significa che gli angoli estremi della parete in cui sono specificati i vertici ricevono alcun contributo dai riflettori e poiché queste sono le uniche vertici parete contiene, non vi sarà alcun modello riflettori sulla parete.

Altri suggerimenti

GL_POSITION è specificato in coordinate omogenee, il che significa che esso richiede quattro valori, non tre. È necessario specificare w = 1.0 per la vostra sorgente di luce, ma il tuo w componente è invece proveniva da ciò che accade di essere accanto a light0Position in memoria.

(Parte del motivo che GL_POSITION è in coordinate omogenee è quello di permettere di definire luci direzionali impostando una posizione con w = 0.0).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top