Vector3D tmp ( p - pos );
return Vector3D ( tmp & rightDir, tmp & upDir, tmp & viewDir );
}
// map vector from camera space to
// world space Vector3D mapToWorld ( const Vector3D& p ) const {
return pos + p.x * rightDir + p.y * upDir + + p.z * viewDir;
}
// map vector to screen space Vector3D mapToScreen ( const Vector3D& p ) const {
Vector3D scr ( transf * ( p - pos ) ) ;
scr /= scr.z; //do perspective transform
return scr;
}
bool isMirrored () const {
return mirrored;
}
float getFov () const {
return fov;
}
intgetWidth () const
{ ' return width;
}
А. В. Бореское. Графика трехмерной компьютерной игры
intgetHeight. () const {
return height;
}
void setEulerAngles ( float theYaw, float thePitch,
float theRoll ); void setViewSize ( int theWidth, int theHeight,
float theFov ); void setAspect ( float newAspect );
void setFov ( float newFovAngle );
void mirror ( const Plane& );
void transform ( const Transform3D& );
void buildHomogeneousMatrix ( float matrix [16] ) const;
static MetaClass classlnstance;
private:
void computeMatrix (); // compute vectors,
// transform matrix and // build viewing frustrum
} ;
Методы inViewingFrustrum служат для проверки попадания объекта в область видимости камеры (хотя бы частично).
Метод mapToScreen позволяет определить экранные координаты проекции данной точки при использовании камеры.
Метод порталов Рассмотрим теперь подробнее реализацию метода порталов. Базовым объектом в нем будет комната с находящимися внутри нее гранями. Комнаты состоят из выпуклых многоугольников и связаны между собой при помощи порталов.
Поскольку мы собираемся активно использовать графический ускоритель, то можно отказаться от требования обязательной выпуклости комнат, возникающего в классическом методе порталов - аппаратно-реализованный метод г-буфера все равно правильно обработает все грани внутри каждой комнаты. При этом пропадает необходимость в сильном разбиении исходной сцены для получения выпуклых комнат. Так, комнату, показанную на рис. 7.3, а, можно рассматривать как обычную комнату, в то время как классический метод порталов требует ее разбиения на выпуклые части, как это показано на рис. 7.3, б.