2017-06-11 1 views
0

Je dessine une forme 3D simple. La forme est lue à partir du fichier .obj et la forme entière a une couleur. Je veux créer une possibilité de changer la couleur. Par exemple, si je tape sur le bouton, je veux rendre la structure rouge.Comment changer la couleur d'un objet existant après une action

J'ai lu beaucoup de tutoriels mais je n'arrive pas à comprendre comment changer la couleur (élément redessiné?) Pendant l'exécution. J'ai essayé quelque chose comme ça dans le

gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffer); 
      gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 

Mais rien ne change.

Où et comment dois-je mettre en œuvre une telle action?

// mise à jour

procédé d'étirage

if(!initialized) { 
      init(gl); 
      initialized = true; 
     } 
     if(glCameraMatrixBuffer != null) { 
      glMatrixBuffer.put(glMatrix); 
      glMatrixBuffer.position(0); 

      //argDrawMode3D 
      gl.glMatrixMode(GL10.GL_MODELVIEW); 
      gl.glLoadIdentity(); 
      //argDraw3dCamera 
      gl.glMatrixMode(GL10.GL_PROJECTION); 
      gl.glLoadMatrixf(glCameraMatrixBuffer); 

      gl.glMatrixMode(GL10.GL_MODELVIEW); 
      gl.glLoadMatrixf(glMatrixBuffer); 
     } 

gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
     gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffer); 

     for(int i=0; i<parts.size(); i++){ 
      TDModelPart t=parts.get(i); 
      Material m=t.getMaterial(); 

      if(m!=null){ 
       FloatBuffer a=m.getAmbientColorBuffer(); 
       FloatBuffer d=m.getDiffuseColorBuffer(); 
       FloatBuffer s=m.getSpecularColorBuffer(); 
       gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_AMBIENT,a); 
       gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_SPECULAR,s); 
       gl.glMaterialfv(GL10.GL_FRONT_AND_BACK,GL10.GL_DIFFUSE,d); 
      } 

      gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer()); 

      gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer()); 
     } 


     gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); 

public final void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     if (DEBUG) { 
      gl = (GL10) GLDebugHelper.wrap(gl, GLDebugHelper.CONFIG_CHECK_GL_ERROR, log); 
     } 
     setupDraw2D(gl); 
     gl.glDisable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glDisable(GL10.GL_LIGHTING); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); 
     //load new preview frame as a texture, if needed 
     if (frameEnqueued) { 
      frameLock.lock(); 
      if (!isTextureInitialized) { 
       initializeTexture(gl); 
      } else { 
       //just update the image 
       //can we just update a portion(non power of two)?...seems to work 
       gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, 0, 0, previewFrameWidth, previewFrameHeight, 
         mode, GL10.GL_UNSIGNED_BYTE, frameData); 
      } 
      frameLock.unlock(); 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
      frameEnqueued = false; 
     } 

     gl.glColor4f(1, 1, 1, 1f); 
     //draw camera preview frame: 
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, squareBuffer); 

     //draw camera square 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

     if (customRenderer != null) { 
      customRenderer.setupEnv(gl); 
     } else { 
//   gl.glEnable(GL10.GL_LIGHTING); 
//   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientLightBuffer); 
//   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseLightBuffer); 
//   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, specularLightBuffer); 
//   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer); 
//   gl.glEnable(GL10.GL_LIGHT0); 
     } 

     matrixGrabber.getCurrentState(gl); 

     if (performAction) { 
      Log.d("ZMIANA_KOLORY", "akcja się wola"); 
      int[] c = new int[]{255, 0, 0}; 
      Vector<Float> v = markerInfo.getObjects().get(0).vectors; 
      ByteBuffer vBuf = ByteBuffer.allocateDirect(v.size() * 4); 
      vBuf.order(ByteOrder.nativeOrder()); 
      float[] newColor = new float[c.length + 1]; 
      for (int i = 0; i < c.length; i++) { 
       newColor[i] = (1.0f/255) * c[i]; 
       newColor[3] = 1.0f; 
      } 

      Log.d("ZMIANA_KOLORY", newColor[0] + " " + newColor[1] + " " + newColor[2] + " " + newColor[3] + " "); 

      FloatBuffer colorBuffer = vBuf.asFloatBuffer(); 
      colorBuffer.put(newColor); 
      colorBuffer.position(0); 
      gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, colorBuffer); 
      gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 

      performAction = false; 
//   Log.d("PERFORM_ACTION", "wykonuję akcję: " + actionName); 
//   switch (actionName) { 
//    case "Highlight": 
// 
//     for(ARObject obj : markerInfo.getObjects()) { 
////      if(tmp.get) 
// 
//     } 
// 
//     actionName = null; 
//     performAction = false; 
//     break; 
//   } 
     } 

     markerInfo.draw(gl); 

     if (customRenderer != null) { 
      customRenderer.draw(gl); 
     } 


     if (takeScreenshot) { 
      Log.d("SCREENSHOT", "Sprawdzam touched"); 

      Ray r = new Ray(gl, screenWidth, screenHeight, x, y); 
      Log.d("SCREENSHOT", "Near Coord =" + Arrays.toString(r.P0)); 
      Log.d("SCREENSHOT", "Far Coord =" + Arrays.toString(r.P1)); 

      takeScreenshot = false; 
     } 

    } 
+0

nous devons voir plus de votre code pour faire des suggestions sensées – datenwolf

+0

@datenwolf merci pour info. Pour être honnête, mon exemple est un peu complexe, donc si vous pouvez me dire ce qui aiderait à faire une suggestion judicieuse, je fournirai une partie spécifique du code. J'ai ajouté quelques détails peut-être c'est assez – Fixus

Répondre

0

OpenGL est un système d'étirage en fonction de l'état. Etat qui n'est pas actif/activé au moment même où vous effectuez un appel de dessin n'a aucun effet. Vous activez la matrice de couleurs, définissez le pointeur, puis immédiatement après le désactiver à nouveau. Pour que le tableau de vertex couleur soit pris en compte, il doit être activé.

Cependant, vous semblez également utiliser une texture là-bas. Et en plus de cela, vous utilisez le pipeline de fonction fixe (FFP). Il y a un certain nombre d'interactions entre les textures, les couleurs et l'illumination qui peuvent toutes mener à la couleur ne pas apparaître ou ne pas se révéler comme vous vous y attendez. Fais-toi plaisir et commence à utiliser les shaders. Comprendre le fonctionnement du FFP n'est pas difficile; Cependant, il a développé tellement de commutateurs d'état et de chemins de données qu'il est devenu très difficile de travailler avec. Vous pouvez soit écrire 40+ lignes de code pour configurer le FFP comme vous le souhaitez, soit écrire une ligne simple pour avoir le même effet.

+0

merci pour cela. dans le cas présenté, la texture n'est pas utilisée. Je sais que vous pouvez voir dans le code, mais l'application n'entrera jamais dans cette partie, je travaille sur la couleur unie. Pour sûr, je vais lire sur les shaders, mais pouvez-vous dire quelque chose de plus sur les États? La chose qu'il faut être actif? Est-ce le problème que je ne peux pas changer la couleur? – Fixus