Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2016, 00:38   #1
arti99
Новичок
Джуниор
 
Регистрация: 04.11.2016
Сообщений: 4
По умолчанию Алгоритм Z буфера scilab

Задача заключается в построении 3d фигуры и реализации функции поворота и алгоритма z буфера.С поворотом никаких проблем не возникло,а вот с z буфером по такому размытому описанию на первом курсе ничего не получается

Цитата:
1) заполнить буфер кадра фоновым значением интенсивности или цвета;
2) заполнить z-буфер минимальным значением z;
3) преобразовать каждый многоугольник в растровую форму в произвольном порядке;
4) для каждого Пиксел(x, y) в многоугольнике вычислить его глубину z(x, y);
сравнить глубину z(x, y) со значением Zбуфер(x, y), хранящимся в z-буфере в этой же позиции;
5) если z(x, y) > Zбуфер(x, y), то записать атрибут этого многоугольника (интенсивность, цвет и т. п.) в буфер кадра и заменить Zбуфер(x, y) на z(x, y);
6) в противном случае никаких действий не производить.
Код:
clear
clf()
// Axes settings
xlabel("x",'fontsize',2);
ylabel("y",'fontsize',2);
zlabel("z",'fontsize',2);
h_axes = gca();
h_axes.font_size = 2;
h_axes.isoview = "on";
h_axes.box = "off";
h_axes.data_bounds = [-1,-1,-1;7,7,7];
xgrid;
//  Matrixs for  quadrangular patches
xquad = [3,3,3,0,3,3,3,3,0,0;
 0,3,0,0,0,0,3,3,0,0;
 0,3,0,0,0,0,3,3,0,0;
 3,3,3,0,3,3,3,3,0,0];

yquad = [0,0,0,0,0,3,1,1,1,1;
 0,0,0,0,0,3,2,2,2,2;
 3,3,0,3,3,3,2,2,2,2;
 3,3,0,3,3,3,1,1,1,1];

zquad = [0,0,0,0,5,0,3,1,3,1;
 0,5,0,5,5,0,3,1,3,1;
 0,5,5,5,5,5,4,2,4,2;
 0,0,5,0,5,5,4,2,4,2];
tcolor = [2 2 2 2 2 2 2 2 2 2];         
plot3d(xquad,yquad,list(zquad,tcolor));
xtitle('Z buffer');
//Формула для вращения по оси OX
function [nx, ny,nz]=mrotx(lx, ly,lz, f)
nx=lx
ny=((ly.*cos(f))+(lz.*sin(f)))
nz=((-ly.*sin(f))+(lz.*cos(f)))
endfunction
//X axe rotating function with controls
h=uicontrol("style","pushbutton","string","ROT X R","Callback",...
"rotplotx(xquad,yquad,zquad,%pi/18)","Callback_Type",2,...
"position",[30, 30, 100, 20])
h=uicontrol("style","pushbutton","string","ROT X L","Callback",...
"rotplotx(xquad,yquad,zquad,-%pi/18)","Callback_Type",2,...
"position",[30, 10, 100, 20])
function [rx1, ry1,rz1]=rotplotx(xx, yy,zz, fi)
[rx1,ry1,rz1]=mrotx(xx,yy,zz,fi)
delete(gce());
pl4=plot3d(rx1,ry1,rz1)
[xquad,yquad,zquad]=return(rx1,ry1,rz1)
endfunction
//Формула для вращения по оси OY
function [nx, ny,nz]=mroty(lx, ly,lz, f)
nx=((lx.*cos(f))+(lz.*sin(f)))
ny=ly
nz=((-lx.*sin(f))+(lz.*cos(f)))
endfunction
//Y axe rotating function with controls
h=uicontrol("style","pushbutton","string","ROT Y L","Callback",...
"rotploty(xquad,yquad,zquad,%pi/18)","Callback_Type",2,...
"position",[140, 30, 100, 20])
h=uicontrol("style","pushbutton","string","ROT Y R","Callback",...
"rotploty(xquad,yquad,zquad,-%pi/18)","Callback_Type",2,...
"position",[140, 10, 100, 20])
function [rx1, ry1,rz1]=rotploty(xx, yy,zz, fi)
[rx1,ry1,rz1]=mroty(xx,yy,zz,fi)
delete(gce());
pl4=plot3d(rx1,ry1,rz1)
[xquad,yquad,zquad]=return(rx1,ry1,rz1)
endfunction
//Формула для вращения по оси OZ
function [nx, ny,nz]=mrotz(lx, ly,lz, f)
nx=((lx.*cos(f))-(ly.*sin(f)))
ny=((lx.*sin(f))+(ly.*cos(f)))
nz=lz
endfunction
//Z axe rotating function with controls
h=uicontrol("style","pushbutton","string","ROT Z R","Callback",...
"rotplotz(xquad,yquad,zquad,%pi/18)","Callback_Type",2,...
"position",[250, 30, 100, 20])
h=uicontrol("style","pushbutton","string","ROT Z L","Callback",...
"rotplotz(xquad,yquad,zquad,-%pi/18)","Callback_Type",2,...
"position",[250, 10, 100, 20])
function [rx1, ry1,rz1]=rotplotz(xx, yy,zz, fi)
[rx1,ry1,rz1]=mrotz(xx,yy,zz,fi)
delete(gce());
pl4=plot3d(rx1,ry1,rz1)
[xquad,yquad,zquad]=return(rx1,ry1,rz1)
endfunction
Изображения
Тип файла: png Скриншот 2016-11-03 22.07.13.png (19.9 Кб, 73 просмотров)
arti99 вне форума Ответить с цитированием
Старый 04.11.2016, 01:04   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я в этом ничего не смыслю; да и языки другие, но может идеи можно подчеркнуть:

https://www.youtube.com/watch?v=mlEq_aKbPAE
https://www.youtube.com/watch?v=3fqX2fpML-c
https://www.youtube.com/watch?v=3IcBpKqgFBQ
https://www.youtube.com/watch?v=stCELsaDJRw
https://www.youtube.com/watch?v=7uf0a9cPhaI
https://www.youtube.com/watch?v=oGSfoiBxpTU
ura_111 вне форума Ответить с цитированием
Старый 04.11.2016, 17:06   #3
arti99
Новичок
Джуниор
 
Регистрация: 04.11.2016
Сообщений: 4
По умолчанию

Спасибо,но youtube один из первых источников,которые я изучил в поисках ответа.Либо слишком формальное объяснение ,либо запутанное настолько,что понять суть невозможно.
Цитата:
Сообщение от ura_111 Посмотреть сообщение
arti99 вне форума Ответить с цитированием
Старый 04.11.2016, 22:06   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Есть массив H*W пикселей..... каждый пиксель хранит цвет + удалённость (D) от камеры объекта, который дал этот цвет
Берём каждый известный объект -> аппроксимируем его N точками (3д!) пространства (самый тупой вариант и не точный) -> проецируем эти точки на экран и получаем их экранные координаты -> смотрим наш массив в точке Х, У и сравниваем записанное там D c расстоянием до камеры -> если D больше, то обновляем его расстоянием до нашей точки + пишем её цвет вместо старого значения

это очень общий алгоритм... расстояние до камеры тоже не факт что декартово (вроде как-то там плоскостями делят, а декартово расстояние - сфера)

как ни странно, но самое сложное - проекция на экран и аппроксимация (и то, это уже вопрос точности\времени.... можно тупо с шагом аля 0.001 фигачить и будет точно, но топорно), а сам z-buffer - это так, один if и пара Мб под массив (:
GreenWizard вне форума Ответить с цитированием
Старый 04.11.2016, 23:33   #5
arti99
Новичок
Джуниор
 
Регистрация: 04.11.2016
Сообщений: 4
По умолчанию

Большое спасибо за такой развернутый ответ,но большая из него так и осталась непонятной.Т.к на первом курсе учусь и не обладаю пока таким аппаратом
Цитата:
Сообщение от GreenWizard Посмотреть сообщение
Есть массив H*W пикселей..... каждый пиксель хранит цвет + удалённость (D) от камеры объекта, который дал этот цвет
Берём каждый известный объект -> аппроксимируем его N точками (3д!) пространства (самый тупой вариант и не точный) -> проецируем эти точки на экран и получаем их экранные координаты -> смотрим наш массив в точке Х, У и сравниваем записанное там D c расстоянием до камеры -> если D больше, то обновляем его расстоянием до нашей точки + пишем её цвет вместо старого значения

это очень общий алгоритм... расстояние до камеры тоже не факт что декартово (вроде как-то там плоскостями делят, а декартово расстояние - сфера)

как ни странно, но самое сложное - проекция на экран и аппроксимация (и то, это уже вопрос точности\времени.... можно тупо с шагом аля 0.001 фигачить и будет точно, но топорно), а сам z-buffer - это так, один if и пара Мб под массив (:
arti99 вне форума Ответить с цитированием
Старый 05.11.2016, 01:44   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от arti99 Посмотреть сообщение
Большое спасибо за такой развернутый ответ,но большая из него так и осталась непонятной.Т.к на первом курсе учусь и не обладаю пока таким аппаратом
а гугл и голова зачем?) проекции можно вполне нагуглить, во всяких матлабах их пилить вообще тьфу, оно уже понимает матрицы и вектора, а остальное и додумать можно
тема не банальная, поэтому пиши в чём именно проблемы и попытаюсь обьяснить
кстати, на хабре почитай - https://habrahabr.ru/post/248153/
мне очень понравилась эта серия статей, весьма сжато и доходчиво
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
по Scilab mital25 Помощь студентам 0 03.02.2016 17:38
Scilab. While. Егор_Чита Помощь студентам 2 10.11.2015 09:48
Scilab Igel93 Помощь студентам 0 20.12.2011 22:17
задачи на SciLab ZinGoZol Фриланс 2 06.02.2011 18:50
Задачи SciLab ZinGoZol Помощь студентам 2 06.02.2011 14:32