Question

Je suis nouveau à OpenGL ES et se développent en Objective-C pour iPhone.

Ce que je suis en train de comprendre comment la lumière est positionnée dans mon tronc. Voici comment je le fais:

Je crée un carré et le mettre comme « plancher » dans mon tronc. Je mets la lumière, juste au-dessus, au milieu du plancher et indiquer la direction de la lumière vers le bas à droite. Maintenant, je me attends le cercle de lumière sur le sol pour être au milieu. Mais ce n'est pas, it'r plus à l'arrière (futher loin). Comment venir?

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},

Si pas ensemble faire le cercle de lumière soit au milieu du plancher et non positionné un peu en arrière?

Voici mon code significatif:

Configuration de la vue:

 -(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); 

    }

dessin:

     -(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); }

En outre, je recon changer le

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

à

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

Bòrd devient sombre, pas de lumière brille sur elle. Pourquoi, je ne déplacé les deux pas de lumière plus ...? Les mêmes choses se passent si je le déplacer à deux pas plus loin comme ceci:

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

Toute aide afin de « mettre en lumière som » sur mon problème est très apprécié! (N'a pas pu l'aider ...;))

Merci d'avance!

Était-ce utile?

La solution

Je vous suggère de faire une plus grande grille avec plus de sommets, de préférence n par n carrés. Essayez de ne pas avoir trop longs triangles minces. Ce sera plus facile de voir où la lumière semble être que la lumière est calculée pour chaque sommet et non par pixel pour la surface.

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

  

2. Pauvre Tessellation Hurts éclairage

     

Les calculs d'éclairage OpenGL sont par vertex fait. Cela signifie que les calculs d'ombrage dus à des sources lumineuses en interaction avec le matériau de surface d'un objet 3D ne sont calculés que sur les sommets de l'objet. En règle générale, OpenGL interpole ou juste des nuances douces entre les couleurs de vertex. OpenGL l'éclairage par vertex fonctionne assez bien, sauf si un effet d'éclairage comme un reflet spéculaire ou un projecteur est perdu ou floue, car l'effet est pas suffisamment échantillonné par les sommets d'un objet. Cette sous-échantillonnage des effets d'éclairage se produit lorsque les objets sont grossièrement modélisés de façon à utiliser un nombre minimal de sommets.

     

:

     

Novice programmeurs OpenGL sont souvent tentés de permettre la fonctionnalité Spotlight OpenGL et braquer les projecteurs sur un mur modélisé comme un seul polygone énorme. Malheureusement, aucun modèle de projecteur pointu apparaît comme le novice prévu; vous ne verrez probablement pas une vedette affecte du tout. Le problème est que signifie la coupure de l'attention que les coins extrêmes du mur où les sommets sont spécifiés ne reçoivent aucune contribution du projecteur et puisque ce sont les seuls sommets du mur a, il n'y aura pas de modèle de projecteur sur le mur.

Autres conseils

GL_POSITION est spécifiée en coordonnées homogènes, ce qui signifie qu'il a besoin de quatre valeurs, et non pas trois. Vous devez spécifier w = 1.0 pour votre source de lumière, mais votre w composant est à la place vient de ce qui arrive à être à côté de light0Position en mémoire.

(Une partie de la raison pour laquelle GL_POSITION est en coordonnées homogènes est de vous permettre de définir des lumières directionnelles en définissant une position avec w = 0.0).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top