2012-06-15 1 views
3

Я создал простой 3D-мир, используя GLKit. Я пытаюсь найти конкретную точку в моем 3D-мире на основе экрана. Похоже, я хотел бы использовать GLKMathUnproject. Подпись метода:Как использовать GLKMathUnproject

GLKVector3 GLKMathUnproject (
    GLKVector3 window, 
    GLKMatrix4 model, 
    GLKMatrix4 projection, 
    int *viewport, 
    bool *success 
); 

Несколько вещей меня путают по параметрам, которые требуются. Сначала не должны быть координаты окна GLKVector2? И самое главное не проецировать точку на экране в 3D-пространство, создать луч вместо одной точки. Когда вы проецируете точки в трехмерном пространстве на двумерную плоскость (ака экран), вы теряете одно измерение информации об этой точке. Итак, как бы можно было преобразовать 2D-экранную точку в трехмерную точку мира, не указав, на какой глубине вы хотите «непроектировать» свою точку? Об этом методе нет в любом месте в Интернете (помимо яблочных документов).

ответ

6

Первым параметром является GLKVector3, поскольку компонент z сохраняет желаемую глубину z.

Таким образом, окно x, y - экранные координаты, а окно z - желаемая глубина.

eg с z = 0 GLKMathUnproject даст координаты объекта в ближней плоскости с z = 1, GLKMathUnproject даст вам координаты объекта в дальнем плане.

Это необходимо, потому что GLKMathUnproject отображает из плоскости в линию в трехмерном пространстве, образованном усеченной проекцией. Z-границы усеченного конуса ограничены ближней и дальней плоскостями.

Итак, скажите, что вы хотите нарисовать непроектированную точку мыши на плоскости z = 0 (пространство объектов) в усеченном состоянии.

Затем непроект 2 точки с окном z = 0 и окном z = 1 1. Используйте эти точки, чтобы сформировать линию в пространстве объектов. Перейдем к этой линии с плоскостью z = 0, чтобы определить конечную целевую точку.

Надеется, что это помогает кто-то -

Вы можете прочитать здесь CasualDistraction Blog

+0

«Итак, окно x, y - экранные координаты, а окно z - желаемая глубина». заключается в том, что в диапазоне от -1 до 1 или от 0 до 600 (или что такое устройство)? Спасибо – Andrew

+0

, используя код блога CasualDistraction, значение far_pt всегда возвращается {inf, inf, inf}. Я попытался изменить 2-й Z на 0.999, и это дало значение, но не правильное. Если я правильно читаю ваш ответ, x & y окна-координаты x & y, а Z представляет собой «какой процент от расстояния между ближним и дальним самолетами вы хотите?» Это правильно? – Olie

0

У вас есть «направление глаз», но вы не знаете глубины. Затем вы подсчитываете, сколько вы должны масштабировать этот вектор, чтобы достичь той же глубины, что и каждый объект, который вы хотите проверить. Как только вы это сделаете, убедитесь, что расширенный вектор действительно попадает в разумную близость вашего целевого объекта. Это называется «лучей».

+0

«Глубины», в этом контексте, является Z компонент позиции каждого объекта, в камере (глаз) координата. –

+0

И «разумная близость» определяется ограничивающим объемом ваших моделей (который вы определяете в удобное для вас время) –