Тем самым горизонтальные поверхности следует рисовать на экране горизонтальными линиями на экране.
Рассмотрим упрощенную задачу: наблюдатель находится па высоте h над плоскостью с нанесенной на нее текстурой, и больше ничего на плоскости нет. Пусть направление взгляда наблюдателя составляет угол <р с осью параметра и (рис. 13.10).
Компьютерная графика. Полигональные модели Прообразом произвольной строки экрана па плоскости будет отрезок прямой, чем угол этой прямой с направлением оси и будет ср + я/2.
Найдем расстояние вдоль плоскости Оху до этой прямой и ближайшую точку на
где к - номер строки от конца экрана, а 8 - шаг по вертикали между строками экрана.
Ближайшая точка находится из соотношений х = х* + d cos <р, У - У* + d sin (p.
Коэффициент сжатия пропорционален расстоянию, т. е. равен Cd, где С - некоторый масштабирующий коэффициент.
Для построения строки необходимо найти индекс текстуры (и, v) для какой-либо точки данной строки и шаги для обоих индексов при переходе к соседнему пикселу строки. Индекс легко находится из формулы и = [х * picWidth] % picWidth
v = [у * picHeight] % picHeight
Шаги, вдоль индексов текстуры определяются из следующих соотношений Аи - Cd sin <р, Av - -Cd cos ср.
Ниже приводится вещественная версия программы, осуществляющая текс рование горизонтальной плоскости.
2) // File Floor.cpp
#include <bios.h>
#include <dos.h>
#include <math.h>
#include <mem.h>
#include <stdio.h>
#include <time.h>
include "bmp.h"
#define SKY_COLOR 3
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define H 100.0
#define DELTA 1.0 // note : DELTA * NumLines == H
#define С 0.01
#define DO 100.0
13. Элементы виртуальной реальное
long totalFrames = 01;
BMPImage* pic = new BMPImage ("FLOOR.BMP" );
char far * screenPtr = (char far *) MK_FP ( OxAOOO, 0 );