Примечание: Это большая стена текста, и я полностью тускнею много важных вещи - но мое намерение здесь только краткий обзор ... надеюсь, некоторые из терминов/понятий здесь приведут вас для лучшего Googling для соответствующих кусков в Интернете.
Это помогает, если вы гуляете ваш путь через «Жизнь как точка»:
Здесь мы, миленький 3-мерная точка:
var happyPoint = new Point(0, 0, 0);
А вот его приятель, определенный в отношение к своему другу:
var friendlyPoint = new Point(1, 0, 0);
в настоящем время, давайте называть эти две точек нашей «моделью» - мы будем использовать термин «пространство модели», чтобы говорить о точках в - единственная трехмерная структура (например, дом, монстр и т. Д.).
Модели не живут в вакууме, однако ... обычно проще отделить «пространство модели» и «пространство мира», чтобы упростить настройку модели (в противном случае все ваши модели должны быть в такой же масштаб, иметь ту же ориентацию и т. д. и т. д., а также пытаться работать над ними в 3d-моделировании невозможно было бы невозможно)
Итак, мы определим «Мировое преобразование» для нашей «Модели» (ok , 2 балла - хромая модель, но модель остается).
Что такое «Всемирное преобразование»? Проще говоря:
- Мир преобразования
W = T X R X S
, где
- T = перевод - то есть, сдвинув ее по осям X, Y или Z осей
- R = вращение - поворот модели по отношению к оси
- S = масштабирования - изменение размеров модели (сохраняя все относительные точки в пределах) вдоль оси
Мы возьмём простой здесь, и просто определить наш мир преобразования как идентичности матрицы - в основном, это означает, что мы не хотим, чтобы это перемещение, вращение, или масштаб:
world = [
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
];
Я настоятельно рекомендую вам расчесывать математику Matrix, особенно операции умножения и Vector-> Matrix, используя ее. ВСЕ ВРЕМЯ СЪЕМКИ в 3D-графике.
Так ловко пропустив фактическое умножение матрицы, я просто скажу вам, что умножение нашего «мирового преобразования» и наших точек модели снова заканчивается нашими точками модели (хотя в этом веселом новом четырехмерном векторном представлении, которые я не буду касаться здесь).
Итак, у нас есть свои баллы, и мы абсолютно разместили их в «пространстве» ... теперь что?
Ну, с чего мы его смотрим? Это приводит к понятию View Transformations
или Camera Projection
- в основном, это просто другая матрица умножения - наблюдать:
Say у нас есть точка X, в ... о, (4 2) или так:
|
|
|
|
| X
|
------------------------
С точки зрения источника (0 0), X является (4 2) - но скажем, мы отложили нашу камеру вправо?
|
|
|
|
| X >-camera
|
------------------------
Что такое «позиция» X относительно камеры? Возможно, что-то ближе к (0 9) или (9 0), в зависимости от того, какими являются ваши «вверх» и «правильные» направления. Это то, что представляют преобразования: - сопоставление одного набора трехмерных точек другому набору трехмерных точек, так что они «правильны» с точки зрения наблюдателя. В вашем случае с фиксированной камерой сверху вниз ваш наблюдатель будет фиксированным положением в небе, и все модели будут соответствующим образом преобразованы.
Так что давайте проведем!
К сожалению, наш экран не является 3D (пока), поэтому сначала нам нужно «проецировать» эту точку на двумерную поверхность. Проекция ...хорошо, его в основном отображение, которое выглядит следующим образом:
(x, y, z) => (x, y)
Число возможных проекций почти бесконечное, например, мы могли бы просто перенести над X
и Y
координатами Z
:
func(x, y, z) => new point2d(x + z, y + z);
Обычно вы хотите, чтобы эта проекция имитировала проецирование человеческой сетчатки при просмотре 3D-сцен, поэтому мы приводим концепции View Projection. Существует несколько различных проекций вида, таких как Ортографические, Определенные YawPitchRoll и Перспективные/FOV-определенные; каждый из них имеет пару ключевых бит данных, которые необходимо правильно построить проекции.
Перспектива/FOV проекция на основе, например, необходимо:
- Положение вашего «глазного яблока» (то есть, экран)
- Как далеко вдаль ваш «зрачка» способен фокусировка («плоская плоскость отсечения»)
- Ваше угловое поле зрения (т. е. вытяните руки, только по краям вашего периферийного зрения)
- Соотношение ширины и высоты для «объектива», (обычно ваше разрешение экрана)
После того, как вы получили эти цифры, вы создаете то, что называется «ограничивающая усеченный», который выглядит как пирамида с вершиной отрубил:
\-----------------/
\ /
\ /
\ /
\ /
\-------/
Или спереди:
___________________
| _____________ |
| | | |
| | | |
| | | |
| | | |
| | | |
| |_____________| |
|___________________|
Я не буду делать вычисление матрицы здесь, так что это все хорошо определенный в другом месте - в самом деле, большинство библиотек имеют вспомогательные методы, которые будут генерировать соответствующие матрицы для вас - но вот примерно как это работает:
Допустим, что ваш счастливый маленькая точка лежит в этой усеченной:
\-----------------/
\ /
\ o<-pt /
\ /
\ /
\-------/
___________________
| _____________ |
| | | |
| | | |
|o | | |
|^---- pt | |
| | | |
| |_____________| |
|___________________|
Обратите внимание, что это путь в сторону, до сих пор, что это из «вблизи плоскости отсечения» прямоугольник - Что бы это выглядело, как если бы вы " заглянул в «меньший конец пирамиды?
Многое, как смотреть в призме (или линзы), точка будет «изогнутый» в поле зрения:
___________________
| _____________ |
| | | |
| | | |
|>>>o <- pt is | |
| | shifted | |
| | | |
| |_____________| |
|___________________|
Другими словами, если у вас есть яркий свет за усеченного, где будут ли тени от ваших очков «отлиты» от ближнего отсечения? (меньший прямоугольник). Это все проекция - это отображение одной точки в другую, в этом случае удаление компонента Z и изменение X и Y соответственно таким образом, чтобы «иметь смысл» на наших глазах.
Ваши 3D-координаты всего -4000 - +4000? Вы хотите показать всю карту на сетке 800x400 или это движущееся окно? –
Я только что прошел преобразование трехмерной координаты на двумерную поверхность и хотел бы поделиться своим подходом, поскольку он значительно отличается от ответов ниже. Мои математические навыки не самые лучшие, поэтому я считаю, что мое решение, хотя и упрощенное, может помочь кому-то понять это преобразование (используя математику 10-го класса). – CramerTV