Вообщем делал я прогу тут на форуме поворота 3д квадрата теперь я её расширел и всё мирцает что и понятно =) Слышал есть двойная буферация которая это устраняет , но не знаю что она из себя представляет =( Или другие способы!
Lapp
26.09.2006 23:34
Цитата(XaMMaX @ 26.09.2006 18:55)
Вообщем делал я прогу тут на форуме поворота 3д квадрата теперь я её расширел и всё мирцает что и понятно =) Слышал есть двойная буферация которая это устраняет , но не знаю что она из себя представляет =( Или другие способы!
Может, ты имеешь в виду переключение графических страниц? Рисуешь сначала в неактивную страницу, потом переключаешь страницы, делаешь изменения на неактивной, снова переключаешь..
мисс_граффити
26.09.2006 23:34
Делфи? Если да, то: 1)
Код
DoubleBuffered:=true
2) меняешь свойство формы AlphaBlend на true тоже иногда помогает.
program My_3D;
uses graph,crt;
const max=100;
procedure calc(var x,y,z,xt,yt,zt,xan,yan,zan:real);
begin
Yt:= Y * COS(Xan) - Z * SIN(Xan);
Zt:= Y * SIN(Xan) + Z * COS(Xan);
Y:= Yt;
Z:= Zt;
Xt:= X * COS(Yan) - Z * SIN(Xan);
Zt:= X * SIN(Yan) + Z * COS(Xan);
X:= Xt;
Z:= Zt;
Xt:= X * COS(Zan) - Y * SIN(Zan);
Yt:= X * SIN(Zan) + Y * COS(Zan);
X:= Xt;
Y:= Yt;
end;
var
gd,gm,i,i1,i2:integer;
modelx4,modely4,modelz4,modelx1,modely1,modelz1,modelx2,modely2,modelz2,modelx3,
modely3,modelz3:array[1..max] of real;
xan,yan,zan:real;
yt,xt,zt:real;
sx1,sx2,sx3,sx4,sy1,sy2,sy3,sy4,sz1,sz2,sz3,sz4:integer;
arr: array[1 .. 8] of integer;
modelfile:text;
path:string;
zoom:integer;
colorbuf:integer;
color:array[1..max] of integer;
buf1,buf2,buf3,buf4:real;
sum1,sum2:real;
j1,j2,j3,j4,j1a,j2a,j3a,j4a:real;
page:integer;
begin
writeln('Hello I am 3d engine =)');
writeln('Select model:');
readln(path);
writeln('Let the party begin!');
readln;
gd:=detect;initgraph(gd,gm,'C:\bp\bgi');
xan:=0.02;
yan:=0.02;
zan:=0.02;
zoom:=15;
{path:='cube.dat';}
assign(modelfile,path);
reset(modelfile);
readln(modelfile,i);
for i1:=1to i dobegin
readln(modelfile,color[i1],modelx1[i1],modely1[i1],modelz1[i1],modelx2[i1],model
y2[i1],modelz2[i1],
modelx3[i1],modely3[i1],modelz3[i1],modelx4[i1],modely4[i1],modelz4[i1]);
end;
page:=1;
repeat
setcolor(white);
for i1:=1to i dobegin
calc(modelx1[i1],modely1[i1],modelz1[i1],xt,yt,zt,xan,yan,zan);
calc(modelx2[i1],modely2[i1],modelz2[i1],xt,yt,zt,xan,yan,zan);
calc(modelx3[i1],modely3[i1],modelz3[i1],xt,yt,zt,xan,yan,zan);
calc(modelx4[i1],modely4[i1],modelz4[i1],xt,yt,zt,xan,yan,zan);
end;
for i1:=1to i-1dofor i2:=1to i-1dobegin
sum1:=modelz1[i1]+modelz2[i1]+modelz3[i1]+modelz4[i1];
sum2:=modelz1[i1+1]+modelz2[i1+1]+modelz3[i1+1]+modelz4[i1+1];
if sum1<sum2 thenbegin
buf1:=modelz1[i1+1];
buf2:=modelz2[i1+1];
buf3:=modelz3[i1+1];
buf4:=modelz4[i1+1];
modelz1[i1+1]:=modelz1[i1];
modelz2[i1+1]:=modelz2[i1];
modelz3[i1+1]:=modelz3[i1];
modelz4[i1+1]:=modelz4[i1];
modelz1[i1]:=buf1;
modelz2[i1]:=buf2;
modelz3[i1]:=buf3;
modelz4[i1]:=buf4;
buf1:=modelx1[i1+1];
buf2:=modelx2[i1+1];
buf3:=modelx3[i1+1];
buf4:=modelx4[i1+1];
modelx1[i1+1]:=modelx1[i1];
modelx2[i1+1]:=modelx2[i1];
modelx3[i1+1]:=modelx3[i1];
modelx4[i1+1]:=modelx4[i1];
modelx1[i1]:=buf1;
modelx2[i1]:=buf2;
modelx3[i1]:=buf3;
modelx4[i1]:=buf4;
buf1:=modely1[i1+1];
buf2:=modely2[i1+1];
buf3:=modely3[i1+1];
buf4:=modely4[i1+1];
modely1[i1+1]:=modely1[i1];
modely2[i1+1]:=modely2[i1];
modely3[i1+1]:=modely3[i1];
modely4[i1+1]:=modely4[i1];
modely1[i1]:=buf1;
modely2[i1]:=buf2;
modely3[i1]:=buf3;
modely4[i1]:=buf4;
colorbuf:=color[i1+1];
color[i1+1]:=color[i1];
color[i1]:=colorbuf;
end;
end;
setactivepage(page); <-- вот тут я это и делаю
if page=1then page:=2else page:=1;
setvisualpage(page);
for i1:=2to i dobegin
sx1:=round(zoom*modelx1[i1])+320;
sy1:=round(zoom*modely1[i1])+240;
sx2:=round(zoom*modelx2[i1])+320;
sy2:=round(zoom*modely2[i1])+240;
sx3:=round(zoom*modelx3[i1])+320;
sy3:=round(zoom*modely3[i1])+240;
sx4:=round(zoom*modelx4[i1])+320;
sy4:=round(zoom*modely4[i1])+240;
line(sx1,sy1,sx2,sy2);
line(sx2,sy2,sx3,sy3);
line(sx3,sy3,sx4,sy4);
line(sx4,sy4,sx1,sy1);
arr[1]:=sx1;
arr[2]:=sy1;
arr[3]:=sx2;
arr[4]:=sy2;
arr[5]:=sx3;
arr[6]:=sy3;
arr[7]:=sx4;
arr[8]:=sy4;
setfillstyle(1,color[i1]);
fillpoly(4,arr);
end;
delay(15000);
cleardevice;
until keypressed;
closegraph;
end.
Нуждаюсь в помощи =)
volvo
27.09.2006 19:38
Файл данных где?
XaMMaX
27.09.2006 19:48
Да совсем забыл вот он =)
volvo
27.09.2006 20:07
Цитата
интерестно почему не работает =(
Во-первых, потому, что у режима VGAHi 640*480, который наверняка у тебя устанавливается, просто НЕТ нескольких видеостраниц... Так что, придется делать:
Да спасибо это уже намного лучше, но уменя по прежнему мерцания =( хоть и не такие ужасные как были может у меня комп такой? volvo, какие твои результаты? Совершенно нет мерцания?
volvo
27.09.2006 21:14
Почему же нету... Есть немного
Я вот хочу попробовать обойтись вообще без переключения страниц, немного перестроив программу. Попробую - отпишусь...
XaMMaX
27.09.2006 21:17
Буду ооооочень признателен!
XaMMaX
28.09.2006 15:08
Volvo, расскажи как ты хочеш престроить программу? Теоритически.
volvo
28.09.2006 19:26
Теоретически - это не ко мне. Я не теоретик. И до тех пор, пока работающий результат не получен я ничего не выкладываю. Пока не получается полностью избавиться от мерцания, как получится (и если получится) - выложу...
XaMMaX
28.09.2006 19:41
Ну ладно жду =) Ну и если не получится ты всё равно отпишись!
Coder_perm
29.09.2006 7:20
Я избавился от мерцания рисованием в буфер, тоесть не в видео память, а в свой массив. А потом готовый массив копировал целиком в видео память, без стирания. Этот способ сложен тем, что необходимо писать свои функции рисования полигонов, а не пользоваться стандартным graph.tpu.
XaMMaX
30.09.2006 21:06
Не Это для меня сложно =( Надо чего попроще!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.