Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru





 в самое начало


demo.design
3D programming FAQ



УДАЛЕНИЕ НЕВИДИМЫХ ЧАСТЕЙ
3.4. Порталы

Этот метод предназначен для т.н. indoor environments - в буквальном переводе "комнатная среда"; это как бы внутренность какого-то здания. В качестве примера могут служить Doom, Quake.

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

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

Как обычно, кусок кода для уяснения:

// ...
void drawRoom(int roomID, polygon *clipArea) {
  int i;

  for (i = 0; i < rooms[roomID].numFaces; i++)
    drawFace(&rooms[roomID].face[i], clipArea);
}

void drawFace(polygon *face, polygon *clipArea) {
  polygon *newClipArea;

  if (face->isPortal) {
    if (isVisible(face, clipArea) {
      newClipArea = clipPolygon(face, clipArea);
      drawRoom(face->destinationRoom, newClipArea);
    }
  } else drawClippedPolygon(face, clipArea);
}

// ...

drawRoom(currentRoom, fullScreen);

// ...

Здесь функция isVisible(face, clipArea) возвращает false, если грань face и область отсечения clipArea не пересекаются; функция clipPolygon возвращает пересечение полигонов face и clipArea (то есть отсекает face в clipArea и наоборот); fullScreen - полигон размером с экран (или любую нужную область отрисовки).

В природе есть Alpha 2 - готовый engine, использующий порталы и написанный на TMT Pascal, причем, что приятно, доступный в исходниках. Скачать его когда-то было можно с http://www.geocities.com/CapeCanaveral/5402. Есть, впрочем, надежда, что найти этот engine особых проблем не составит.

Осталось упомянуть, что несмотря на то, что в изложенной форме метод и требует возможности отрисовки произвольной грани, отсеченной в произвольную грань, можно обойтись и отсечением по bounding box проекции портала.



 в самое начало


demo.design
3D programming FAQ














helloworld.ru © 2001-2021
Все права защищены