Симулација кретања Земље око Сунца у 3D Processing-у (Java)
Једна од највећих предности Processing окружења јесте могућност веома једноставног креирања графичких симулација и анимација. Поред цртања дводимензионалних објеката, Processing омогућава рад у тродимензионалном простору коришћењем P3D рендера, чиме се отвара могућност израде бројних образовних, научних и интерактивних пројеката.
У овој вежби направићемо симулацију кретања Земље око Сунца. Током рада упознаћете начин на који се креирају тродимензионалне сцене, како се поставља камера, како функционишу трансформације координатног система и на који начин се објекти могу ротирати око сопствене осе или око других објеката.
Лекција је организована кроз два практична примера. У првом примеру користићемо основне геометријске објекте (sphere()) и основне изворе светлости како бисмо разумели принципе рада у 3D простору. У другом примеру унапредићемо симулацију додавањем текстура, PShape објеката, позадинске слике свемира и могућности управљања камером помоћу тастатуре.
На крају лекције бићете способни да самостално развијате сложеније симулације Сунчевог система, додајете нове планете, мењате положај камере, примењујете различите врсте осветљења и текстуре, као и да креирате сопствене образовне и научне пројекте.

Сунце и Земља
Симулација кретања Земље око Сунца употребом тродимензионалне графике.

Камера
Постављање камере и посматрање сцене из различитих углова.

Осветљење
Примена амбијенталног, тачкастог и усмереног извора светлости.

Текстуре
Постављање реалистичних текстура на тродимензионалне објекте.

⚙ PShape
Креирање напреднијих тродимензионалних објеката помоћу класе PShape.

🔄 Трансформације
Ротација, транслација и хијерархијске трансформације у тродимензионалном простору.
📑 Садржај
- Зашто користити 3D Processing?
- Препоручено предзнање
- 3D координатни систем
- Шта ћемо направити?
- Први пример – основна симулација Сунчевог система
- Објашњење програма
- Други пример – текстуре и PShape објекти
- Објашњење другог програма
- Поређење оба програма
- Предлози за експериментисање
- На шта треба обратити пажњу
- Додатно учење
- Мини квиз
🚀 Зашто користити 3D Processing?
Већина почетника упознаје Processing кроз цртање линија, правоугаоника и кружница у две димензије. Међутим, веома брзо јавља се потреба за приказивањем објеката у простору. Управо због тога Processing подржава P3D рендер, који омогућава рад са тродимензионалном графиком користећи веома једноставне функције.
За разлику од професионалних графичких библиотека као што су OpenGL или Vulkan, где је за исцртавање једне сфере потребно написати велики број линија кода, у Processing-у је довољно позвати функцију sphere(). На сличан начин могу се користити функције за ротацију, транслацију, постављање камере и осветљења.
Захваљујући томе, ученици и студенти могу много више времена посветити разумевању физичких појава и математичких модела, а много мање техничким детаљима програмирања графике.
🌍 Астрономија
Симулација Сунчевог система, ротације планета, помрачења и орбиталног кретања.
⚙ Физика
Приказ сила, убрзања, ротација, судара и других физичких појава.
🎮 Развој игара
Креирање једноставних 3D сцена и упознавање са основама развоја видео-игара.
📚 Препоручено предзнање
Пре него што почнете са овом вежбом препоручујемо да прочитате две лекције које детаљно објашњавају основе рада у 3D Processing-у.
📘 Први кораци у 3D Processing-у
У овој лекцији упознаћете функције box(), sphere(), translate(), rotateX(), rotateY(), rotateZ() и научити како се укључује P3D рендер.
📘 Увод у 3D Processing
Друга лекција детаљно објашњава рад са камером, осветљењем, функцијом camera(), креирањем сложенијих 3D објеката и применом функција beginShape() и vertex().
У овој лекцији нећемо поново објашњавати наведене функције већ ћемо их применити на једном реалном пројекту — симулацији кретања Земље око Сунца.
📐 3D координатни систем
За разлику од дводимензионалног простора, где положај објекта одређују координате x и y, у тродимензионалном простору користи се и координата z. Она одређује колико је објекат удаљен од посматрача или колико се налази испред или иза равни екрана.
Све трансформације које ћемо користити у овој лекцији (ротације, транслације и померање камере) заснивају се управо на раду са ове три координатне осе. Због тога је веома важно да разумете њихов распоред пре него што почнете да анализирате програме.

Координатне осе
- X – лево и десно.
- Y – горе и доле.
- Z – напред и назад.
Све трансформације у овој лекцији изводе се померањем или ротирањем око ове три координатне осе.
Редослед трансформација у 3D координатном систему
Шта ћемо направити?
Наш циљ није да направимо потпуно научно прецизан модел Сунчевог система, већ едукативну симулацију која ће нам помоћи да разумемо како функционишу трансформације у тродимензионалном простору.
Први програм приказује основне принципе рада. Сунце ће бити представљено жутом сфером која емитује светлост, док ће Земља бити плава сфера која истовремено ротира око своје осе и обилази Сунце по кружној орбити.
У другом програму унапредићемо ову симулацију додавањем реалистичних текстура планета, позадинске слике свемира, PShape објеката и могућности померања камере помоћу тастатуре.
🎯 Циљ вежбе
- научити рад са 3D координатним системом,
- применити транслације и ротације,
- разумети рад камере,
- користити различите врсте осветљења,
- креирати анимацију орбиталног кретања,
- применити текстуре и PShape објекте.
Изоловане трансформације појединих објеката
Употреба команди pushMatrix() i popMatrix() у 3D координатном систему.
У наставку ћемо анализирати први програм који представља одличан увод у израду тродимензионалних симулација у Processing-у. Иако је релативно једноставан, у њему се налазе готово сви основни елементи потребни за израду много сложенијих 3D пројеката.
Пример 1 – Основна симулација кретања Земље око Сунца
У првом примеру користићемо само основне геометријске објекте које Processing већ поседује. Сунце и Земља биће представљени сферама различитих димензија и боја, док ће се њихово кретање остварити комбинацијом функција rotateZ() и translate(). На тај начин видећемо како се једноставним трансформацијама може симулирати орбитално кретање планета.

Основна 3D симулација
Сунце представља извор светлости, док Земља истовремено ротира око своје осе и обилази Сунце по кружној орбити.
📝 Пример 1 – Анализа програма
У овом примеру направићемо једноставну тродимензионалну симулацију кретања Земље око Сунца. Иако је програм релативно кратак, у њему се налазе скоро сви најважнији елементи који се користе приликом израде сложенијих 3D сцена.
Пре него што почнете да читате програм, важно је да схватите да се целокупна анимација заснива на три основне идеје:
- креирању тродимензионалне сцене,
- ротирању координатног система,
- померању објекта унутар тог система.
Уместо да директно померамо Земљу по кружници, ми ротирањем координатног система добијамо утисак да Земља кружи око Сунца. Управо је то једна од најважнијих техника која се користи у рачунарској графици.
💻 Програм
//=====================================================
// Симулација кретања Земље око Сунца
// Основна 3D симулација
//=====================================================
//------------------------------------
// Полупречници Сунца, Земље и орбите
//------------------------------------
float poluprecnikSunca = 75;
float poluprecnikZemlje = 25;
float poluprecnikOrbite = 200;
//------------------------------------
// Координате камере
//------------------------------------
float kameraX = -250;
float kameraY = -180;
float kameraZ = -500;
//------------------------------------
// Углови ротације
//------------------------------------
// Угао обиласка Земље око Сунца.
float ugaoObilaska = 0;
// Угао ротације Земље око своје осе.
float ugaoRotacije = 0;
//------------------------------------
// Брзине
//------------------------------------
float brzinaRotacije = 0.10;
float brzinaObilaska = 0.005;
void setup(){
//------------------------------------------------
// Покретање Processing-а у 3D режиму рада
//------------------------------------------------
size(800,600,P3D);
}
void draw(){
//------------------------------------------------
// Позадина симулира свемир
//------------------------------------------------
background(20);
//------------------------------------------------
// Померање координатног почетка
// у центар прозора
//------------------------------------------------
translate(width/2,height/2);
//------------------------------------------------
// Подешавање камере
//------------------------------------------------
camera(
kameraX,
kameraY,
kameraZ,
0,
0,
0,
0,
0,
1
);
//------------------------------------------------
// Амбијентално светло
//------------------------------------------------
ambientLight(40,40,40);
//------------------------------------------------
// Сунце представља извор светлости
//------------------------------------------------
pointLight(
255,
255,
220,
0,
0,
0
);
//------------------------------------------------
// Цртање орбите
//------------------------------------------------
stroke(180);
noFill();
ellipse(
0,
0,
2*poluprecnikOrbite,
2*poluprecnikOrbite
);
//------------------------------------------------
// Цртање Сунца
//------------------------------------------------
pushMatrix();
noStroke();
fill(255,220,80);
// Сунце само емитује светлост.
emissive(255,220,80);
sphere(poluprecnikSunca);
popMatrix();
//------------------------------------------------
// Искључивање емисије
//------------------------------------------------
emissive(0);
//------------------------------------------------
// Цртање Земље
//------------------------------------------------
pushMatrix();
// Ротација око Сунца.
rotateZ(ugaoObilaska);
// Померање до орбите.
translate(poluprecnikOrbite,0,0);
// Ротација Земље.
rotateZ(ugaoRotacije);
// Цртање осе ротације.
stroke(0,220,255);
line(
0,
0,
-poluprecnikZemlje-20,
0,
0,
poluprecnikZemlje+20
);
noStroke();
fill(30,30,255);
sphere(poluprecnikZemlje);
popMatrix();
//------------------------------------------------
// Ажурирање углова
//------------------------------------------------
ugaoObilaska += brzinaObilaska;
ugaoRotacije += brzinaRotacije;
}
📖 Објашњење програма
1. Дефинисање глобалних променљивих
На самом почетку програма дефинишу се све променљиве које ће бити коришћене током извршавања симулације. На овај начин касније веома лако можемо променити величину Сунца, Земље или орбите без измене остатка програма.
☀ Полупречник Сунца
Одређује величину сфере која представља Сунце.
🌍 Полупречник Земље
Одређује величину сфере која представља Земљу.
🛰 Полупречник орбите
Одређује удаљеност Земље од Сунца.
2. Постављање камере
За разлику од дводимензионалне графике, у 3D простору неопходно је дефинисати положај посматрача. То се ради функцијом camera().
У овом примеру камера није постављена директно испред сцене већ је мало померена улево и нагоре. Захваљујући томе добијамо природнији поглед на Сунце и Земљу.

🎥 Положај камере
Камера се налази изнад и са леве стране сцене и усмерена је ка координатном почетку.
3. Осветљење сцене
Да би тродимензионални објекти изгледали реалистично, неопходно је осветљење. У овом примеру користимо две различите врсте светлости.
- ambientLight() осветљава целу сцену слабим светлом.
- pointLight() представља Сунце као тачкасти извор светлости.
Комбинација ова два извора омогућава да се облици сфера јасно виде без обзира на њихов положај.
4. Цртање орбите
Орбита није посебан 3D објекат већ кружница исцртана функцијом ellipse(). Она представља путању по којој се Земља креће око Сунца.
Пошто се координатни систем налази у центру сцене, центар кружнице поклапа се са положајем Сунца.
5. Цртање Сунца
Сунце се исцртава функцијом sphere(). Посебно је важно што је пре исцртавања позвана функција emissive(), која омогућава да Сунце изгледа као да само емитује светлост.
Иако ова функција не производи праву светлост, визуелни ефекат је много убедљивији него када би се користила само функција fill().
6. Кретање Земље
Најважнији део програма налази се управо овде. Кретање Земље добија се комбинацијом две трансформације.
- ротација координатног система око Сунца,
- померање Земље до орбите.
rotateZ() → translate() → rotateZ() → sphere()
Прва ротација омогућава обилазак Земље око Сунца, док друга ротира Земљу око њене сопствене осе.
7. Анимација
Последње две наредбе програма повећавају углове ротације. Како се функција draw() непрекидно извршава, углови постају све већи, што ствара утисак непрекидног кретања.
ugaoObilaska += brzinaObilaska;
ugaoRotacije += brzinaRotacije;
Променом вредности променљивих brzinaRotacije и brzinaObilaska лако можемо симулирати различите брзине ротације и обиласка планета.
Пример 2 – Реалистичнија симулација употребом текстура и PShape објеката
У претходном примеру користили смо једноставне сфере обојене једном бојом. Такав приступ је одличан за упознавање са основним принципима рада у тродимензионалном простору, али не даје реалистичан изглед планета.
У овом примеру значајно ћемо унапредити симулацију. Уместо једнобојних сфера користићемо PShape објекте на које ће бити постављене текстуре Сунца и Земље. Поред тога, сцени ћемо додати позадинску слику свемира, усмерено осветљење и могућност померања камере помоћу тастатуре.
🪐 Новине у другом примеру
- ✔ PShape објекти
- ✔ текстуре планета
- ✔ позадина свемира
- ✔ усмерено светло
- ✔ управљање камером
- ✔ реалистичнији приказ

Слика 1. Реалистичнија симулација Сунца и Земље употребом текстура.
💻 Програм
// 3D objekti (sfere) koji predstavljaju Sunce i Zemlju.
PShape sunce;
PShape zemlja;
// Teksture koje će biti nalepljene na sfere.
PImage teksturaZemlje;
PImage teksturaSunca;
// Slika svemira koja predstavlja pozadinu scene.
PImage pozadina;
// Poluprečnici Sunca i Zemlje.
static final float POLUPRECNIK_ZEMLJE = 25;
static final float POLUPRECNIK_SUNCA = 80;
// Dimenzije orbite.
static final float SIRINA_ORBITE = 600;
static final float VISINA_ORBITE = 600;
// Položaj kamere.
float kameraX = 0;
float kameraY = -150;
float kameraZ = 500;
// Uglovi rotacije.
float ugaoRotacijeZemlje = 0;
float ugaoObilaska = 0;
// Brzine rotacije.
float brzinaRotacijeZemlje = 0.03;
float brzinaObilaska = -0.005;
void setup(){
// Uključivanje 3D renderera.
size(1000,600,P3D);
// Isključivanje iscrtavanja ivica objekata.
noStroke();
// Učitavanje slike svemira.
pozadina = loadImage("svemir1.jpg");
// Kreiranje sfera koje predstavljaju Sunce i Zemlju.
sunce = createShape(SPHERE, POLUPRECNIK_SUNCA);
zemlja = createShape(SPHERE, POLUPRECNIK_ZEMLJE);
// Učitavanje tekstura.
teksturaSunca = loadImage("sunce.jpg");
teksturaZemlje = loadImage("zemlja.jpg");
// Lepljenje tekstura na sfere.
sunce.setTexture(teksturaSunca);
zemlja.setTexture(teksturaZemlje);
}
void draw(){
// Pozadina treba da pokrije ceo prozor.
pozadina.resize(width,height);
// Iscrtavanje pozadine.
background(pozadina);
// Pomeranje koordinatnog sistema u centar prozora.
translate(width/2,height/2);
// Postavljanje kamere.
// Kamera je malo iznad scene i gleda ka koordinatnom početku.
camera(
kameraX,
kameraY,
kameraZ,
0,0,0,
0,0,1
);
// Usmereno svetlo koje osvetljava objekte.
directionalLight(
255,255,100,
-1,0,-1
);
// ==========================
// Crtanje Sunca
// ==========================
shape(sunce);
// ==========================
// Crtanje orbite
// ==========================
pushMatrix();
stroke(255,255,150);
noFill();
// Orbita se postavlja u horizontalnu ravan.
rotateX(HALF_PI);
ellipse(
0,
0,
SIRINA_ORBITE,
VISINA_ORBITE
);
popMatrix();
// ==========================
// Kretanje Zemlje oko Sunca
// ==========================
// Rotira ceo koordinatni sistem oko Sunca.
rotateY(ugaoObilaska);
pushMatrix();
// Pomeranje Zemlje na orbitu.
translate(SIRINA_ORBITE/2,0);
// Rotacija Zemlje oko sopstvene ose.
rotateY(ugaoRotacijeZemlje);
// Crtanje Zemlje.
shape(zemlja);
popMatrix();
// Ažuriranje uglova za sledeći frejm.
ugaoRotacijeZemlje += brzinaRotacijeZemlje;
ugaoObilaska += brzinaObilaska;
}
void keyPressed(){
// Približavanje kamere.
if(keyCode==UP){
kameraZ -= 5;
}
// Udaljavanje kamere.
if(keyCode==DOWN){
kameraZ += 5;
}
// Pomeranje kamere ulevo.
if(keyCode==LEFT){
kameraX -= 5;
}
// Pomeranje kamere udesno.
if(keyCode==RIGHT){
kameraX += 5;
}
// Pomeranje kamere nagore.
if(key=='q'){
kameraY -= 5;
}
// Pomeranje kamere nadole.
if(key=='w'){
kameraY += 5;
}
}
📝 Објашњење програма
Иако је овај програм само нешто дужи од претходног, он уводи велики број нових могућности Processing-а. Највећа разлика је што више не цртамо планете само функцијом sphere(), већ користимо класу PShape која омогућава рад са сложенијим тродимензионалним објектима.
📦 Креирање PShape објеката
На почетку програма дефинишу се два PShape објекта који представљају Сунце и Земљу.
PShape sunce;
PShape zemlja;
Класа PShape представља универзални контејнер за тродимензионалне објекте. Она омогућава додавање текстура, промену изгледа, приказивање модела учитаних из датотека и поновно коришћење истог објекта без његовог поновног креирања.
Предности PShape објеката
- брже исцртавање сложених сцена,
- лакше додавање текстура,
- једноставнија организација програма,
- могућност учитавања 3D модела.
🖼 Учитавање текстура
Да би планете изгледале што реалистичније, користимо фотографије њихове површине. Те фотографије називају се текстуре.
teksturaSunca = loadImage("sunce.jpg");
teksturaZemlje = loadImage("zemlja.jpg");
Функција loadImage() учитава слику са диска и смешта је у објекат типа PImage. Та слика касније може бити постављена као текстура на било који тродимензионални објекат.
🎨 Постављање текстура
sunce.setTexture(teksturaSunca);
zemlja.setTexture(teksturaZemlje);
Функција setTexture() „облаже" површину сфере изабраном сликом. Уместо једнобојне сфере добијамо планету чија површина изгледа веома слично стварној.

Слика 2. Текстура се поставља преко целе површине сфере.
🌌 Позадина свемира
За разлику од првог програма где је позадина била једнобојна, сада користимо фотографију свемира.
pozadina = loadImage("svemir1.jpg");
Пре исцртавања сцене величина слике се прилагођава величини прозора.
pozadina.resize(width,height);
background(pozadina);
Овај поступак омогућава да позадина увек покрива цео прозор без обзира на његове димензије.
💡 Усмерено светло
Уместо тачкастог извора светлости сада користимо directionalLight().
directionalLight(
255,
255,
100,
-1,
0,
-1
);
За разлику од функције pointLight(), код које светлост долази из једне тачке, овде сви светлосни зраци долазе из истог правца. Такав начин осветљења често се користи за симулацију Сунчеве светлости.
pointLight()
Светлост се шири из једне тачке у свим правцима.
directionalLight()
Сви светлосни зраци су паралелни и долазе из истог правца.
🌍 Кретање Земље
Основни принцип кретања није се променио у односу на први пример. Најпре се ротира координатни систем око Сунца, затим се Земља помера до орбите, а након тога ротира око сопствене осе.
rotateY() ↓ translate() ↓ rotateY() ↓ shape()
Једина разлика је што сада уместо функције sphere() исцртавамо већ припремљен PShape објекат.
shape(zemlja);
🎥 Управљање камером
Други програм омогућава кориснику да током рада мења положај камере. То је реализовано у функцији keyPressed().
⬆ ↓
Приближавање и удаљавање камере.
⬅ ➡
Померање камере лево и десно.
Q и W
Померање камере горе и доле.
Захваљујући томе могуће је посматрати сцену из различитих углова и боље разумети распоред објеката у тродимензионалном простору.
⚖ Поређење два примера
Иако оба програма приказују кретање Земље око Сунца, њихова намена није иста. Први пример има задатак да објасни основне принципе рада у тродимензионалном простору, док други приказује како се иста симулација може унапредити додавањем реалистичних елемената.
| Први пример | Други пример |
|---|---|
| Функција sphere() | PShape објекти |
| Једнобојне сфере | Текстуре планета |
| Једноставна позадина | Позадинска слика свемира |
| pointLight() | directionalLight() |
| Нема управљања камером | Камера се помера тастатуром |
| Погодан за почетнике | Погодан за сложеније пројекте |
Први програм треба посматрати као основу за разумевање трансформација, док други показује како се те исте технике користе приликом израде реалистичнијих симулација.
🧪 Предлози за експериментисање
Најбољи начин за учење Processing-а јесте мењање програма и посматрање резултата. Испробајте следеће измене.
🌍 Промените величину Земље
Повећајте или смањите вредност променљиве POLUPRECNIK_ZEMLJE.
☀ Промените величину Сунца
Испробајте различите вредности полупречника Сунца.
🛰 Промените орбиту
Повећајте растојање Земље од Сунца.
⚡ Промените брзине
Испробајте различите брзине ротације и обиласка.
🎥 Поставите нову камеру
Пронађите положај из кога сцена изгледа најреалистичније.
💡 Испробајте другачије осветљење
Промените боју или смер светлости.
⚠ Најчешће грешке
- Заборављен параметар P3D у функцији size().
- Позив translate() после функције camera() на погрешном месту.
- Недостаје pushMatrix() или popMatrix(), па се трансформације преносе на остале објекте.
- Погрешан редослед функција rotate() и translate().
- Текстуре нису учитане јер се слике не налазе у директоријуму data.
- Променљиве које представљају углове не мењају се у функцији draw(), па нема анимације.
📚 Шта можете даље направити?
Када савладате ова два примера, можете постепено проширивати симулацију и додавати нове елементе.
🌕 Додајте Месец
Нека Месец кружи око Земље.
🪐 Додајте још планета
Меркур, Венеру, Марс, Јупитер и остале планете.
🌎 Нагните Земљину осу
Симулирајте стварни нагиб Земљине осе.
🌠 Орбитални траг
Оставите траг кретања планете.
🎥 Камера мишем
Уместо тастатуре омогућите управљање мишем.
☄ Проширите Сунчев систем
Направите комплетну симулацију свих планета.
📝 Мини квиз
- Који параметар укључује тродимензионални режим рада у Processing-у?
- Која функција поставља положај камере?
- Чему служи функција translate()?
- Која функција ротира објекат око осе?
- Која функција исцртава сферу?
- Чему служи pushMatrix()?
- Шта представља класа PShape?
- Која функција поставља текстуру на објекат?
- Која је разлика између pointLight() и directionalLight()?
- Зашто се вредности углова повећавају у функцији draw()?
💻 Задаци за самосталан рад
Покушајте да самостално проширите програм решавањем следећих задатака.
- Додајте Месец који кружи око Земље.
- Додајте Марс и омогућите му независну орбиту.
- Промените кружну орбиту у елиптичну.
- Прикажите нагиб Земљине осе од приближно 23,5°.
- Додајте Сатурн са прстеном.
- Омогућите промену брзине кретања помоћу тастера.
- Додајте звезде које се насумично појављују у позадини.
- Омогућите да се камера ротира око Сунца.
🎯 Закључак
У овој лекцији научили сте како се у Processing-у могу креирати тродимензионалне симулације коришћењем P3D рендера. Кроз два практична примера упознали сте примену геометријских објеката, трансформација, осветљења, текстура, класе PShape и камере. Иако је приказан само модел Земље и Сунца, исти принципи могу се применити на израду много сложенијих симулација које укључују комплетан Сунчев систем, кретање вештачких сателита, физичке експерименте или едукативне апликације.
Савладавањем ових техника стекли сте добру основу за даље проучавање рачунарске графике, симулација и развоја интерактивних 3D апликација у Processing-у.