Graphics & Media Lab. >> Курсы >> Курс Шикина 2000г.
ПРИМЕР - ШАГ 2

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

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

Соответствующий фрагмент кода приводится ниже.

int Cube :: isFrontFacing ( int facetNo , const Camera& camera ) const { return ((vertices [facets [facetNo].v [0]] - camera.pos ) & facets [facetNo].n) < 0; } void Cube :: drawWireframe () { Point p [8]; // project vertices for ( int i = 0; i < 8; i++ ) camera.project ( vertices [i], p [i] ); computeNormals (); // draw all faces setcolor ( WHITE ); for ( i = 0; i < 12; i++ ) if ( isFrontFacing ( edges [i].f1, camera ) || isFrontFacing ( edges [i].f2, camera ) ) line ( p [edges [i].v1].x, p [edges [i].v1].y, p [edges [i].v2].x, p [edges [i].v2].y ); } Все исходные тексты можно взять здесь.

<<Шаг 1 - Проволочная модель Шаг 3 - Закраска граней>>

Graphics & Media Lab. >> Библиотека | Курсы | Графикон

Hosted by Graphics & Media Lab.
http://graphics.cs.msu.su
lab_logo
mailto:Laboratory
Last modified: 24-Aug-2001