Генерация 3D объектов.

Pixilang по русски
Post Reply
Several light
Posts: 67
Joined: Sun Jun 28, 2009 11:07 pm

Генерация 3D объектов.

Post by Several light » Tue May 25, 2010 6:01 pm

Собственно идея родилась из мысли, что 3D объекты в Pixilang восновном приходиться писать ручками (покамесь не вышла 3я версия), а идея написания какхи нибудь конверторов из, более или менее, известных форматов моделей, провалились по причине того, что почти во всех форматах такого типа данные представленны в форме с плавающей запятой. Долго побившись и найдя в инетенете толко кучу филосовских рассуждений на тему плавающей запятой из разряда "как это должно выглядеть в великом плане бытия", и пару тройку готовых программ (сути ктоторых если честно я просто не понял), пришла мысль, что пусть лучше программа на Pixilang рассчтивывает положнеи полигонов и их место в общей структуре ровно также как и саму структуру (т.е. то, что изначально делали с пикселями теперь делаем с полигонами).
Собственно в связи сэтим родилось пару программ выстраивающих подобные структры. Они ещё сырые но на мой взгляд предоставляют некотрое поле для творчества.

Image


Первая прога отрисовывывает радиальную структуру:
http://share.pixi.su/show.php?p=mmfinguwnje2odmxmjq3ntu


Массив точек здесь формируется по спирале (в данном примере с некорым разбросом относительно соновной оси обеспеченным выражением +rand/10 но это так чтобы красивше было :) ). Также программой в массив точек добаляется точка с нулевыми координатами.
Треугольники прикрепляются к двум соседним точкам на спирале и нулевой точке. Вот вообщем так это вглядит в теории... ну а на практике можнопосмотреть через Pixilang ну или на кртинках выше.)
У программы также есть несколько изменяемых параметров.
s - определяет масштаб отрисовываемого изображения.

sids - опредляет количество кусков насколько будет разбита спираль
(не должен привышать gradmax а иначе будет делёжка на 0)

gradmax - максимальный угол Поясню: в принципах построения именно этой спирали используюестя принцип построени окружности.
x=cos((u*512)/360)
y= sin((u*512)/360)
Приэтом для того чтобы построить круг нужно всеголиш получать значения X и Y перебирая U (как угол от 0 до 360 град) (ну и естественно подставлять x и y в функцию dot и не забыть frame после неё). Если угол U будет больше 360 градусов ничего страшного не случиться просто Pixilang продолжит описывать окружность по второму кругу. Параметр gradmax анлогичен U но поскольку это спираль и каждая новая точка окружности распологается выше старой то он фактически будет регулировать высоту спирали.


Вторая программа это попытка сделать модель поверхности:
http://share.pixi.su/show.php?p=mmfintg2mze1mtg2mtuxnzg


Массив точек здесь формируется в виде "матрицы" таким образом первыйтреугольник привязан к трём точкам:
1) Точка первой строки первого стобца
2) Точка втрой строки первого столбца
3) Точка второй строки вотрого столбца
Следующий за ним треугольник привязывается наоброрт:
1) Точка первой строки первого стобца
2) Точка первой строки втрого столбца
3) Точка второй строки вотрого столбца
Таким образом два треугольника создают прямоугольную ячеку которая прикрепленна к 2м точкам на одной строке массива точек и 2м находящимся под ними точкам на следующей ближайшей строке массива точек. По умолчанию (не в данной программе) координата z для всех точек массива точек равна 0 и Pixilang отрисовывает идельно ровную поверхность. Но если при создании массива точек координата z будет задаваться исходяи з какойто функции напремер rand/3 то в результате получим не совсем гладкую поверхность к примеру как в этой программе. :wink:
Параметры тут можно изменять следующие:
stepx - расстояние между одной точкой массива и другой по оси Х
stepy - расстояние между одной точкой массива и другой по оси Y
ndotx - количество точек в массиве по оси X
ndoty - количество точек в массиве по оси Y
Есть вероятность, что при изменении параметра ndotx и ndoty могут пропадать из отрисовки нектрые треугольники, а то и целые ячейки или строки, а могут появляться новыйе треугольники в иде хаотично репозиционируемых нитей и\или поврехностей, это вызванно тем, что я пока не додумался по каими законам можно вычислить общее количество треугольников (ломовые способы не сработали). Это количество задаётся в двух местах:
cube_t = new_array( ((ndotx * ndoty)+2302)* 8 )
while (i< ((ndotx * ndoty)+2302)* 8 ){
И выглядит как:
((ndotx * ndoty)+2302)* 8
И тут есть число 2302 подобранное если честно эмпирическим путём для парамеров:
ndotx=50
ndoty=50
Пока нет идеи, что с ним делать но поскольку такие расчёты вообще неслабо грузят компютер можно выставить
ndotx=10
ndoty=10
А число 2302 заменить на 62.

Обе программы сырые и обоими можно загрузить процессор графическими расчётами на Pixilang вплоть до долгого подвисания так что впринципе навернео их можно использвоать как тесторы производительности :). А так незнаю насколько они интересны просто выложил.)

Zuf
Posts: 110
Joined: Fri Dec 21, 2007 7:30 pm
Location: Msc
Contact:

Re: Генерация 3D объектов.

Post by Zuf » Tue May 25, 2010 8:59 pm

Программы интересны, ждем еще ;)
Думаю такие задачки вполне в духе пиксиланга.

Several light
Posts: 67
Joined: Sun Jun 28, 2009 11:07 pm

Re: Генерация 3D объектов.

Post by Several light » Tue May 25, 2010 11:19 pm

Спасибо. :)
Вообще-то была идейка по поводу использования файлов типа jpg или gif в качестве основы для задания высот (по интенсивности, цвету или ещё чему нибудь) это уже будет проще и интереснее. Правда вот хотелось бы всё таки разобраться с этим эмпирическим коэфицентом, а то замучался его эмпирически подбирать.))

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Генерация 3D объектов.

Post by Al_Rado » Wed May 26, 2010 10:11 am

Да, интересные программки!
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

yourchange
Posts: 33
Joined: Tue Jan 01, 2013 5:30 pm
Location: Украина, Николаев

Re: Генерация 3D объектов.

Post by yourchange » Tue Jan 01, 2013 6:31 pm

fn obj($t,$xpl,$ypl,$zpl,
$rx,$ry,$rz,$col,$tr,$tx){
$px=$rx/2 $py=$ry/2 $pz=$rz/2
if($t==0){
$kv=($xpl+1)*($ypl+1)
$kt=$xpl*$ypl*2
}
if($t==1){
$kv=($xpl+1)*($zpl+1)+2
$kt=$xpl*$zpl*2+($xpl*2)
}
if($t==2){
$kv=($xpl+1)*($zpl)+2
$kt=$xpl*$zpl*2
}
if($t==3){
$kv=($xpl+1)*($zpl-1)+2
$kt=$xpl*($zpl-1)*2
}
if($t==4){
$kv=(($xpl+1)*($zpl+1)+($xpl+1)*($ypl+1)+($ypl+1)*($zpl+1))*2
$kt=($xpl*$zpl+$xpl*$ypl+$ypl*$zpl)*4
}
resize(ver,$kv*8)
resize(tri,$kt*8)
resize(nor,$kt,3)
clean(ver) clean(tri) clean(nor)
$rx/$xpl $ry/$ypl $rz/$zpl//size segment
$tkx=get_xsize($tx)/$xpl
$tky=get_ysize($tx)/$ypl
$tkz=get_ysize($tx)/$zpl

if($t==0){//______plane
x=0 y=0 i=0 while(i<$kv){
ver[i*8]=x*$rx-$px
ver[i*8+1]=y*$ry-$py
ver[i*8+2]=(sin(x/2)*10)+(cos(y)*5)
ver[i*8+3]=x*$tkx
ver[i*8+4]=y*$tky
x+1 if(x>$xpl){x=0 y+1}
i+1}
}//plane
if($t==1)||($t==2)||($t==3){
$rx/2 $px/2//диаметр=>радиус
ver[2]=$zpl/2*$rz
ver[3]=$xpl/2*$tkx
ver[($kv-1)*8+2]=-$zpl/2*$rz
ver[($kv-1)*8+3]=$xpl/2*$tkx
ver[($kv-1)*8+4]=$ypl*$tky
$a=(M_PI*2)/$xpl
$az=(M_PI)/$zpl
x=$xpl+1 y=0
if($t==1){y=-1}
i=1 while(i<$kv-1){
if(x==$xpl+1){
x=0 y+1
if($t==1){
$r=$rx*$xpl
$z=$zpl*$rz-(y*$rz)
}
if($t==2){
$z=$zpl*$rz-(y*$rz)
$r=(y*$rz)*(($px)/($pz))
}
if($t==3){
$r=(sin($az*y))*$rx*($xpl)
$z=(cos($az*y))*$rz*($zpl/2)+$pz
}
}//точка оборота
ver[i*8]=(cos(($xpl-x)*$a))*$r
ver[i*8+1]=(sin(($xpl-x)*$a))*$r
ver[i*8+2]=$z-$pz
ver[i*8+3]=x*$tkx
ver[i*8+4]=y*$tky
x+1
i+1}
}//cylinder,conus,sphere
if($t==0){
x=0 y=x+$xpl+2 $n=$kt
i=0 $m=$xpl
}
if($t==1)||($t==2)||($t==3){
x=1 y=x+$xpl+2 $n=$kt-$xpl
i=$xpl $m=$xpl+1
}
while(i<$n){//прямоугольники
if(x==$m){
if($t==0){x+1 $m+$xpl+1 y+1}
if($t==1)||($t==2)||($t==3){
$m+$xpl+1 x+1 y+1}
}//ряд
z=y-1
tri[i*8]=x
tri[i*8+1]=z
tri[i*8+2]=y
tri[i*8+3]=$col
tri[i*8+4]=$tx
tri[i*8+5]=$tr
sizet(x,y,z,i)//размер треугольника
i+1 z=x+1
tri[i*8]=x
tri[i*8+1]=z
tri[i*8+2]=y
tri[i*8+3]=$col
tri[i*8+4]=$tx
tri[i*8+5]=$tr
sizet(x,z,y,i)
x+1 y+1 i+1}
//cylinder,conus,sphere
if($t==1)||($t==2)||($t==3){
x=0 $s=1
i=0 while(i<$kt){
if(i==$xpl){
i=$kt-$xpl x=$kv-1 $s=-$xpl-i-1}
if(x==0){z=x+i+$s y=z+1}
else{y=x+i+$s z=y+1}
tri[i*8]=x
tri[i*8+1]=y
tri[i*8+2]=z
tri[i*8+3]=$col
tri[i*8+4]=$tx
tri[i*8+5]=$tr
sizet(x,y,z,i)
i+1}
}//cylinder,conus,sphere
}//objects

вводные:
t тип обьекта 0-3 (4-куб не доделал)
xpl ypl zpl кол-во сегментов
rx ry rz размеры
col цвет
tx текстура (произв размера)
tr прозрачность

Post Reply