forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Наше Open Source Software (http://forum.boolean.name/forumdisplay.php?f=132)
-   -   3д модуль (http://forum.boolean.name/showthread.php?t=15292)

Igor 14.08.2011 19:18

3д модуль
 
Вложений: 2
Пытался сделать 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 - появится функция рисования треугольников и возможность хранить цвет в одной переменной.


Часовой пояс GMT +4, время: 02:00.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot