Процедура Project()


Проекционная процедура Project() — «рабочая лошадка», от которой зависят все операции графического вывода. Она преобразует трехмерные координаты TTriple в плоские TPixel с использованием одноточечной перспективы и текущих размеров окна.

Фактически эта процедура проводит линию между двумя точками — текущей и точкой перспективы — и определяет, где эта линия пересекается с плоскостью экрана. Сложность листинга 8.3 обусловлена использованием вычислений с фиксированной точкой. (В основном это наследство, доставшееся программе FL3 от ее первых версий, появившихся в те дни, когда вычисления с плавающей точкой были очень медленными. С другой стороны, вычисления с фиксированной точкой сокращают размер базы данных вершин и позволяют разместить всю базу в одном сегменте данных.) Если отказаться от математики с фиксированной точкой, мы получим следующее:

function Project(const P: TTriple): TPixel; { Трехмерное преобразование точки } var Delta_Y: double; Tr, V: TFloatTriple; begin Tr := FloatTriple(P); V := FloatTriple(VanishingPoint); Ratio := Pt.Y / V.Y; Result.X := Round( DisplayWidth * ((V.X - Pt.X) * Ratio + Pt.X)); Result.Y := DisplayHeight - Round( DisplayHeight * ((V.Z - Pt.Z) * Ratio + Pt.Z)); end;

Процедура вычисляет отношение глубины точки к глубине точки перспективы и умножает его на разности координат этих точек по осям x и z. Поскольку координаты TTriple принадлежат интервалу 0…1, для получения экранных координат можно просто умножить спроектированные координаты на размер окна.



Содержание раздела