Форум: "Media";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизУдаление невидимых линий(точек) на объёмных телах Найти похожие ветки
← →
scrazy © (2005-05-22 15:01) [0]Одним словом надо алгоритм, типо Z-буфера, но реализованный, на трех мерном изображении, нужно что бы фигура поворачивалась вокруг OX, OY, OZ. и задние линии удалялись...
мне кажется там нужно будет ещё один алгоритм перевода 3-х мерки в 2-х мерку...
Помогите пожалуйста!!!
← →
XProger © (2005-05-22 15:20) [1]Алгоритм художника + Face Culling
← →
scrazy © (2005-05-22 16:05) [2]Что-что...
Что такое???
← →
XProger © (2005-05-22 16:37) [3]Объект состояит из полигонов (видимиых или нет - тебе решать)
Алгоритм художника предназначен для ускорения более или менее правильного вывода полигонов, не прибегая при этом к использованию Z-Buffer"а. Суть состоит в том, что рисовать будешь от дальних полигонов к ближним.
Face Culling предназначен для отсечения граней которые отвёрнуты от наблюдателя. По каждому полигону можно построить плоскость. Каждая плоскость делит пространство на 2 полупространства. Суть в том, что если нормаль к полигону отвёртнута от наблюдателя - полигон не рисуется.
http://algolist.manual.ru/graphics/delinvis.php
← →
XProger © (2005-05-22 16:38) [4]Поправка: "Face Culling предназначен для отсечения полигонов"
← →
scrazy © (2005-05-22 19:35) [5]Спасибо!!!
Я посмотрю, если вопросы будут, то я задам...
← →
scrazy © (2005-05-23 17:45) [6]Там так много алгоритмов, а этих нет, которые вы мне написали наверху....
← →
XProger © (2005-05-23 19:55) [7]А кто сказал что всего 2 алгоритма на свете?
← →
scrazy © (2005-05-25 19:57) [8]Я сделал!!!
Кому надо!!???
Берите!!!
{$N+}
Program ProsmotrSurf;
{Программа просмотра смоделированной яркостной поверхности объекта}
uses Graph;
const Tochn=0.0001; KolP=250; kolSv=255; Eps=0.05;
var GrDr,Gr,Gd,x0,y0,L,H,i,j,k,Sv:integer;
NomX,NomY,TipPov:integer;
KorXSv,KorYSv,KorZSv,
KorXKam,KorYKam,KorZKam,
KorXZen,KorYZen,KorZZen:real;
KorX,KorY,KorZ,NorX,NorY,NorZ,EMods,RSv:real;
n,ed,ez,MaxEMS,MaxESurf,kmx,kmy,ky,kx,rad:real;
St:string;
ESf:array[1..KolP,1..KolP] of byte;
{###############################################################}
{Вычисление косинуса угла между векторами}
{s1,s2,s3,n1,n2,n3 проекции этих векторов на оси OX,OY,OZ соответственно}
function CosMegVect(s1,s2,s3,n1,n2,n3:real):real;
begin
CosMegVect:=(s1*n1+s2*n2+s3*n3)/SQRT((SQR(s1)+SQR(s2)+SQR(s3))*(SQR(n1)+SQR(n2)+SQR(n3)));
end;
{###############################################################}
{Расчет CosZer-косинуса угла зеркальности
n1,n2,n3-проекции нормали к поверхности соответственно на оси OX,OY,OZ
нормаль внешняя,
s1,s2,s3-проекции вектора,направленного из точки поверхности на источник света,
r1,r2,r3-проекции вектора, направленного из точки поверхности на приемник света}
function CosZer(n1,n2,n3,s1,s2,s3,r1,r2,r3:real):real;
var q:real;
begin
q:=(s1*n1+s2*n2+s3*n3)/(SQR(n1)+SQR(n2)+SQR(n3));
CosZer:=(r1*(2*n1*q-s1)+r2*(2*n2*q-s2)+r3*(2*n3*q-s3))/SQRT((SQR(r1)+SQR(r2)+SQR(r3))*(SQR(2*n1*q-s1)+SQR(2*n2*q-s2)+
SQR(2*n3*q-s3)));
end;
{###############################################################}
{Vozvedenie chisla X v N-uy stepen}
function Step(x,n:real):real;
begin
Step:=exp(n*Ln(x));
end;
{###############################################################}
{определение яркости на поверхности в зависимости от углов и освещенности}
{ESurf-освещенность точки поверхности ESurf=[0..1]
ca-косинус угла между внешней нормалью к поверхности и направлением на
источник,
cb-косинус угла между направлением на приемник света и зеркально отраженным
лучом,
n-показатель ширины диаграммы зеркального отражения n=[1..200],
cg- косинус угла между внешней нормалью к поверхности и направлением
вертикально вверх (в зенит неба),
d-коэффициент яркости поверхности (диффузионные свойства)a=[0..1],
r-коффициент зеркального отражения поверхности r=[0..1],
ed-относительный диапазон освещенности поверхности,обладающей только
диффузионными свойствами(a=1),
ez- относительный диапазон освещенности поверхности,обладающей только
зеркальными свойствами(r=1)
et-относительный диапазон освещенности в тени,
t-признак освещенности точки поверхности t=1-на свету,t=0-в тени}
function ESurf(ca,cb,n,cg,d,z,ed,ez,et,t:real):real;
var SumE:real;
kol:byte;
begin
SumE:=ed+ez+et;
If (ABS(SumE-1)>Eps) and (ABS(SumE)>Eps) then
begin
ed:=ed/SumE;
ez:=ez/SumE;
et:=et/SumE;
end;
If cb>Eps then ESurf:=(t*ez*z*Step(cb,n)+d*et*0.5*(1+cg)+ed*ca*d*t)
else ESurf:=d*et*0.5*(1+cg)+ed*ca*d*t;
end;
{##############################################################}
procedure Init;
begin
x0:=Round(GetMaxX*0.3);
y0:=Round(GetMaxY*0.8);
L:=Round(GetMaxX*0.5);
H:=Round(GetMaxY*0.5);
kmx:=L/KolP;
kmy:=H/KolP;
RecTangle(0,0,GetMaxX,GetMaxY);
end;
{##############################################################}
procedure PrisvModKof;
begin
{координаты источника освещения}
KorXSv:=2000;
KorYSv:=2000;
KorZSv:=2000;
{координаты положения камеры}
KorXKam:=0;
KorYKam:=0;
KorZKam:=1700;
{координаты зенита}
KorXZen:=0;
KorYZen:=0;
KorZZen:=KorZKam;
n:=2.3;
ed:=0.42;
ez:=1-ed;
MaxESurf:=230;
MaxEMS:=0.97;
end;
{##############################################################}
procedure VivodImage;
begin
for i:=1 to KolP do
for j:=1 to KolP do
PutPixel(x0+i,y0-j,ESf[i,j]);
end;
{##############################################################}
function OpredEpoNorm(RNorX,RNorY,RNorZ:real):real;
var ca,cb:real;
begin
ca:=CosMegVect(RNorX,RNorY,RNorZ,KorXSv,KorYSv,KorZSv);
cb:=CosZer(RNorX,RNorY,RNorZ,KorXSv,KorYSv,KorZSv,KorXKam,KorYKam,KorZKam);
ez:=1-ed;
If cb>Eps then OpredEpoNorm:=ed*ca+ez*Step(cb,n)
else OpredEpoNorm:=ed*ca;
end;
{##############################################################}
procedure Vizual_Shar;
var XOSf,YOSf,RadShar:real;
begin
XOSf:=127;
YOSf:=127;
RadShar:=80;
for NomY:=1 to KolP do
for NomX:=1 to KolP do
begin
kx:=NomX;
ky:=NomY;
KorX:=kx-XOSf;
KorY:=ky-XOSf;
Rad:=SQRT(SQR(kx-XOSf)+SQR(ky-YOSf));
If Rad>=RadShar then EModS:=0
else begin
KorZ:=SQRT(SQR(RadShar)-SQR(KorX)-SQR(KorY));
NorX:=KorX/RadShar;
NorY:=KorY/RadShar;
NorZ:=KorZ/RadShar;
EModS:=OpredEpoNorm(NorX,NorY,NorZ);
end;
RSv:=(MaxESurf*EModS)/MaxEMS;
If RSv<0 then RSv:=0;
ESf[NomX,NomY]:=Round(RSv);
end;
VivodImage;
end;
{####################### ТЕЛО ПРОГРАММЫ #######################}
begin
GrDr:=1;
case GrDr of
1: begin St:="SVGA256.BGI"; Gr:=2; end;
2: St:="Vesa16";
end;
If GrDr=0 then Gd:=Detect;
Gd:=InstallUserDriver(St,nil);
InitGraph(Gd,Gr,"C:\BP\BGI\");
i:=GraphResult;
If i<>0 then begin
WriteLn("Графика не инициализировалась: ",i);
Halt;
end;
ClearDevice;
if GrDr=1 then
for i:=0 to KolSv do
SetRGBPalette(i,i div 4,i div 4,i div 4);
Init;
PrisvModKof;
Vizual_Shar;
ReadLn;
end.
← →
scrazy © (2005-05-25 20:00) [9]Правдо на Паскале, но ни чего попрёт....
Главное Лабу сдал...
Всё пока...
Мож стыканёмся где, Земля Круглая...
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.045 c