Skrolli 2018.3: Näin syntyi Assembly-demo
Linkit
- Demo YouTubessa:: https://www.youtube.com/watch?v=zHKZNlpa__U
- Paras resurssi modernin OpenGL:n opetteluun: https://learnopengl.com
Listaukset
vector<float> radii; // Säteet
vector<float> radii_phases; // Säteiden vaiheet
vector<float> speeds; // Nopeudet
vector<float> angles; // Kulmat
Listaus 1:
void initialize(){
for(int i = 0; i < n; i++){
int beam = (rand() % 16); // Satunnainen haara
float dir = rand() % 2 == 0 ? 1 : -1; // Suunta: myötä- tai vastapäivään
radii.push_back(rand_float() * maxradius); // Satunnaisluku väliltä [0,maxradius]
radii_phases.push_back(rand_float() * M_PI); // Satunnainen vaihe väliltä [0,pii]
angles.push_back(rand_float() / 5.0f); // Vähän vaihtelua alkukulmaan
speeds.push_back(dir * (beam + 5 * (maxradius - radius) / maxradius) / 10.0f);
}
}
Listaus 2:
// t: ajanhetki
// dt: kulunut aika viime päivityksestä
void update(float t, float dt){
for(int i = 0; i < Scene::get().gems.size(); i++){
angles[i] += speeds[i] * dt; // Päivitä kulma
float r = radii[i] + sin((t + radii_phases[i]) * 4.0f); // Päivitä säde
vec3 pos = center + cos(angles[i]) * right * r + sin(angles[i]) * up * r; // Laske sijainti
Scene::get().gems[i].pos = pos; // Päivitä sijainti
Scene::get().gems[i].color = vec3(abs(sin(t))*0.1f,abs(cos(speeds[i])) * 0.5f, abs(sin(speeds[i]))); // Päivitä väri
}
Scene::get().light_intensity = 2.0f + abs(sin(t)); // Päivitä valon kirkkaus
}
Listaus 3:
get_position(float t, // Aika
vec3 up, // Ylös-suunta tornadon koordinaatistossa
vec3 right, // Oikealle-suunta tornadon koordinaatistossa
vec3 forward, // Eteenpäin-suunta tornadon koordinaatistossa
vec3 center, // Kappaleen ympyräradan keskipiste
float r, // Kappaleen ympyräradan säde
float speed, // Kappaleen kulmanopeus
float angle_phase, // Kappaleen kulma ajanhetkellä 0
float height_phase) // Kappaleen korkeus-siirtymä ajanhetkellä 0
{
return center + cos(speed*t + angle_phase) * r * right +
10 * sin(t + height_phase) * up +
sin(speed*t + angles_phase) * r * forward;
}