14.08.2011, 19:18
|
#1
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
3д модуль
Пытался сделать 3д графику, для удобства написал это. Библиотек не использует. Супер возможностей нет, модуль только проецирует точку на экран и выдаёт её координаты. Всё остальное на совести программиста:)
Значительная часть функций для работы с векторами, также управление перемещением и направлением камеры, масштабом изображения.
Описание:
Писалось в MP3.3, при компиляции в MP2.2 ошибок не выдаёт.
Функций много, но практически без всех можно обойтись.
Базовые:
function ToPoint(x,y,z)
возвращает точку (тип point) с координатами x,y,z
procedure SetCamPoint(p:point);
устанавливает координаты камеры
procedure SetCamTarget(p:point);
нацеливает камеру на точку p;
function PointToScreen(p:point):screenPoint;
выдаёт экранные координаты точки
Пример использования:
var sp:screenPoint;
...
SetCamPoint(ToPoint(10,10,0));
SetCamTerget(ToPoint(0,0,0));
...
sp:=pointToScreen(ToPoint(1,1,1));
...
if sp.visible then
plot(sp.x,sp.y);
тип данных - точка экрана. Возвращается функцией PointToScreen
visible=true если точка не находится позади камеры (примерно половина точек) ,но не факт что точка поместится на экран. (могут быть числа x,y вроде -10 или 700)
ScreenPoint=record
x,y:integer;
visible:boolean;
end;
Тип данных - точка в 3д пространстве, по совместительству и вектор из начала координат в эту точку
point=record
x,y,z:real;
end;
IntPoint=ScreenPoint;
какой-то глюк: Иногда при попытке использовать screenPoint компилятор выдаёт ошибку :( ,при использовании IntPoint всё норм
ОПЕРАЦИИ НАД ВЕТОРАМИ
создание точки, вектора
function ToPoint(x,y,z:real):point;
//скалярное произведение
function Scalar(p1,p2:point):real;
//сложение координат точек
function Plus(p1,p2:point):point;
//вычитание координат точек
function Minus(p1,p2:point):point;
//умножение числа на вектор
function KN(n:real;p:point):point;
//Возвращает длину вектора
function VectorLen(p:point):real;
//квадрат длины векторa
function VectorSQR(p:point):real;
//приведение вектора к длине L
function VectorToLen(p:point;L:real):point;
//ОПЕРАЦИИ НАД УГЛАМИ
приведение угла к диапазону -pi до pi
function AngleToPI(b:real):real;
//возвращает true если угол в промежутке от -pi до pi;
function AngleInPi(a:real):boolean;
//КАМЕРA И ОТРИСОВКA
выдаёт экранные координаты точки
function PointToScreen(p:point):screenPoint;
устанавливает камеру в точку p
procedure SetCamPoint(p:point);
возвращает координаты камеры
function GetCamPoint:point;
Двигает камеру в обычной системе отсчёта "p" в данном случае вектор перемещения
Procedure MoveCamPoint(p:point);
двигает камеру отноcительно системы отсчёта предыдущего положения камеры
x:вперёд-назад, y:вправо-влево, z:вверх-вниз
Procedure MoveCam(p:point);
//ориентирует камеру в направлении точки p;
procedure SetCamTarget(p:point);
//МАСШТАБ
при масштабе =1 угол в 45 градусов является отклонением от центра изображения на 1 пиксель.
Более-менее адекватно выглядит при масштабе 200-400, зависит от размера крана
возвращает масштаб
function GetScale:real;
устанавливает масштаб
procedure SetScale(r:real);
умножение масштаба на число
procedure ScaleMul(a:real);
//УГЛЫ НАКЛОНА КАМЕРЫ (hor - азимут, Vert - высота )
возвращает горизонтальный угол наклона камеры в радианах
function GetHor:real;
устанавливает горизонтальный угол наклона камеры
procedure SetHor(a:real);
увеличивает горизонтальный угол наклона на "а"
procedure AddHor(a:real);
возвращает вертикальный угол наклона камеры в радианах
function GetVert:real;
устанавливает вертикальный угол наклона камеры
procedure SetVert(a:real);
увеличивает вертикальный угол наклона на "а"
procedure AddVert(a:real);)
Советую использовать вместе с данной модификацией компилятора MP3.3 - появится функция рисования треугольников и возможность хранить цвет в одной переменной.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|