3D примитивы в Processing

leks
Offline
Зарегистрирован: 22.10.2017

Как то в процессинге нет примитивов совсем кроме куба и сферы. Написал несколько функций-примитивов сам. У кого в заначках есть варианты давайте делиться, а то скучно.



/функция построения примитива призмы-цилиндра и примеры использования
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));
}
//////////////////////////////////////////////////////////

leks
Offline
Зарегистрирован: 22.10.2017
//функция построения примитива тора и примеры использования
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));
}
//////////////////////////////////////////////////////////

leks
Offline
Зарегистрирован: 22.10.2017
//функция построения примитива труба и примеры использования
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);
  } 
 }
//////////////////////////////////////////////////////////

leks
Offline
Зарегистрирован: 22.10.2017
//функция построения примитива пирамиды-конуса и примеры использования
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));
}
//////////////////////////////////////////////////////////

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Как  вы его используете Processing ?

leks
Offline
Зарегистрирован: 22.10.2017

Использую для создания приложений пк для управления поделками на Ардуино, с их виртуальными копиями в приложении.

leks
Offline
Зарегистрирован: 22.10.2017
//функция построения примитива спираль и примеры использования
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));
}
//////////////////////////////////////////////////////////

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

leks пишет:

Использую для создания приложений пк для управления поделками на Ардуино, с их виртуальными копиями в приложении.

 

Это интересно,а есть какой-то  пример  с видосиком ? :)

leks
Offline
Зарегистрирован: 22.10.2017

https://yadi.sk/i/0XmVr-vKQwQjiw

Вот, например, реальный и виртуальный светодиодный куб.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

leks пишет:

https://yadi.sk/i/0XmVr-vKQwQjiw

Вот, например, реальный и виртуальный светодиодный куб.

Очень интересно! А проект где-то выложен ?  У  меня идея немного наоборот как раз с этим  кубом,  стоит такой же  светодиодный куб  но на  светодиоды  не подается напряжение, а снимается.  В итоге  при освещении  этого куба  на экране должно показываться освещение  на   этой  3D  копии  куба, с какой стороны  и  интенсивность.

leks
Offline
Зарегистрирован: 22.10.2017

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/redaktor-effek...

Вот в теме вариант скетча для процессинга. Отдельно проект не выложен.