Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.049 c
14-1127301450
TUser
2005-09-21 15:17
2005.10.16
Лекция Вирта - фотографии


2-1126083422
Suriken
2005-09-07 12:57
2005.10.16
Титры


14-1127227371
wnew
2005-09-20 18:42
2005.10.16
Сеть из двух компьютеров + интернет


3-1125477648
Max Zyuzin
2005-08-31 12:40
2005.10.16
Помогите составить SQL запрос


2-1127064248
ArtemESC
2005-09-18 21:24
2005.10.16
WMF => BMP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский