2017-06-21 12 views
1

J'ai un modèle composé de cinq cubes, le modèle entier est texturé, j'ai ajouté l'éclairage et cela fonctionne en quelque sorte pour le haut et le bas , la police et l'arrière des cubes mais pas les côtés, il y a aussi un problème avec l'ombrage parce qu'il y a de la lumière là où il devrait être ombragé. J'utilise un wrapper Matlab .NET opengl basé sur le framework Tao pour ce qui est inhabituel, je l'admets.Éclairage Opengl fonctionne haut, bas, avant, arrière mais pas sur les côtés du modèle

Je peux fournir le code entier si demandé, mais pour l'instant, voici mon code d'éclairage

%% Lighting 

% Enable Light 
Gl.glEnable(Gl.GL_LIGHTING); 
% Vector for light position (directional light - try a positional one) 

% Get Projection matrix in array of length 16 
projmatrix = NET.createArray('System.Single', 16); 
Gl.glGetFloatv(Gl.GL_PROJECTION_MATRIX,projmatrix); 
% Reshape to 4x4 matrix 
projmatrix=reshape(double(projmatrix),[4 4]); 
% Use the inverse projection matrix to get the light fixed with the camera 
LightPosCam=(projmatrix)\[0.3 0.5 -0.6 0]'; 

LightPos= NET.convertArray(LightPosCam, 'System.Single', 4); 
Ambient = NET.convertArray([0.000001 0.000001 0.000001 .1], 
'System.Single', 4); 
Diffuse= NET.convertArray([0.7 0.7 0.7 1], 'System.Single', 4); 
Specular= NET.convertArray([0.6 0.6 0.6 1], 'System.Single', 4); 

% Turn on Lighting 
Gl.glEnable(Gl.GL_LIGHTING); 
Gl.glEnable(Gl.GL_LIGHT0); 

Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_POSITION,LightPos); 
Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_AMBIENT,Ambient); 
Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_DIFFUSE,Diffuse); 
Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_SPECULAR,Specular); 

% Constant attenuation (for distance, etc.) 
% Only works for fixed light locations! Otherwise disabled 
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_CONSTANT_ATTENUATION, 1.0); 
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_LINEAR_ATTENUATION, 0.0); 
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_QUADRATIC_ATTENUATION, 0.0); 
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, Gl.GL_TRUE); 

% Normalize vectors 
Gl.glEnable(Gl.GL_NORMALIZE); 

% Enable ColorMaterial 
% Gl.glEnable (Gl.GL_COLOR_MATERIAL) ; 
% Set the Material Properties 
floor_ambient = NET.convertArray([0, 0, 0, 0 ], 'System.Single', 4); 
floor_diffuse = NET.convertArray([0.8, 0.8, 0.8, 1.0 ], 'System.Single', 4); 

floor_specular= NET.convertArray([0.7,0.7,0.7, 1 ], 'System.Single', 4); 
floor_emission= NET.convertArray([0.2,0.0,0.0, 1 ], 'System.Single', 4); 
floor_shininess = 120; 
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, floor_ambient); 
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, floor_diffuse); 
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, floor_specular); 
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, floor_shininess); 
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, floor_emission); 

% Gourang shanding 
Gl.glShadeModel(Gl.GL_SMOOTH); 

% Specular color enable 

Gl.glLightModeli(Gl.GL_LIGHT_MODEL_COLOR_CONTROL, 
Gl.GL_SEPARATE_SPECULAR_COLOR); 
% Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, 
Gl.GL_MODULATE); 
% Gl.glEnable(Gl.GL_BLEND); 

Et voici mon code pour seulement l'un des cubes

 %% Draw Sats 
     % Select our texture 

     Gl.glEnable(Gl.GL_NORMALIZE) 

     %  Bottom Face 
     Gl.glEnable(Gl.GL_TEXTURE_2D); 
     Gl.glBindTexture(Gl.GL_TEXTURE_2D, data.TextureID8); %%Metalic Texture 
     Gl.glBegin(Gl.GL_QUADS); 
      Gl.glNormal3f(0,0,-1); 
      Gl.glTexCoord2f(0,0); 
      Gl.glVertex3f(cornersx(1), cornersy(1), cornersz(1)); 
      Gl.glNormal3f(0,0,-1); 
      Gl.glTexCoord2f(1,0); 
      Gl.glVertex3f(cornersx(2), cornersy(2), cornersz(2)); 
      Gl.glNormal3f(0,0,-1); 
      Gl.glTexCoord2f(1,1); 
      Gl.glVertex3f(cornersx(4), cornersy(4), cornersz(4)); 
      Gl.glNormal3f(0,0,-1); 
      Gl.glTexCoord2f(0,1); 
      Gl.glVertex3f(cornersx(3), cornersy(3), cornersz(3)); 

     %  Top Face 
      Gl.glEnd() 

     Gl.glBindTexture(Gl.GL_TEXTURE_2D, data.TextureID3); %%Glyph1 Texture 
     Gl.glBegin(Gl.GL_QUADS); 
      Gl.glNormal3f(0,0,1); 
      Gl.glTexCoord2f(0,0); 
      Gl.glVertex3f(cornersx(7), cornersy(7), cornersz(7));    

     Gl.glNormal3f(0,0,1); 
     Gl.glTexCoord2f(1,0); 
     Gl.glVertex3f(cornersx(8), cornersy(8), cornersz(8));    

     Gl.glNormal3f(0,0,1); 
     Gl.glTexCoord2f(1,1); 
     Gl.glVertex3f(cornersx(6), cornersy(6), cornersz(6));    

     Gl.glNormal3f(0,0,1); 
     Gl.glTexCoord2f(0,1); 
     Gl.glVertex3f(cornersx(5), cornersy(5), cornersz(5)); 
     Gl.glEnd() 

     % Front Face 
     Gl.glBindTexture(Gl.GL_TEXTURE_2D, data.TextureID); 
     Gl.glEnable(Gl.GL_TEXTURE_2D); 
     Gl.glBegin(Gl.GL_QUADS); 
     Gl.glNormal3f(0,-1,0); 
     Gl.glTexCoord2f(0,0); 
     Gl.glVertex3f(cornersx(1), cornersy(1), cornersz(1));    

     Gl.glNormal3f(0,-1,0); 
     Gl.glTexCoord2f(1,0); 
     Gl.glVertex3f(cornersx(5), cornersy(5), cornersz(5));    

     Gl.glNormal3f(0,-1,0); 
     Gl.glTexCoord2f(1,1); 
     Gl.glVertex3f(cornersx(6), cornersy(6), cornersz(6));    

     Gl.glNormal3f(0,-1,0); 
     Gl.glTexCoord2f(0,1); 
     Gl.glVertex3f(cornersx(2), cornersy(2), cornersz(2)); 

     %  Back Face 

     Gl.glNormal3f(0,1,0); 
     Gl.glTexCoord2f(0,0); 
     Gl.glVertex3f(cornersx(3), cornersy(3), cornersz(3));    

     Gl.glNormal3f(0,1,0); 
     Gl.glTexCoord2f(1,0); 
     Gl.glVertex3f(cornersx(4), cornersy(4), cornersz(4));    

     Gl.glNormal3f(0,1,0); 
     Gl.glTexCoord2f(1,1); 
     Gl.glVertex3f(cornersx(8), cornersy(8), cornersz(8));    

     Gl.glNormal3f(0,1,0); 
     Gl.glTexCoord2f(0,1); 
     Gl.glVertex3f(cornersx(7), cornersy(7), cornersz(7)); 

     %  Right Face 

     Gl.glNormal3f(-1,0,0); 
     Gl.glTexCoord2f(0,0); 
     Gl.glVertex3f(cornersx(4), cornersy(4), cornersz(4));    

     Gl.glNormal3f(-1,0,0); 
     Gl.glTexCoord2f(1,0); 
     Gl.glVertex3f(cornersx(2), cornersy(2), cornersz(2));    

     Gl.glNormal3f(-1,0,0); 
     Gl.glTexCoord2f(1,1); 
     Gl.glVertex3f(cornersx(6), cornersy(6), cornersz(6));    

     Gl.glNormal3f(-1,0,0); 
     Gl.glTexCoord2f(0,1); 
     Gl.glVertex3f(cornersx(8), cornersy(8), cornersz(8)); 

     %  Left Face 

     Gl.glNormal3f(1,0,0); 
     Gl.glTexCoord2f(0,0); 
     Gl.glVertex3f(cornersx(3), cornersy(3), cornersz(3));    
     Gl.glNormal3f(1,0,0); 
     Gl.glTexCoord2f(1,0); 
     Gl.glVertex3f(cornersx(1), cornersy(1), cornersz(1));     
     Gl.glNormal3f(1,0,0); 
     Gl.glTexCoord2f(1,1); 
     Gl.glVertex3f(cornersx(5), cornersy(5), cornersz(5));     
     Gl.glNormal3f(1,0,0); 
     Gl.glTexCoord2f(0,1); 
     Gl.glVertex3f(cornersx(7), cornersy(7), cornersz(7)); 
     Gl.glEnd() 

Finally a gif of my model and the issue in action.

Répondre

0

Il y a deux problèmes potentiels que je peux voir:

  1. Si vous rencontrez seulement des problèmes avec les faces droite et gauche, il se peut que vous ayez inversé accidentellement leurs normales de surface. Je voudrais essayer ceci:

    Gl.glNormal3f(1,0,0); % For all of the right face vertices 
    Gl.glNormal3f(-1,0,0); % For all of the left face vertices 
    

    Lorsque les Normales de surface sont pointés dans la mauvaise direction (à savoir dans votre cube), cela signifie que la face arrière du polygone est tournée vers l'extérieur. Lorsque vous appelez Gl.glMaterialfv, vous spécifiez Gl.GL_FRONT et non Gl.GL_FRONT_AND_BACK, ce qui signifie que les faces arrière ne sont pas allumées. Je suppose que ce serait pourquoi vous ne voyez aucun éclairage appliqué sur les côtés. Je ne sais pas si l'ordre de vos sommets est important, de sorte qu'ils doivent toujours être spécifiés dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre autour du visage vu de l'extérieur du cube. Puisque je ne sais pas ce que ressemblent vos données cornersx, cornersy ou cornersz, je ne sais pas si vous les définissez dans le sens des aiguilles d'une montre ou dans le sens contraire des aiguilles d'une montre. Cependant, je peux vous dire que l'un de vos visages est défini avec un ordre horaire différent du reste: le gauche face, avec les sommets classés 3 -> 1 -> 5 -> 7. Je ne sais pas assez sur votre cadre d'éclairage pour dire si ce serait un problème, mais pour la cohérence, vous voudrez peut-être définir les sommets de la face gauche dans l'ordre 1 -> 3 -> 7 -> 5 à la place.

+0

Merci Un gnovice de groupe, la première suggestion a fait l'affaire, il est étrange parce que j'utilisé le même code avant ADND cela a fonctionné parfaitement avec des couleurs, en ajoutant des textures cqused toutes sortes de problèmes pour moi. Si je peux prendre plus de temps et vous poser des questions sur l'ombrage, maintenant que l'éclairage fonctionne, j'obtiens un éclairage par exemple sur le côté du cube à l'arrière qui est censé être ombragé. Voici une image: http://imgur.com/fNCQmRQ – Alla

+0

@Alla: Vous confondez "ombrage" avec "ombres". L'ombrage que vous utilisez, comme lorsque vous appelez 'Gl.glShadeModel (Gl.GL_SMOOTH);' contrôle la façon dont l'éclairage est appliqué sur une surface, produisant des effets d'ombrage à partir des propriétés d'éclairage et de surface. [Shadow mapping] (https://learnopengl.com/#!Advanced-Lighting/Shadows/Shadow-Mapping) est beaucoup plus impliqué. – gnovice

+0

Merci grovince, je l'ai fait indded ont les deux mélangés, ressemble à la cartographie de l'ombre est assez complexe, ce qui me prendra du temps pour obtenir.Si cela ne vous dérange pas de prendre votre avis sur quelque chose d'autre, quel environnement/configuration diriez-vous est le plus optimal pour quelqu'un qui travaille sur la création d'un modèle et simule ensuite la sortie du capteur LIDAR de ce modèle, la profondeur du temps de vol ? – Alla