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;
}
}
nous devons voir plus de votre code pour faire des suggestions sensées – datenwolf
@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