2012-03-06 8 views
2

Я возился в программе, которая выполняет весь рендеринг, используя матрицу, установленную gluOrtho2D(). То, что я хотел бы сделать, это повернуть конкретную текстуру вокруг оси y (0,1,0), чтобы она выглядела так, как будто исходная матрица была предоставлена ​​gluPerspective(). Я понимаю, что это невозможно с матрицей орфографических проекций, и мне придется создать новую перспективную матрицу проекций. Я хочу, чтобы текстуры, которые я рисую, выглядели точно так же, как при рисовании с орфографической матрицей, за исключением случаев, когда я повернул их вокруг оси y.Как найти матрицу проекции, эквивалентную орфографической матрице, но дает перспективу, когда она не находится в плоскости xy?

Итак, подведем итог:
Как найти матрицу проекции в перспективе, которая эквивалентна данной орфографической матрице, когда формы рисуются в плоскости ху, но дает мне перспективу, когда не в плоскости ху?

+0

Зачем вам это нужно? – Nobody

+0

Ваше резюме сильно отличается от ваших предыдущих заметок. – Nobody

+0

Предыдущие примечания могут быть немного неясными, но то, что все это сводится к резюме. Я хочу получить перспективные прогнозы в большой программе, которая использует орфографические проекции для всего рендеринга, при изменении минимального количества кода. Прошло уже пару лет с тех пор, как я в последний раз учился на компьютерном видении, поэтому я довольно ржавый. – Leo

ответ

4

В основном я понимаю: вы хотите иметь перспективную матрицу, которая дает то же изображение, что и орфографическая проекция, когда объект лежит на XY-плоскости.

Итак, начнем: Вы хотите нарисовать свой самолет в плоскости XY, и у вас было gluOrtho2D(-w, w, -h, h); (асимметричная орфографическая проекция немного сложнее, если вам это нужно, тогда скажите так). Что вам нужно сделать сейчас:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(2 * atan(h/2), w/h, 1, 3); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, -2); 

То, что я сделал здесь сопрягает центр проективной вид усеченного на участке XY-плоскости, которая была видна в ортогональной проекции.

Возьмите графики проекции усеченных и некоторые математики и вы можете сделать это сами :)


Так же, как напоминание, я оставлю свой ответ на старый вопрос здесь.

Либо у вас есть орто, либо перспективная проекция. Вы должны решить одно. Вы не сможете увеличить перспективу, вращаясь по любой оси.

Зачем вам нужно изменить всю программу только для изменения режима проецирования?

Одно из возможных решений: Я полагаю, старый GL с различными режимами матрицы и так далее:

glMatrixMode(GL_PROJECTION); //switch to projection matrix mode 
glPushMatrix(); //push the old matrix 
glLoadIdentity(); 
//apply the perspective projection 
//do your rendering 
glPopMatrix(); //pop the old matrix 

С новой схемой GL вы должны будете сделать большинство из этого самостоятельно, но это должно быть легко хоть.

+0

Извините, плохо написанный вопрос. Он теперь обновлен. – Leo

+0

Программа делает слишком много других вещей при рисовании текстур для меня, чтобы просто заменить матрицу проекций, поэтому мне придется отказаться от этой идеи и написать свой собственный код рендеринга. Это отвечает на заданный вопрос, но не должен ли он быть gluPerspective (2 * atan (h/2), w/h, 1, 3)? – Leo

+0

@Leo: Вы правы в этом '2 * atan' Я исправлю это. Что касается другой проблемы: мое «старое» решение говорит вам, что делать, чтобы сохранить старую матрицу и восстановить ее после. – Nobody

0

Возможно ли это каким-либо простым способом без необходимости конвертировать всю программу в использование gluPerspective()?

Я уже устал рассказывать, но:

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

Я думаю, что большинство новичков смущают это:

reshape(width, height): 
    glViewport(0,0,width,height) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    projection_setup() 

Они видят проекцию сделана в функции перекроить и думают, что это единственное место, чтобы сделать это. Пожалуйста, говорите со мной: Матрица проецирования - это просто какое-то состояние, используемое для рисования как что-либо еще. Его можно изменить так же легко, как текущий цвет или текстуру.

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

+0

Извините, я понимаю, что мой вопрос был довольно плохо написан, так как я был в спешке. То, что я хочу, это матрица проекций, которая дает одинаковый вид объектов, нарисованных в плоскости xy, как старая орфографическая матрица, но дает перспективную проекцию для объектов, не находящихся в плоскости xy. – Leo

0

Можно иметь эффект перспективы, то есть вращение вокруг й или осей у, даже если ваша проекция матрица орфографическая, хитрость заключается в том, чтобы многократную матрицу вашего вида этой волшебной матрицей до/после любого другого преобразования вида:

// The matrix is 
// -z, 0, x, 0 
// 0, -z, y, 0 
// 0, 0, 1, 0 
// 0, 0, 1, -z 

где:

  • x составляет половину ширины окна просмотра,
  • y составляет половину высоты окна просмотра,
  • z может быть любое отрицательное количество кроме -0.

Несколько нот:

  1. если и ¨R вызова glRotate *, эта матрица идет первым, как эти встроенные вызовы десница умножения. если u r отслеживает собственную матрицу представления с использованием умножения левой руки, как это предлагается в учебниках, эта матрица продолжается. В любом случае эта матрица будет фактически умножаться на вашу матрицу орфографических проектов, поэтому можно также предварительно вычислить
  2. z - фактически имитируемые z глубины, поэтому они больше по величине, в дальнейшем объекты, как следствие , вращение больше похоже на орфографическое. Z не может быть положительным, потому что это сделает w в отрицательном NDC, OpenGL не позволит этого, он будет обрезаться, поэтому ничего не будет нарисовано
  3. В конце концов, нет магии, эта матрица просто компенсируется после того, как вы выполните: M (орто) XM (магия), u получить перспективную матрицу
  4. Этот трюк имеет решающее значение, если 99% вашего кода предназначено для орфографии, но только одно место или два требуют перспективного эффекта, тогда вам не нужно переключаться между два режима, если уры использования фиксированного трубопровода, GL_PROJECTION_MATRIX останется неизменным
  5. этой матрица взята из проекта Open Source Android так что надеюсь, это будет дать и много уверенности