Форум программистов, компьютерный форум, киберфорум
dserp18
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Модель солнечной системы (Processing)

Запись от dserp18 размещена 03.10.2016 в 13:17
Обновил(-а) dserp18 16.10.2016 в 23:03 (добавление новой информации)

1. Создаем пустую сферу (планету)
Java
1
2
3
4
5
6
7
8
9
10
11
12
void setup(){
size(600, 600, P3D);//создаем сцену 600*600
}
void draw(){
background(0);//задаем цвет фона (0 - черный цвет)
noFill();//заливка отсутствует
stroke(255);//создаем каркас (255 - белый цвет)
translate(width/2, height/2);//помещаем сферу в середину сцены
pushMatrix();
sphere(100);//радиус сферы равен 100
popMatrix();
}
2.Задаем ей вращение вокруг собственной оси
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float angPlanet=0;//угол вращения
void setup(){
size(600, 600, P3D);
}
void draw(){
background(0);
noFill();
stroke(255);
translate(width/2, height/2);
pushMatrix();
rotate(angPlanet);//задаем вращение по углу
angPlanet += 0.01;//увеличиваем угол
sphere(100);
popMatrix();
}
На самом деле angPlanet - это время, умноженное на угол. На форуме уже обсуждалась соответствующая тема Движение точки по окружности

3. Задаем движение сферы вокруг некой неподвижной точки (движение по орбите)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
float angPlanet=0;
float angSun=0;//угол вращения по орбите
int x,y,r=200;//координаты движения по орбите и радиус орбиты
void setup(){
size(600, 600, P3D);
}
void draw(){
background(0);
noFill();
stroke(255);
translate(width/2, height/2);
pushMatrix();
rotate(angPlanet);
angPlanet += 0.01;
x=round(r*cos(PI*angSun/180));//задаем формулы движения по орбите
y=round(r*sin(PI*angSun/180));
translate(x,y);//задаем перемещение в соответствии с формулами
angSun += 0.01;//увеличиваем гол
sphere(100);
popMatrix();
}
На самом деле angSun - это время, умноженное на угол. См. Движение точки по окружности

4. Помещаем в центр сцены точечный источник света. Создаем рассеянное свечение. Заливаем сферу цветом.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float angPlanet=0;
float angSun=0;
int x,y,r=200;
void setup(){
size(600, 600, P3D);
}
void draw(){
background(0);
fill(70);//заливка серым цветом
noStroke();//убираем каркас сферы
translate(width/2, height/2);
ambientLight(100, 100, 100, 0, 0, 0);//рассеянное свечение
pointLight(255, 255, 255, 0, 0, 0);//точечный источник света
pushMatrix();
rotate(angPlanet);
angPlanet += 0.01;
x=round(r*cos(PI*angSun/180));
y=round(r*sin(PI*angSun/180));
translate(x,y);
angSun += 0.01;
sphere(100);
popMatrix();
}
5. Помещаем в центр сцены сферу (Солнце), уменьшаем радиус планеты
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
float angPlanet=0;
float angSun=0;
int x,y,r=200;
void setup(){
size(600, 600, P3D);
}
void draw(){
background(0);
translate(width/2, height/2);
ambientLight(100, 100, 100, 0, 0, 0);
pointLight(255, 255, 255, 0, 0, 0);
pushMatrix();
fill(70);
noStroke();
rotate(angPlanet);
angPlanet += 0.01;
x=round(r*cos(PI*angSun/180));
y=round(r*sin(PI*angSun/180));
translate(x,y);
angSun += 0.01;
sphere(50);
popMatrix();
pushMatrix();
fill(255);
stroke(110);
sphere(100);
popMatrix();
}
6. Вот пример как наложить текстуру на сферу https://processing.org/examples/texturesphere.html
Также этот пример доступен из Processing IDE: File - Examples...
Картинка world32k.jpg также есть в папке, куда установлен Processing

Добавляем в этот пример вращение, как было описано в предыдущих пунктах
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
float angSun=0;
int x,y,r=500;
int mD;//"перетаскивание" мышью
 
int ptsW, ptsH;
 
PImage img;
 
int numPointsW;
int numPointsH_2pi; 
int numPointsH;
 
float[] coorX;
float[] coorY;
float[] coorZ;
float[] multXZ;
 
void setup() {
  size(640, 640, P3D);
  background(0);
 
  img=loadImage("world32k.jpg");
  ptsW=30;
  ptsH=30;
  // Parameters below are the number of vertices around the width and height
  initializeSphere(ptsW, ptsH);
}
 
void draw() {
  background(0);
translate(width/2, height/2, -1000);
 
 
rotateX(PI*mD/180);//вращение по X при "перетаскивании"
ambientLight(50, 50, 50, 0, 0, 0);
pointLight(255, 255, 255, 0, 0, 0);
 
pushMatrix();
noStroke();
x=round(r*cos(PI*angSun/180));
y=round(r*sin(PI*angSun/180));
translate(x,y);
angSun += 1;
rotateX(PI*(-90)/180);
textureSphere(200, 200, 200, img);
popMatrix();
  
pushMatrix();
stroke(255);
noFill();
rotateX(PI*(-90)/180);
sphere(200);
popMatrix();
}
void initializeSphere(int numPtsW, int numPtsH_2pi) {
 
  // The number of points around the width and height
  numPointsW=numPtsW+1;
  numPointsH_2pi=numPtsH_2pi;  // How many actual pts around the sphere (not just from top to bottom)
  numPointsH=ceil((float)numPointsH_2pi/2)+1;  // How many pts from top to bottom (abs(....) b/c of the possibility of an odd numPointsH_2pi)
 
  coorX=new float[numPointsW];   // All the x-coor in a horizontal circle radius 1
  coorY=new float[numPointsH];   // All the y-coor in a vertical circle radius 1
  coorZ=new float[numPointsW];   // All the z-coor in a horizontal circle radius 1
  multXZ=new float[numPointsH];  // The radius of each horizontal circle (that you will multiply with coorX and coorZ)
 
  for (int i=0; i<numPointsW ;i++) {  // For all the points around the width
    float thetaW=i*2*PI/(numPointsW-1);
    coorX[i]=sin(thetaW);
    coorZ[i]=cos(thetaW);
  }
  
  for (int i=0; i<numPointsH; i++) {  // For all points from top to bottom
    if (int(numPointsH_2pi/2) != (float)numPointsH_2pi/2 && i==numPointsH-1) {  // If the numPointsH_2pi is odd and it is at the last pt
      float thetaH=(i-1)*2*PI/(numPointsH_2pi);
      coorY[i]=cos(PI+thetaH); 
      multXZ[i]=0;
    } 
    else {
      //The numPointsH_2pi and 2 below allows there to be a flat bottom if the numPointsH is odd
      float thetaH=i*2*PI/(numPointsH_2pi);
 
      //PI+ below makes the top always the point instead of the bottom.
      coorY[i]=cos(PI+thetaH); 
      multXZ[i]=sin(thetaH);
    }
  }
}
 
void textureSphere(float rx, float ry, float rz, PImage t) { 
  // These are so we can map certain parts of the image on to the shape 
  float changeU=t.width/(float)(numPointsW-1); 
  float changeV=t.height/(float)(numPointsH-1); 
  float u=0;  // Width variable for the texture
  float v=0;  // Height variable for the texture
 
  beginShape(TRIANGLE_STRIP);
  texture(t);
  for (int i=0; i<(numPointsH-1); i++) {  // For all the rings but top and bottom
    // Goes into the array here instead of loop to save time
    float coory=coorY[i];
    float cooryPlus=coorY[i+1];
 
    float multxz=multXZ[i];
    float multxzPlus=multXZ[i+1];
 
    for (int j=0; j<numPointsW; j++) { // For all the pts in the ring
      normal(-coorX[j]*multxz, -coory, -coorZ[j]*multxz);
      vertex(coorX[j]*multxz*rx, coory*ry, coorZ[j]*multxz*rz, u, v);
      normal(-coorX[j]*multxzPlus, -cooryPlus, -coorZ[j]*multxzPlus);
      vertex(coorX[j]*multxzPlus*rx, cooryPlus*ry, coorZ[j]*multxzPlus*rz, u, v+changeV);
      u+=changeU;
    }
    v+=changeV;
    u=0;
  }
  endShape();
}
void mouseDragged() {
  mD = mouseX;
}
Размещено в Без категории
Показов 1440 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.