2013-02-26 2 views
1

Я пытаюсь построить 3D-точки на 2D-поверхности (в настоящее время я работаю с SDL.NET в качестве своего «игрового движка»). Поверхность будет размером 800x400 пикселей, а 3d-координаты будут варьироваться от -4000 до 4000. Мой вид всегда будет сверху вниз, и движение камеры вообще не будет. Может ли кто-нибудь предоставить некоторый собственный C#, псевдокод или простое объяснение для преобразования координат в трехмерном пространстве на двумерную поверхность?Преобразование 3d в 2d

Между тем Im заказе this book которые люди говорят мне, что это будет решать много моих математических недостатков .... мы надеемся :)

+0

Ваши 3D-координаты всего -4000 - +4000? Вы хотите показать всю карту на сетке 800x400 или это движущееся окно? –

+0

Я только что прошел преобразование трехмерной координаты на двумерную поверхность и хотел бы поделиться своим подходом, поскольку он значительно отличается от ответов ниже. Мои математические навыки не самые лучшие, поэтому я считаю, что мое решение, хотя и упрощенное, может помочь кому-то понять это преобразование (используя математику 10-го класса). – CramerTV

ответ

8

Примечание: Это большая стена текста, и я полностью тускнею много важных вещи - но мое намерение здесь только краткий обзор ... надеюсь, некоторые из терминов/понятий здесь приведут вас для лучшего 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 соответственно таким образом, чтобы «иметь смысл» на наших глазах.

+0

Ничего себе, спасибо, большое спасибо, я действительно лучше понимаю теорию Теперь. Я начну строить свой «конвертер» и отправлю код здесь позже сегодня, чтобы узнать, правильно ли я сделал, приветствует m8! –

+1

Это заслуживает большего внимания! – Nissim

2

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

enter image description here

где представляет 3D-очки и б представляет ваши 2D точки результата. вектор s произвольный масштабный коэффициент, и с произвольное смещение

Вот еще один пост похож на это хороший ответ:

Basic render 3D perspective projection onto 2D screen with camera (without opengl)

Вот некоторая дополнительная информация

http://en.wikipedia.org/wiki/3D_projection

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

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