Ich bin neu bei opengl (Android Plattform). Ich möchte ein Opengl-Objekt, z.B. eine Kugel, in einer bestimmten Loaction in 3D zeichnen. Wie kann ich das tun? Nachdem ich es gezeichnet habe, möchte ich es bei einem Touch-Ereignis drehen, wie kann ich diese beiden Dinge tun? Vielen Dank im Voraus.
Antwort
Zu viele Anzeigen?Sie verwenden dazu Transformationsmatrizen. Sie brauchen drei Matrizen, um das zu erreichen, was Sie wollen: eine Objektmatrix (die die Position und Drehung angibt), eine Kameramatrix (die die Kameraposition und -ausrichtung im Raum angibt) und eine Projektionsmatrix (die für die Perspektive sorgt, d. h. weit entfernte Dinge sind klein, große Dinge sind nah).
Bei Android ist das der Fall:
float[] model = new float[16];
float[] camera = new float[16];
float[] projection = new float[16];
// those are the "basic" matrices
float[] modelview = new float[16];
float[] mvp = new float[16];
// those are their products
float f_scene_rotation_x = 10, f_scene_rotation_y = 30;
Matrix.setIdentityM(camera, 0);
Matrix.translateM(camera, 0, 0, 0, -2.5f);
Matrix.rotateM(camera, 0, f_scene_rotation_y, 1, 0, 0);
Matrix.rotateM(camera, 0, f_scene_rotation_x, 0, 1, 0);
// set up a camera, orbitting the scene
Matrix.setIdentityM(model, 0);
Matrix.translateM(model, 0, 1, 2, 0.5f); // set your desired position for the object (1.0,2.0,0.5)
//Matrix.rotateM(model, 0, angle, axisX, axisY, axisZ); // can rotate you object by defined angle arround defined axis
// set up model matrix
int mWidth = 640, mHeight = 480; // display dimensions
perspective(projection, 0, 90, (float)mWidth / mHeight, .1f, 1000.0f);
// set up perspective projection
Matrix.multiplyMM(modelview, 0, camera, 0, model, 0); // modelview = camera * model
Matrix.multiplyMM(mvp, 0, projection, 0, modelview, 0); // mvp = projection * modelview
// fuse matrices together
GLES20.glUseProgram(xxx); // bind your shader
GLES20.glUniformMatrix4fv(yyy, 1, false, GLES20.GL_FALSE, mvp); // pass the final matrix to the shader
// xxx is your program object, yyy is location of the modelview-projection matrix uniform inside your vertex shader
Die letzten beiden Codezeilen setzen voraus, dass Sie OpenGL ES 2.0 verwenden. Wenn das nicht der Fall ist, verwenden Sie glLoadMatrix(), um Modellansicht und Projektionsmatrizen separat zu laden (mvp muss nicht berechnet werden). Verwenden Sie nicht die eingebauten OpenGL ES 1.0 glRotatef() / glTranslatef(), diese verursachen nur Traurigkeit und Irritation.
Beachten Sie, dass der obige Code die Funktion perspective() enthält. Ich vermute, es ist irgendwo in Android-Bibliotheken, aber Sie könnten auch verwenden:
public static void perspective(float[] matrix, int moffset, float f_fov, float f_aspect, float f_near, float f_far)
{
float f_w, f_h;
f_h = (float)(Math.tan(f_fov * Math.PI / 180 * .5f)) * f_near;
f_w = f_h * f_aspect;
// calc half width of frustum in x-y plane at z = f_near
Matrix.frustumM(matrix, moffset, -f_w, f_w, -f_h, f_h, f_near, f_far);
// set frustum
}
Ich hoffe, das hilft ...