Лучевая сборка в OpenGL ES 2.0

Я пытаюсь реализовать выбор лучей в OpenGL ES 2.0, чтобы определить, был ли объект нажат или нет. Пока что я просто пытаюсь проверить, был ли нажат конкретный треугольник. Я использую этот сайт в качестве мотивации http://android-raypick.blogspot.ca/2012/04/first-i-want-to-state-this-is-my-first.html

Это то, что я до сих пор:

public void onClick(float x, float y)
{
    float[] temp = new float[4];
    float[] temp2 = new float[4];
    System.out.println("X coordinate: " + x);
    System.out.println("Y coordinate: " + y);
    float[] pos = new float[4];

    y = (float) viewport[3] - y;

    int res = GLU.gluUnProject(x, y, 1.0f, 
            mMVPMatrix, 0,
            mProjectionMatrix, 0,
            viewport, 0, 
            temp, 0);

    Matrix.multiplyMV(temp2, 0, mMVPMatrix, 0, temp, 0);
    float[] nearCoOrds = new float[3];

    if(res == GLES20.GL_TRUE)
    {
        nearCoOrds[0] = temp2[0] / temp2[3];
        nearCoOrds[1] = temp2[1] / temp2[3];
        nearCoOrds[2] = temp2[2] / temp2[3];
        System.out.println("Near0: " + nearCoOrds[0]);
        System.out.println("Near1: " + nearCoOrds[1]);
        System.out.println("Near2: " + nearCoOrds[2]);
    }

    res = GLU.gluUnProject(x, y, 0,
            mMVPMatrix, 0,
            mProjectionMatrix, 0,
            viewport, 0,
            temp, 0);

    Matrix.multiplyMV(temp2,0,mMVPMatrix, 0, temp, 0);
    float[] farCoOrds = new float[3];

    if(res == GLES20.GL_TRUE)
    {
        farCoOrds[0] = temp2[0] / temp2[3];
        farCoOrds[1] = temp2[1] / temp2[3];
        farCoOrds[2] = temp2[2] / temp2[3];
        System.out.println("Far0: " + farCoOrds[0]);
        System.out.println("Far1: " + farCoOrds[1]);
        System.out.println("Far2: " + farCoOrds[2]);
    }

    float[] coords = new float[3];

    coords[0] = farCoOrds[0]-nearCoOrds[0];
    coords[1] = farCoOrds[1]-nearCoOrds[1];
    coords[2] = farCoOrds[2]-nearCoOrds[2];

    System.out.println("REAL COORDS 0: " + coords[0]);
    System.out.println("REAL COORDS 1: " + coords[1]);
    System.out.println("REAL COORDS 2: " + coords[2]);

}

x и y float - это координаты x и y того места, где палец нажимал на экран. Функция onClick называется из MainActivity,

В

 GLU.gluUnProject(x, y, 1.0f, 
            mMVPMatrix, 0,
            mProjectionMatrix, 0,
            viewport, 0, 
            temp, 0);

mMVPMatrix это матрица просмотра модели mProjectionMatrix такое матрица проекции и viewport имеет значения {0,0, ширина экрана, высота экрана}.

Пример вывода, который я получаю (касается около середины экрана):

REAL COORDS 0: -0.21542415
REAL COORDS 1: 0.31117013
REAL COORDS 2: 9.000003

Мой вопрос / тема в том, что я не знаю, нахожусь ли я на правильном пути здесь? Правильно ли я понял или кажется, что я что-то неправильно понял? Или есть какие-то другие способы, которыми я могу достигнуть обнаружения касания на треугольниках?

Спасибо за любую помощь или руководство!

2 ответа

Существует отличный OpenGL-фреймворк для Android под названием Rajawali. Он поддерживает выбор объектов, пример кода выглядит очень просто, вы должны попробовать.

Я полагаю, что многие вас неправильно поняли (или, может быть, у меня есть ^^). Ближние и дальние координаты используются для построения вашего лучевого сегмента для тестирования ваших полисов / хитбоксов. Сегмент находится в том, что называется мировым пространством, и для проверки ваших вершин / моделей вам нужно будет преобразовать их из пространства модели (в котором они находятся при загрузке) в мировое пространство, умножив их на их матрицу mModelView (имеет все свои преобразования, повороты и т. д. в нем). Кажется, эта статья, на которую вы ссылаетесь, проходит через это ^^ Имеет смысл или я что-то пропустил?

бонусная ссылка для вас: http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter0.htm

Другие вопросы по тегам