3 Stimmen

Wie kann ich ein Objekt (eine Kugel oder ein Dreieck) an einer bestimmten Stelle (z.B. 1.0,2.0,0.5) in Opengl (Android-Plattform) zeichnen?

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.

0voto

the swine Punkte 10273

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 ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X