Android OpenGL ES 2.0 считывает z-буфер для глюунпроекта или кальциевого коллизии с почти дальними координатами - PullRequest
1 голос
/ 06 декабря 2011

Я знаю, что есть много вещей, даже в stackoverflow об этой теме / проблеме, но я действительно не могу понять. Я в этой проблеме уже несколько часов.

public Vector select(float x, float y) 
{

int viewport[] = { 0, 0, width , height};

float realY = ((float) ( height) - y);
float near[] = { 0.0f, 0.0f, 0.0f, 0.0f };
float far[] = { 0.0f, 0.0f, 0.0f, 0.0f };

GLU.gluUnProject(x, realY, 0, mg.mModelView, 0, mg.mProjection , 0, viewport, 0, near, 0);
GLU.gluUnProject(x, realY, 1, mg.mModelView, 0, mg.mProjection, 0, viewport, 0, far, 0);

float xr = near[0] / near[3];
float yr = near[1] / near[3];
float zr = near[2] / near[3];

return new Vector(xr,yr,zr);
}

/**
GLU.gluLookAt( gl, me.position.x, me.position.y, me.position.z, me.position.x, 0, me.position.z+1, 0, 1, 0 );
**/

1) Есть ли еще возможность прочитать буфер z с помощью

    glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);

Класс GL11Extension реализует константу GL_DEPTH_COMPONENT для glReadPixels или как? http://developer.android.com/reference/javax/microedition/khronos/opengles/GL11ExtensionPack.html#GL_DEPTH_COMPONENT

2) Или можно рассчитать мануал z-буфера с моими позициями glulookat?

3) Или как рассчитать столкновение с ближним и дальним положением.

Спасибо, что прочитали:)

1 Ответ

4 голосов
/ 06 декабря 2011

Часть z в unProject - это позиция z на ближней плоскости отсечения / «спереди» усеченного вида.Если вы знаете положение глаза, у вас есть две трехмерные точки, из которых вы можете сделать луч / вектор.

Затем вы используете луч для вычисления всего, через что он проходит.В моей собственной игре я транслирую луч в собственную систему координат своей игры, а затем повторно использую алгоритмы обнаружения столкновений, которые у меня уже есть.(Т. Е. Код "Пули пересекает список попаданий").

Если у вас нет обнаружения столкновений, довольно просто рассчитать ограничивающий прямоугольник или ограничивающую сферу для каждой модели, что вам нужно только сделатьодин раз (так что вы можете просто добавить его в качестве свойства к файлам модели).Затем вы можете сделать быстрый проход для каждой модели, чтобы найти, какие модели выбрал пользователь, выполнить тест на расстоянии от камеры для определения местоположения модели, чтобы найти то, что находится на переднем плане, или взять поли из каждой модели и точно рассчитать, какиеПоли был выбран

Редактировать: я нашел рабочий пример здесь: введите описание ссылки здесь .Объяснение на русском, но у меня сработал код

enter image description here

...