3D компьютерная графика: двигайте, вращайте, заставляйте двигаться — преобразуйте свой виртуальный мир

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

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

Как только мы ‘ Превратив мир в компьютерную модель, мы, естественно, хотим видеть сцену, которую представляет модель. В прошлом месяце я описал один способ превратить модель во что-то, что можно было бы просмотреть на экране компьютера. Мы взяли данные модели, отбросили одно измерение (координата z, которая представляет глубину), масштабировали полученные данные (так, чтобы они поместились на экране компьютера) и нарисовали линию для каждого сегмента линии, описываемого данными. Эти шаги позволили нам создать то, что называется каркасным видом модели. Мы используем этот термин, потому что каждый объект на виде выглядит так, как будто он сделан только из проволоки, то есть видны только края.

Если вы ‘ Мне бы хотелось получить более подробную информацию по любой из этих тем, см. прошлый месяц в колонке «3D компьютерная графика», часть 1.

Изменение мира

Апплеты, которые я представил в прошлом месяце, не оправдали ожиданий. по ряду направлений. В частности, они были статичными. Хотя апплеты хорошо отображали объект, пользователь не мог взаимодействовать с объектом или с представлением объекта портала. Чтобы увидеть объект в другом положении или ориентации, пользователю придется вручную вычислить новые координаты углов (утомительный, не говоря уже о череде операций, подверженных ошибкам), а затем отредактировать и перекомпилировать исходный код. Конечно, этот подход предполагает, что обычный обычный пользователь действительно может выполнять эти задачи!

Как оказалось, многие из вещей, которые пользователь может захотеть сделать с формой (например, повернуть фигуру) легко описываются арифметически. И вы уже догадались — компьютеры великолепны в арифметике.

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

Положение по сравнению с ориентацией

Положение объекта — это его положение относительно некоторой точки ссылки (в нашем случае это начало координат). Если положение объекта относительно этой точки не изменилось, мы говорим, что объект не изменил положение. Рисунок 1 иллюстрирует то, что я имею в виду. Два квадрата в точке A имеют одинаковое положение, а два квадрата в точке B — нет.

Рис. 1. Положение в зависимости от ориентации

Ориентацию объекта сложнее определить, но легко проиллюстрировать. Так что позвольте мне обойтись без слов и показать вам, что такое ориентация. Еще раз взгляните на рис. 1. Два квадрата в точке B имеют одинаковую ориентацию, а два квадрата в точке A — нет. Это было просто, не так ли?

Теперь давайте рассмотрим два основных преобразования, с которыми компьютеры справляются хорошо: смещения и вращения.

Простейшее преобразование — преобразование

Перевод включает изменение положения объекта путем перемещения (или перемещения) каждой точки, составляющей объект, на одинаковую величину в одном и том же направлении. Поскольку каждая точка перемещается одинаково, перевод влияет на положение объекта, а не на его ориентацию.

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

Рисунок 2: Перевод объекта

Как вы, наверное, догадались, перевод очков — это именно та вещь, в которой компьютеры хороши. Нам просто нужно сказать им, как это сделать. Я чувствую, как некоторые из вас начинают извиваться. Для тех из вас, кому не по себе математика, дорога станет немного ухабистой. Но подождите, и мы вскоре вернемся к основам.

Мы можем представить координату следующим образом:

Когда мы переводим объект, мы перемещаем каждый координат этого объекта вдоль вектора, заданного следующим образом:

Результатом является новый набор координат, каждый из которых было перемещено на ту же величину в том же направлении:

Это было не так уж и плохо. И в довершение всего, вам даже не нужно создавать класс для выполнения такого перевода. Я создал его для вас. Translation.java сделает свое дело.

Покрутите мир — Вращение

Вращение предполагает изменение ориентации (и часто положение) объекта, перемещая каждую точку, составляющую объект, круговым движением.

Еще раз давайте сначала рассмотрим, что происходит в двух измерениях. На рисунке 3 изображен квадрат, вращающийся вокруг точки, представленной черной точкой. Обратите внимание на то, что положение объекта и его ориентация меняются.

Рис. 3. Вращение объекта

Пора снова погрузиться в математический режим, так что держитесь.

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

, где матрица M имеет следующий вид:

Константы a , b и c — компоненты единичного вектора, описывающие направление линии через начало координат.. Последняя константа, alpha (), определяет угол поворота.

Я снова предоставил класс, который выполняет такое вращение — Rotation.java.

Получение новой перспективы

Пока мы на этом, давайте немного украсим презентацию нашей модели, добавив

перспективы

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

Рассмотрим иллюстрацию на рисунке 4. Цветная полоса представляет экран компьютера (портал), а цветной круг представляет ваш глаз (черная точка представляет ваш зрачок). Представьте, что модель состоит из двух стрелок, одинаковых во всех отношениях, за исключением расстояния до портала (и вашего глаза). Все мы интуитивно знаем, что чем дальше от нас находится объект, тем меньше он кажется. На иллюстрации показано, как это происходит.

Рис. 4. Понимание перспективы

Добавление перспективы к виду — это просто вопрос масштабирования высоты (и ширины) каждого объекта на расстояние, на которое объект находится от экрана. В следующем уравнении x — это высота объекта, а z — его расстояние от экрана. Значение z ‘ — это расстояние, на котором глаз находится от экрана, а x’ — видимая высота объекта на экране:

Соединение с Java

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

Мы начнем с классов для моделирования мира, а затем посмотрим на классы, которые отображают и управляют моделью мира. .

Классы для моделирования мира

Несмотря на свою простоту, класс Scene очень важный строительный блок. Он обеспечивает строительные леса (опору), от которых зависят другие классы. Функционально он действует как контейнер для объектов, составляющих мир.

Сцена содержит фрагменты декораций. Есть два типа декораций. Самый простой вид — это простой список координат. Координаты задают начальную и конечную точки набора линейных сегментов, соединенных между собой. Он представлен экземпляром класса Vector , каждый элемент которого содержит координату. Это простое представление, хотя и прекрасно подходит для каркасных моделей, имеет ряд ограничений, наиболее важным из которых является отсутствие информации о поверхности (расположение, текстура, цвет и т. Д.). Интерфейс Scenery устраняет этот недостаток.

Интерфейс Scenery формирует основу для более сложных элементов декораций.. Фрагменты декораций, реализующие интерфейс Scenery , определяют целые поверхности. Примером является класс TriangleShape . Класс TriangleShape представляет плоские треугольные поверхности. Он предоставляет удобный строительный блок, который можно использовать для проектирования гораздо более сложных объектов.

Все декорации в конечном итоге представляют собой набор координатных данных. Класс Coordinates инкапсулирует данные координат.

Классы для отображения и управления моделью

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

Абстрактный класс Portal реализует базовые функции портала. Это подтип класса Canvas . Фактические порталы должны быть подклассами класса Portal и должны реализовывать любые функции, соответствующие их потребностям. Класс Port — один из таких классов.

Преобразования вызывают изменения в мире. Преобразование представлено экземпляром интерфейса Transformation . Я предоставил две реализации интерфейса Transformation : класс Translation и класс Rotation .

День на пляже

Если вы застряли со мной так долго, вы заслуживаете награды. Думаю, поездка на пляж в порядке. И с этим пляжем вам даже не нужно просить у начальника выходной. Ладно, ладно, это всего лишь виртуальный пляж, но, по крайней мере, песок не обожжет вам ноги! Прежде чем перевернуться, чтобы поджарить свою задницу, найдите время, чтобы внимательно изучить

код, строящий модель

.

Чтобы увидеть этот апплет, вам потребуется браузер с поддержкой Java.

Рисунок 5: Отдых на пляже

Чтобы увидеть этот апплет, вам потребуется браузер с поддержкой Java.

Но подождите. Это не все. Этот апплет интерактивный. Портал реагирует на клавиши со стрелками. Нажатие клавиши со стрелкой заставляет сцену вращаться вокруг центра портала в соответствующем направлении. Если удерживать клавишу Shift при нажатой клавише со стрелкой, сцена переместится в нужном направлении. Попробуйте.

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

Примечание для пользователей Windows 95: если клавиши со стрелками не работают, щелкните апплет и повторите попытку.. Кажется, что апплет иногда теряет фокус ввода (и, следовательно, больше не получает никаких событий клавиатуры). Щелчок по окну восстанавливает фокус.

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

Подробнее об этой теме

  • Для немного всего, что связано с 3D-графикой, см .:
    http://www.3dsite.com/3dsite/
  • Yahoo предоставляет удобный способ начать поиск 3D-графики темы:
    http://www.yahoo.com/Computers_and_Internet/Graphics/3D/
  • Если вам понравилась математика, вам понравится Центр геометрии:
    http://www.geom.umn.edu/
  • Вы можете загрузить эту статью и полный исходный код в виде сжатого файла tar jw-06-howto.tar.gz
  • Предыдущие статьи How-To Java
  • «3D компьютерная графика , Часть 1 «Моделируйте свой мир». С момента своего появления в качестве экзотической темы исследования в правительственных и университетских лабораториях виртуальная реальность становится мейнстримом корпоративной Америки — узнайте, как вы можете войти в этот элитный клуб.
  • «Когда статические изображения просто не подходят» — узнайте, как оживить свои апплеты и приложения. с анимированными изображениями.
  • «Как Java использует модель производитель/потребитель для обработки изображений — взгляд изнутри» — узнайте больше о мощной технике обработки изображений Java, а затем следуйте моим простым процедурам для создания собственных компонентов производителя и потребителя.
  • «Узнайте, как апплеты загружают сетевые изображения асинхронно» — вот подробный обзор того, как апплеты Java обрабатывают изображения в сетевой среде.
  • «Рисовать текст легко с тремя классами Java» — узнайте, как создать визуально привлекательный текст с помощью этого объяснения того, какие классы использовать и как они работают вместе.
  • «Изучение HotSpot, объектно-ориентированной программы для рисования» — узнайте, как части языка Java и библиотеки классов сочетаются друг с другом, изучив эту программу Java.
  • «Использование класса Graphics» — Внимательный взгляд на класс Graphics и предоставляемые им примитивы рисования, а также демонстрация его использования.
  • «Observer and Observable» — int переход к интерфейсу Observer и классу Observable с использованием архитектуры Модель/Представление/Контроллер в качестве руководства.
  • «Эффективный пользовательский интерфейс» — Пять способов улучшить внешний вид и эффективность вашего пользовательского интерфейса
  • «Java и обработка событий» — как события передаются компонентам пользовательского интерфейса, как создавать обработчики событий и т. д.
  • «Введение в AWT» — — Описание инструментария пользовательского интерфейса Java.

Этот рассказ «3D компьютерная графика: скользите, вращайте, заставляйте двигаться — трансформируйте ваш виртуальный мир» был первоначально опубликован JavaWorld .



Перетаскивание

Перетаскивание (также «перетаскивание «) — обычное действие, выполняемое в графическом интерфейсе пользователя. Он включает в себя перемещение курсора над объектом, его выбор и перемещение в новое место.

Если вы используете мышь, вы можете перетащить объект, щелкнув кнопкой мыши, чтобы выбрать объект, затем перемещая мышь, удерживая кнопку мыши нажатой. Это называется «перетаскивание» объекта. После того, как вы переместили объект в то место, куда хотите его поместить, вы можете поднять кнопку мыши, чтобы «уронить» объект в новом месте. Если вы используете устройство с сенсорным экраном, вы можете выбрать элемент, просто коснувшись его пальцем. (Некоторые интерфейсы могут потребовать от вас удерживать палец на объекте в течение секунды или двух, чтобы выбрать его.) Затем вы перетаскиваете объект, перемещая палец по экрану в то место, где вы хотите его разместить. Чтобы уронить объект, просто уберите палец с экрана.

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

ПРИМЕЧАНИЕ. Поскольку перетаскивание является простым и интуитивно понятный способ работы с объектами, программное обеспечение часто поддерживает возможность редактирования с помощью перетаскивания, что подразумевает простоту использования программного обеспечения.

Обновлено: 13 сентября 2011 г.

Оцените статью
logicle.ru
Добавить комментарий