3D примитивы в Processing
- Войдите на сайт для отправки комментариев
Втр, 11/08/2020 - 20:07
Как то в процессинге нет примитивов совсем кроме куба и сферы. Написал несколько функций-примитивов сам. У кого в заначках есть варианты давайте делиться, а то скучно.
/функция построения примитива призмы-цилиндра и примеры использования
void setup() {
size(900, 650, P3D);
}
void draw() {
background(0);
lights();
translate(width/8, (height/3));
noStroke();
fill(0,255,127);//цвет объектов
translate(0,100,-100);
rotateX(-PI/6);
prizma_(200,75,70);//цилиндр уже
translate(170,0,0);
prizma_(200,75,12);//призма 12 граней
translate(160,0,0);
prizma_(200,75,6);//призма 6 граней
translate(160,0,0);
prizma_(200,75,4);//призма 4 грани
translate(140,0,0);
prizma_(200,75,3);//призма 3 грани
}
//////////////////////////////////////////////////////////
void prizma_(float h,float r,int N)//аргументы - высота, радиус, число граней призмы-цилиндра
{
translate(-r*sin(PI/N),-h/2,r*cos(PI/N));
for(int i=0;i<N;i++)
{
translate(2*r*sin(PI/N),0,0);
rotateY(2*PI/N);
rect(0,0,2*r*sin(PI/N),h);
rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2);
translate(0,h,0);rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2);translate(0,-h,0);
}
translate(r*sin(PI/N),h/2,-r*cos(PI/N));
}
//////////////////////////////////////////////////////////

//функция построения примитива тора и примеры использования void setup() { size(900, 650, P3D); } void draw() { background(0); lights();directionalLight(255, 255, 255, 0, 0, 1); translate(width/4, (height/3)); //stroke(255); noStroke(); fill(0,200,127);//цвет объектов rotateX(PI/4); tor_(100,30,100); translate(150,0,-50); tor_(100,30,40); translate(150,0,-50); tor_(100,30,20); translate(150,0,-50); tor_(100,30,10); } ///////////////////////////////////////////////////////// void tor_(float R,float r1,int N1)//аргументы - радиус тора,радиус сечения,число граней тора-бублика { for(int i1=0;i1<N1;i1++) { rotateZ(2*PI/(N1)); translate(R,0,0);prizma_(2*PI*(R+r1)/N1,r1,N1/2);translate(-R,0,0); } } ////////////////////////////////////////////////////////// void prizma_(float h,float r,int N)//аргументы - высота, радиус, число граней призмы-цилиндра { translate(-r*sin(PI/N),-h/2,r*cos(PI/N)); for(int i=0;i<N;i++) { translate(2*r*sin(PI/N),0,0); rotateY(2*PI/N); rect(0,0,2*r*sin(PI/N),h); rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2); translate(0,h,0);rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2);translate(0,-h,0); } translate(r*sin(PI/N),h/2,-r*cos(PI/N)); } ////////////////////////////////////////////////////////////функция построения примитива труба и примеры использования void setup() { size(900, 650, P3D); } void draw() { background(0); lights();directionalLight(255, 255, 255, 0, -1, -1); translate(width/5, (height/2)); //stroke(255); noStroke(); fill(127);//цвет объектов rotateX(-PI/4); truba_(150,100,20,200); translate(200,0,-50);truba_(150,100,20,50); translate(200,0,-50);truba_(150,100,20,20); translate(200,0,-50);truba_(150,100,20,8); } ///////////////////////////////////////////////////////// void truba_(float H,float R,float d,float N)//аргументы - высота трубы,внешний радиус,толщина стенки, число граней { for(int i=0;i<N;i++) { rotateY(2*PI/N); translate(R-d/2,0,0);box(d,H,(2*(R+d/2))*sin(PI/N));translate(-R+d/2,0,0); } } ////////////////////////////////////////////////////////////функция построения примитива пирамиды-конуса и примеры использования void setup() { size(900, 650, P3D); } void draw() { background(0); lights(); directionalLight(255, 255, 255, 0, 0, 1); translate(width/8, (height/3)); stroke(255); //fill(0,255,127);//цвет объектов fill(127); translate(50,100,-100); rotateX(PI/4); piramida_(300,75,40);//конус уже translate(160,0,0); piramida_(300,75,12);//пирамида 12 граней translate(150,0,0); piramida_(300,75,6);//пирамида 6 граней translate(150,0,0); piramida_(300,75,4);//пирамида 4 грани translate(130,0,0); piramida_(300,75,3);//пирамида 3 грани } ////////////////////////////////////////////////////////// void piramida_(float h,float r,int N)//аргументы - высота, радиус, число граней пирамиды-конуса { translate(-r*sin(PI/N),-h/2,r*cos(PI/N)); for(int i=0;i<N;i++) { translate(2*r*sin(PI/N),0,0); rotateY(2*PI/N); translate(0,h,0); rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2); rotateX(acos(h/sqrt((h*h+r*r*cos(PI/N)*cos(PI/N)))));triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-sqrt(h*h+r*r*cos(PI/N)*cos(PI/N)));rotateX(-acos(h/sqrt((h*h+r*r*cos(PI/N)*cos(PI/N))))); translate(0,-h,0); } translate(r*sin(PI/N),h/2,-r*cos(PI/N)); } //////////////////////////////////////////////////////////Как вы его используете Processing ?
Использую для создания приложений пк для управления поделками на Ардуино, с их виртуальными копиями в приложении.
//функция построения примитива спираль и примеры использования void setup() { size(900, 650, P3D); } void draw() { background(0); lights();directionalLight(255, 255, 255, 0, -1, -1); translate(width/4, (2*height/3)); //stroke(255); noStroke(); fill(127);//цвет объектов rotateX(PI/3); spiral_(30,5,30,10);//малая... translate(180,0,0);spiral_(70,10,35,7);// средняя... translate(250,0,0);spiral_(100,15,70,3);//большая пружина } ///////////////////////////////////////////////////////// void spiral_(float R,float r1,float d,int N2)//аргументы - радиус пружины,радиус сечения,шаг витков,число витков { for(int i2=0;i2<N2;i2++) { translate(0,0,d); int N1=100;//число элементов витка и граней в элементе for(int i1=0;i1<N1;i1++) { rotateZ(2*PI/(N1)); translate(R,0,i1*d/N1);prizma_(2*PI*(R+r1)/N1,r1,N1/1);translate(-R,0,-i1*d/N1); } } translate(0,0,-d*(N2)); } ////////////////////////////////////////////////////////// void prizma_(float h,float r,int N)//аргументы - высота, радиус, число граней призмы-цилиндра { translate(-r*sin(PI/N),-h/2,r*cos(PI/N)); for(int i=0;i<N;i++) { translate(2*r*sin(PI/N),0,0); rotateY(2*PI/N); rect(0,0,2*r*sin(PI/N),h); rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2); translate(0,h,0);rotateX(PI/2);triangle(0,0,2*r*sin(PI/N),0,r*sin(PI/N),-r*cos(PI/N));rotateX(-PI/2);translate(0,-h,0); } translate(r*sin(PI/N),h/2,-r*cos(PI/N)); } //////////////////////////////////////////////////////////Использую для создания приложений пк для управления поделками на Ардуино, с их виртуальными копиями в приложении.
Это интересно,а есть какой-то пример с видосиком ? :)
https://yadi.sk/i/0XmVr-vKQwQjiw
Вот, например, реальный и виртуальный светодиодный куб.
https://yadi.sk/i/0XmVr-vKQwQjiw
Вот, например, реальный и виртуальный светодиодный куб.
Очень интересно! А проект где-то выложен ? У меня идея немного наоборот как раз с этим кубом, стоит такой же светодиодный куб но на светодиоды не подается напряжение, а снимается. В итоге при освещении этого куба на экране должно показываться освещение на этой 3D копии куба, с какой стороны и интенсивность.
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/redaktor-effek...
Вот в теме вариант скетча для процессинга. Отдельно проект не выложен.