Луч считается входящим в соответствующее полупространство, если начало луча не лежит в этом полупространстве, и выходящим в противном случае.

Рассмотрим сначала простейший случай тумана с постоянной плотностью р. Тогда интеграл от t' до г'равен (f'-f')-p .

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

class Fog : public Object {
private:
Vector3D color; // fog color
float density; // fog density
int numPlanes;
Plane * plane [MAX_FOG_PLANES]; // fog planes public:
Fog ( const char * theName, Plane * thePlane,
const Vector3D& theColor, float theDensity ) : Object ( theName )
3

Рис. 12.3

Добавляем эффекты

{
color = theColor;
numPlanes = 1; plane [0] = thePlane; density = theDensity; metaClass = Sclasslnstance,-
}
-Fog ();
bool addFogPlane ( Plane * thePlane );
virtual void drawFogPoly ( Views view,
const Vector3DS pos,
const Frustrums viewFrustrum,
const Polygon3DS poly )
const;
virtual float getOpacity ( const Vector3DS from,
const Vector3DS to. Plane * clipPlane ) const;
bool traceRay ( const RayS ray, floats tl,
floats t2 ) const;
Vector4D getBlendColor ( const Vector3DS rrom,
const Vector3DS to. Plane * clipPlane ) const
{
return Vector4D ( color.x, color.y, color.z,
getOpacity ( from, to, clipPlane ) );
}
static MetaClass classlnstance;
} ;

В этом классе область, заполненная туманом, представляется как пересечение полупространств. Добавить очередную плоскость можно при помощи метода addFogPlane.

Метод traceRay определяет отрезок луча, лежащий в области тумана (находит пересечение луча со всеми положительными полупространствами).

Для определения интеграла от плотности тумана служит метод getOpacity, который может переопределяться в подклассах.

Метод drawFogPoly выводит с соответствующим режимом наложения многоугольник, имитирующий затуманивание.

Используя метод ^еЮрас-Иу, можно легко найти значения затенения для любой точки многоугольника. Тем самым легко построить затеняющий многоугольник, однако такой простой подход обладает определенным недостатком. Рассмотрим ситуацию, изображенную на рис. 12.4.


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