Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Удаление невидимых линий(точек) на объёмных телах   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
1-1127731906
Voffka
2005-09-26 14:51
2005.10.16
FreeLibrary


14-1127710725
Ega23
2005-09-26 08:58
2005.10.16
С днем рождения! 26 сентября


2-1127331630
highlander
2005-09-21 23:40
2005.10.16
Как правильно организовать поиск в таблице в приложении


8-1117084077
Hilbert
2005-05-26 09:07
2005.10.16
Графическое отображение учебного расписания


2-1127217436
ABS
2005-09-20 15:57
2005.10.16
кодировка