iPhone OpenGL ES - Как выбрать - PullRequest
6 голосов
/ 29 марта 2010

Я работаю над приложением OpenGL ES1, которое отображает 2D-сетку и позволяет пользователю перемещаться и масштабировать / вращать ее. Мне нужно знать точный перевод координат View Touch в мой мир opengl и ячейку сетки. Есть ли какие-нибудь помощники, чтобы сделать последние несколько преобразований, которые я делаю для навигации? или я должен вычислить и сделать матрицу вручную?

Ответы [ 3 ]

6 голосов
/ 15 апреля 2010

Похоже, что вы ищете, это непроектный метод. Библиотека glut поставляется с таковой, но она не доступна в OpenGL ES. Можно переписать код перенасыщения самостоятельно, чтобы быть совместимым с iphone Вы также можете написать свой собственный код для отмены проецирования, что потребует масштабирования точки касания к вашему окну просмотра, умножения ее на обратную матрицу проекции * модели просмотра и деления на w для получения трехмерного вектора.

4 голосов
/ 01 апреля 2010

Режим комплектования недоступен в openGL ES. Но легко вычислить координату экрана любой трехмерной точки, используя матрицу проекции, полученную из текущего состояния openGL. Вот как я это делаю (IMPoint2D и IMPoint3D являются базовыми (x, y) и (x, y, z) структурами)

+ (IMPoint2D) getScreenCoorOfPoint:(IMPoint3D)_point3D
{
    GLfloat     p[16];                                              // Where The 16 Doubles Of The Projection Matrix Are To Be Stored
    glGetFloatv(GL_PROJECTION_MATRIX, p);                           // Retrieve The Projection Matrix
/*
Multiply M * point
*/
    GLfloat _p[] = {p[0]*_point3D.x +p[4]*_point3D.y +p[8]*_point3D.z + p[12],
                    p[1]*_point3D.x +p[5]*_point3D.y +p[9]*_point3D.z + p[13],
                    p[2]*_point3D.x +p[6]*_point3D.y +p[10]*_point3D.z+ p[14],
                    p[3]*_point3D.x +p[7]*_point3D.y +p[11]*_point3D.z+ p[15]};
/*
divide by scale factor
*/
    IMPoint2D _p2D = {_p[0]/_p[3], _p[1]/_p[3]};
/*
get result in screen coordinates. In this case I'm in landscape mode
*/
    return (IMPoint2D) {_p2D.x*240.0f + 240.0f, (1.0f - _p2D.y) *160.0f};
}
0 голосов
/ 24 июня 2011

Можно ли сделать это с GL_MODELVIEW_MATRIX? или GL_MODLVIEW, я не изменяю позицию просмотра, только делаю модель просмотра. Я делаю это:

            glMatrixMode(GL_MODELVIEW);

// Setup model view matrix
            glLoadIdentity();
            [gAccel GetAccelerometerMatrix:(GLfloat *) matrix headingX:headx headingY: heady headingZ:headz];

            // Finally load matrix
            glLoadMatrixf((GLfloat*)matrix);

            glPushMatrix();
            glRotatef(-90, 1, 0, 0);
            glScalef(0.0005, 0.0005, 0.0005);
            glTranslatef(x, 0.0, z);

спасибо

...