2016-04-18 1 views
1

Мой вопрос довольно прост в области компьютерной графики, но почему-то я не нашел ответа.Просмотр конвейера и 3D-преобразований

Пролог:

Я хочу, чтобы написать программу, которая печатает многоугольники на холсте, и я хотел бы, чтобы пользователи могли играть с полигонов - масштаб, переводить и вращаться (около х/у/z).

Я должен использовать только java AWT; не JOGL (библиотека java для openGL).


Я получаю многоугольники в 3d мировых координат, как с помощью входного файла в программу, а также «камера» свойство, такие как координаты камеры, посмотрите на точке, до вектора и размера окна (используется в проекция от 3d до 2d).


Первый вопрос:

Моя первая проблема заключается в написании просмотра трубопровода, поэтому мир 3D coordinats бы преобразовать просмотра координаты (координаты камеры), а затем проецировать его на 2d координат и выполнить обрезку, чтобы создать перспективу. Я видел бесчисленные видео и методы, но я не могу принять решение о последних матрицах.


Второй вопрос:

Моя вторая проблема в том, где применить 3D-матрицы преобразования. Должны ли преобразования применяться к исходным мировым координатам (а затем, конечно, продолжать работу с конвейером просмотра) или непосредственно для просмотра координат (и продолжить конвейер с этой точки)?

Для пояснения обозначим рассматриваемый трубопровод как A-> B-> C-> D, который пересчитывается для каждого пользовательского преобразования, а инициированное пользователем преобразование (может быть любым из вышеперечисленных), как T.

Меня беспокоит, следует ли делать T A-> B-> C-> D или A-> T B-> C-> D.

Спасибо за помощь.

+0

Следите за ответом pingul и моим комментарием. Обычно в методе 'reshape' вы вычисляете (и загружаете) матрицу проецирования и' glViewport'. Просмотреть матрицу вместо начала отображения 'display' и матрицы модели каждой модели в начале рендеринга i-й модели – elect

ответ

0

, как вы обычно идут от вершины координаты координаты экрана находится на

(1) vertex -> (2) model -> (3) world -> (4) view -> (5) screen 

Так иллюстрировать:

  1. Многоугольник координаты указать первоначально
  2. Может масштабировать/вращать/сдвига точки для создания вашей модели
  3. Вы размещаете свою модель в мире
  4. Вы помещаете свою камеру в мир (точнее, вы перемещаете мир в соответствии с вашим положением камеры). Здесь вы можете поставить матрицу lookAt.
  5. Вы проецировать его на экране

Как мы умножаем вправо, необходимо изменить порядок, когда мы пишем его в программе. Окончательное утверждение будет выглядеть следующим образом:

outPosition = screenProjection*worldToView*modelToWorld*polygonToModel*inPosition 

Итак, вы видите, будет ли использовать TA->B->C->D или A->TB->C->D будет генерировать два различных эффекта: первый будет похож на тот, который я на примере выше (т.е. T будет работать как polygonToModel), иначе он будет работать как преобразование modelToWorld. Обе работы, они дают разные результаты.

Обратите внимание, что все преобразования здесь 4 на 4 матрицы. Трансформации на шагах 2-4 могут быть идентичными матрицами (т. Е. Нет масштабирования/сдвига/вращения или чего-либо еще), однако для проекции вам нужно создать усечение. Вы можете создать это самостоятельно, используя что-то вроде объявления here, но может быть проще просто использовать 3D-математическую библиотеку для java.

+0

Лучшая модель (1) -> (2) world -> (3) view -> (4) screen' и 'outPosition = viewToClip * worldToView * modelToWorld * inPosition'. Предстоящая вершина на самом деле находится в пространстве модели * по определению * – elect

+0

@ выберите Я согласен, что обычно, как я его пишу. Я выбрал пример выше, поскольку он имеет такое же количество преобразований, что и в вопросе, и что он по-прежнему разумен. Например. Я считаю, что преобразование «polygonToModel» полезно: у вас может быть куб со сторонами длины 1 и решить, хотите ли вы его масштабировать - лучше добавить другое преобразование, чем переопределить свои точки. – pingul

+0

Масштабирование по-прежнему будет частью матрицы modelToWorld. – elect

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

  • Нет связанных вопросов^_^