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

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

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

10. Удаление невидимых линий и поверхностей

// File cube.cpp #include <Bios.h> #include <Graphics.h> #include "VectorSD.h" #include "Matrix.h"
struct Point
int x, y;
/1
struct Edge
int v1, v2; // vertices indexes
int f1,f2; //facet's indexes
/1
struct Facet
int v [4]; // vertices indexes Vector n; // normal int flags;
/1
class Cube
public:
Vector3D vertex [8]; Edge edge [12]; Facet facet [6];
Cube ();
void initEdge (int i, int v1, int v2, int f 1, int f2 ) {
edge [i].v1 = v1; edge [i].v2 = v2; edge [i].f1 =f1; edge [i].f2 = f2;
};
void initFacet (int i, int v1, int v2, int v3, int v4 ) {
facet [i].v[0] = v1; facet [i].v [1] = v2; facet [i].v [2] = v3; facet [ij.v [3] = v4;
};
void computeNormals ();
int isFrontFacing (int i, Vector& v )
{
return (( vertex [facet [i].v [0]] - v ) & facet [i].n ) < 0;
}
void apply ( Matrix& ); void draw ();
};

Компьютерная графика. Полигональные модели

llllllllllllllllllllllllllllllllllllllllllllllllllllllinilllllll
Matrix prj (1 ); // projection matrix
Vector eye ( 0 ); // observer loc
Vector light ( 0, 0.7, 0.7 );
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHIIHHIIIIIIIIII

⇐ Предыдущая| |Следующая ⇒