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; }