Как я могу нарисовать объект (сферу или треугольник) в определенном месте (скажем, 1.0,2.0,0.5) в OpenGL (платформа Android) - PullRequest
3 голосов
/ 17 мая 2011

Я новичок в opengl (платформа Android).Я хочу нарисовать объект opengl, скажем, сферу на определенном участке в 3DКак мне это сделать?После рисования я хочу повернуть его на событие касания.Заранее спасибо.

1 Ответ

0 голосов
/ 23 января 2012

Для этого вы используете матрицы преобразования. Вам нужно три матрицы, чтобы делать то, что вы хотите, матрица объекта (определяющая его положение и поворот), матрица камеры (определяющая положение и ориентацию камеры в пространстве) и матрица проекции (которая создает перспективу, то есть далеко, мелкие, большие объекты). вещи рядом).

В Android вы делаете:

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

Последние две строки кода основаны на использовании OpenGL ES 2.0. Если это не так, используйте glLoadMatrix (), чтобы загрузить матрицы модели и проекции по отдельности (нет необходимости вычислять mvp). Не используйте встроенный OpenGL ES 1.0 glRotatef () / glTranslatef (), они вызывают только грусть и раздражение.

Обратите внимание, что приведенный выше код содержит функцию перспективе (). Я подозреваю, что это где-то в библиотеках Android, но вы также можете использовать:

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
}

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...