Z-буффер, Как им пользоваться? |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Z-буффер, Как им пользоваться? |
XaMMaX |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Вот надо отрисовать куб и что бы он отображался правильно тоесть задние части не видны =) Но не знаю как пользоваться z-буффером помогите пожалуйста!
|
Malice |
Сообщение
#2
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Для того чтобы отобразить куб, Z-буфер использовать необязательно, достаточно отрисовывать поверхности, начиная с самой дальней. В случае куба вообще можно рисовать только 3 передних, т.к. это максимум, что можно увидеть за раз. И вообще, раз кубик нужен - глянь сюда: http://forum.pascal.net.ru/index.php?showtopic=5854
Сообщение отредактировано: Malice - |
XaMMaX |
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Очень сложный для меня пример ещё и с ассемблером =( И всё же хотелось бы именно с z-буффером =)
достаточно отрисовывать поверхности, начиная с самой дальней. ----- А как мне узнать какая самая дальняя? Сообщение отредактировано: XaMMaX - |
Malice |
Сообщение
#4
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Очень сложный для меня пример ещё и с ассемблером =( И всё же хотелось бы именно с z-буффером =) Проще некуда Ассемблерная функция kp - замена стандартной KeyPressed, добавлена чтоб "Uses crt" не делать т.е. можно просто заменить. Цитата достаточно отрисовывать поверхности, начиная с самой дальней. ----- А как мне узнать какая самая дальняя? Отсортировать А с Z-буфером все равно не получится, либо придется писать свою процедуру FillPoly (и уже не с 2-мя координатами, а 3-мя) т.к. работает он в момент отрисовки. |
XaMMaX |
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Блин, а чё fillpoly только с массивами работает =( Мне нужно просто fillpoly(4,sx1,sy1,sx2,sy2,sx3,sy3,sx4,sy4);
Это возможно реализовать ? Кстатей вот программа нельзяли кусок кода для неё? Она загружает модель куба из файла и отрисовывает по четыре точки =) Прикрепленные файлы 3D.rar ( 887 байт ) Кол-во скачиваний: 224 |
volvo |
Сообщение
#6
|
Гость |
Цитата Мне нужно просто fillpoly(4,sx1,sy1,sx2,sy2,sx3,sy3,sx4,sy4); Ну, и в чем проблема? Про директиву Absolute слышал? var
sx1,sy1,sx2,sy2,sx3,sy3,sx4,sy4: integer;
arr: array[1 .. 4] of record X, Y: integer end absolute sx1; { <--- должно работать }
...
fillpoly(4, arr);
...
А чем массивы не нравятся? Что, по одной переменной обращаться удобнее? |
Malice |
Сообщение
#7
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
Блин, а чё fillpoly только с массивами работает =( Мне нужно просто fillpoly(4,sx1,sy1,sx2,sy2,sx3,sy3,sx4,sy4); Это возможно реализовать ? Это очень просто реализовать. Но если ты не можешь переписать все эти значения в массив, то зря ты взялся за 3д (и тем более з-буфер), начни с чего нибудь попроще.. |
XaMMaX |
Сообщение
#8
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Это очень просто реализовать. Но если ты не можешь переписать все эти значения в массив, то зря ты взялся за 3д (и тем более з-буфер)
----- Не впринципе я могу записать это в массив просто не хотелось код изменять =) начни с чего нибудь попроще.. ----- Всмысле 2д что ли? Или 3д по другому принципу? На Z-буффер я уже забил =) Или есть какие-то программи для подготовки создания 3д? 2volvo ладно надо попробывать прадо про директиву Absolute не слышал наверное должно быть стыдно =)Не очень понимаю код , но попробую разобраться =) |
XaMMaX |
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Ну вообщем закрашивать получилось теперь надо решить проблему невидимых линий и как-то отсортировать =) Как это сделать именно с этой программой??? Идеи есть?
|
XaMMaX |
Сообщение
#10
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
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,color: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;
begin
gd:=detect;initgraph(gd,gm,'C:\bp\bgi');
xan:=0.03; {сила поворота =) }
yan:=0.03;
zan:=0.03;
zoom:=50;
path:='cube.dat'; {загрузка файла}
assign(modelfile,path);
reset(modelfile);
readln(modelfile,i);
for i1:=1 to i do {складываем числа из файла в массивы с учётом того что мы будем рисовать по квадрату из 4 точек}
begin
readln(modelfile,modelx1[i1],modely1[i1],modelz1[i1],modelx2[i1],modely2[i1],mod
elz2[i1],
modelx3[i1],modely3[i1],modelz3[i1],modelx4[i1],modely4[i1],modelz4[i1]);
end;
repeat
setcolor(white);
for i1:=1 to i do {расчёт и отрисовка}
begin
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);
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;
color:=i1;
setfillstyle(1,color);
fillpoly(4,arr);
end;
delay(1000);
setcolor(black); {стирание}
for i1:=1 to i do
begin
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,black);
fillpoly(4,arr);
end;
until keypressed;
closegraph;
end.
Как здесь отсортировать? Мне кажется или придётся тут всё менять Плиз помогите мысли перестали поступать в мою голову =) Сообщение отредактировано: volvo - |
Coder_perm |
Сообщение
#11
|
Новичок Группа: Пользователи Сообщений: 19 Пол: Мужской Реальное имя: Антонио Репутация: 2 |
XaMMaX, Когда-то давным давно, когда ещё не было графических акселераторов, я этим всем увлекался... Пороюсь в архивал, выложу, что найду!
|
XaMMaX |
Сообщение
#12
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Спасибо, а то я сварганил, но чего-то не помjгло не капли =(
min:=1;
for i1:=1 to i-1 do
begin
sum1:=modelz1[min]+modelz2[min]+modelz3[min]+modelz4[min];
sum2:=modelz1[i+1]+modelz2[i+1]+modelz3[i+1]+modelz4[i+1];
if sum1<sum2 then
begin
modelz1[i+1]:=buf1;
modelz2[i+1]:=buf2;
modelz3[i+1]:=buf3;
modelz4[i+1]:=buf4;
buf1:=modelz1[min];
buf2:=modelz2[min];
buf3:=modelz3[min];
buf4:=modelz4[min];
min:=i+1;
end;
end;
Принцип такой: Я отрисовываю по 4 точки так что чтобы узнать какая сторона самая дальняя то я вычесляю сумму и сравниваю со следущими в массиве т.к. у меня всё отрисоввывается в порядке массива! Плиз хелп по чему не работает разьясните не могу понять вроде всё правильно !!! Ну, а если вдруг нужен весь код то я разместил исходник! Сообщение отредактировано: volvo - Прикрепленные файлы MY_3D_CO.PAS ( 3.16 килобайт ) Кол-во скачиваний: 277 |
XaMMaX |
Сообщение
#13
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Я вас прошу помогите в понедельник надо отдавать прогу!! Плиз что не так в сортировке??? Не могу понять плизз хелп!!
|
Mlc |
Сообщение
#14
|
Гость |
А в чем сокраментальный смысл вот этих строк:
Код modelz1[i+1]:=buf1; ... buf1:=modelz1[min]; ... ? Т.е. сначала координате Z присваивается неопределенное значение buf1, потом определяется buf1. Это во-первых, во-вторых раз уж меняешь местами Z координаты, то меняй и X,Y. |
Гость |
Сообщение
#15
|
Гость |
Блин какой я идиот =( Спасибо большое действительно идиотская ошибка =)
|
XaMMaX |
Сообщение
#16
|
Пионер Группа: Пользователи Сообщений: 85 Пол: Мужской Реальное имя: max Репутация: 0 |
Блин не помогает
min:=1;
repeat
for i1:=1 to i-1 do
begin
sum1:=modelz1[min]+modelz2[min]+modelz3[min]+modelz4[min];
sum2:=modelz1[i+1]+modelz2[i+1]+modelz3[i+1]+modelz4[i+1];
if sum1<sum2 then
begin
buf1:=modelz1[i+1];
buf2:=modelz2[i+1];
buf3:=modelz3[i+1];
buf4:=modelz4[i+1];
modelz1[i+1]:=modelz1[min];
modelz2[i+1]:=modelz2[min];
modelz3[i+1]:=modelz3[min];
modelz4[i+1]:=modelz4[min];
modelz1[min]:=buf1;
modelz2[min]:=buf2;
modelz3[min]:=buf3;
modelz4[min]:=buf4;
buf1:=modelx1[i+1];
buf2:=modelx2[i+1];
buf3:=modelx3[i+1];
buf4:=modelx4[i+1];
modelx1[i+1]:=modelx1[min];
modelx2[i+1]:=modelx2[min];
modelx3[i+1]:=modelx3[min];
modelx4[i+1]:=modelx4[min];
modelx1[min]:=buf1;
modelx2[min]:=buf2;
modelx3[min]:=buf3;
modelx4[min]:=buf4;
buf1:=modely1[i+1];
buf2:=modely2[i+1];
buf3:=modely3[i+1];
buf4:=modely4[i+1];
modely1[i+1]:=modely1[min];
modely2[i+1]:=modely2[min];
modely3[i+1]:=modely3[min];
modely4[i+1]:=modely4[min];
modely1[min]:=buf1;
modely2[min]:=buf2;
modely3[min]:=buf3;
modely4[min]:=buf4;
min:=i+1;
end;
end;
Чё то мне кажется что условия никогда не выполняется, но почему? Плизз понедельник уже близиться, а ещё не готово!! |
Гость |
Сообщение
#17
|
Гость |
Ну кто-нибудь завтра уже понедельник =( Плизз помогите!
|
Malice |
Сообщение
#18
|
Профи Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: 20 |
1. сортировать по удаленности грани нужно только _после_ их поворота, а не перед. Т.е.делать надо в 3 цикла : повернули, отсортировали, вывели. Выводить можно будет с 4-той грани по 6-ю - меньше моргать будет.
2. в процедуре calc напутал с углами - проверь (будет незаметно при одинаковых xan, yan, zan) 3. вместо перерисовки черным поставь просто Cleardevice; 4. И вообще, поворачивая фигуру ты новые координаты записываещь в тот же массив, т.е. первоначальной фигуры уже нигде нет, накапливаются ошибки и фигура со временем исказится, захочешь добавить перспективу - не выйдет. Лучше повернутую в другое место. |
Гость |
Сообщение
#19
|
Гость |
Спасибо щас попробую =) Если чего отпишусь =)
|
Гость |
Сообщение
#20
|
Гость |
Блин чё-то вроде сортировку сворганил онаработает не идеально вот проверьте плиз в компиляторе
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,color: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;
buf1,buf2,buf3,buf4:real;
sum1,sum2:integer;
j1,j2,j3,j4,j1a,j2a,j3a,j4a:integer;
begin
gd:=detect;initgraph(gd,gm,'C:\bp\bgi');
xan:=0.01;
yan:=0.01;
zan:=0.01;
zoom:=50;
path:='cube.dat';
assign(modelfile,path);
reset(modelfile);
readln(modelfile,i);
for i1:=1 to i do
begin
readln(modelfile,modelx1[i1],modely1[i1],modelz1[i1],modelx2[i1],modely2[i1],mod
elz2[i1],
modelx3[i1],modely3[i1],modelz3[i1],modelx4[i1],modely4[i1],modelz4[i1]);
end;
repeat
setcolor(white);
for i1:=1 to i do
begin
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:=1 to i-1 do
for i1:=1 to i-1 do
begin
j1:=round(modelz1[i1]);
j2:=round(modelz2[i1]);
j3:=round(modelz3[i1]);
j4:=round(modelz4[i1]);
sum1:=j1+j2+j3+j4;
j1a:=round(modelz1[i1+1]);
j2a:=round(modelz2[i1+1]);
j3a:=round(modelz3[i1+1]);
j4a:=round(modelz4[i1+1]);
sum2:=j1a+j2a+j3a+j4a;
if sum1<sum2 then
begin
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;
end;
end;
for i1:=4 to i do
begin
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;
color:=i1;
setfillstyle(1,color);
fillpoly(4,arr);
end;
delay(5000);
cleardevice;
until keypressed;
closegraph;
end.
Сами видете как рисуется =( Есть предложение?? Плизз срочно!! |
Текстовая версия | 6.01.2025 21:22 |