2015-11-05 2 views
0

У меня есть три куба, вращающиеся в моей 3D-сцене. То, что я пытаюсь достичь, - это вычислить, какой из них (если есть) кубов, которые были нажаты.Какой modelView я использую в gluUnproject?

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

Прототип функции выглядит следующим образом (я разрабатываю для Android):

public static int gluUnProject (float winX, float winY, float winZ, 
           float[] model, int modelOffset, 
           float[] project, int projectOffset, 
           int[] view, int viewOffset, 
           float[] obj, int objOffset) 

То, что я не понимаю, что матрица видовую я должен использовать для четвертого аргумента. Должен ли я рассчитать луч один раз для каждого куба, используя матрицу modelView каждого куба?

ответ

0

Должен ли я рассчитать луч один раз для каждого куба, используя матрицу modelView каждого куба?

Это действительно зависит от того, на что вы собираетесь протестировать луч. Если вы хотите проверить луч против каждого куба в своей локальной системе координат (т. Е. Куб с центром в 0,0,0 в локальных координатах), то да, вы должны разоблачить каждый отдельный куб (если честно, если это то, что вы хотите вам следует взглянуть на Plücker coordinates, которые в значительной степени упрощают такой тест, но тогда вы, вероятно, должны использовать координаты Plücker для тестов пересечения лучей).

Если вы хотите протестировать геометрию в мировых координатах, вам понадобится матрица просмотра модели, как только это произойдет, когда вы достигнете мировой сцены в построении своего представления модели, то есть сразу после преобразования вида, перед применением отдельных преобразований модели.

+0

Я действительно хочу проверить геометрию в мировом пространстве, но мне трудно понять, что вы говорите. Каждый раз, когда я рисую фрейм, матрица представления и матрица проекционного прогноза вычисляются в моем классе Renderer, который затем подается в кубы следующим образом: cube1.draw (mViewProjectionMatrix, mViewMatrix). Затем каждый куб вычисляет MVP-матрицу (используя свою индивидуальную матрицу модели) и передает ее шейдерам в виде единой. Какую матрицу я должен использовать, когда я вычисляю луч из класса Renderer? –

+0

@AbuHassan: передать матрицу зрения и проекции в соответствии с классом рендеринга. Однако, поскольку вы получаете предварительно умноженное проекционное представление (которое имеет мало пользы), вы сначала размножаете часть представления. Если проекция PV = P · V, где P = проекция, вы можете получить исходный P посредством r-умножения с обратным представлением: P = PV · inv (V); т. е. вы должны сначала инвертировать матрицу представлений. – datenwolf

+0

@AbuHassan: У меня создается впечатление, что у вас есть только мрачное понимание того, как работает целая цепочка преобразований. Я настоятельно рекомендую вам отполировать свои знания по линейной алгебре, как работать с матрицами и как матрицы могут действовать как линейный оператор. С этими знаниями все становится намного легче. – datenwolf

Смежные вопросы