diff --git a/projet-code/scenes_inf443/base/base.exe b/projet-code/scenes_inf443/base/base.exe index f74f65cd0f787e75efac0d42bc582eab637f05cf..24701fe16285e7387caa880fbddff8396332114f 100644 Binary files a/projet-code/scenes_inf443/base/base.exe and b/projet-code/scenes_inf443/base/base.exe differ diff --git a/projet-code/scenes_inf443/base/src/ball.cpp b/projet-code/scenes_inf443/base/src/ball.cpp index f84adfd4bd497287f206ceaa71c74186f629b157..1064ece39acd2b27914cb8a0e090e8b304e8d159 100644 --- a/projet-code/scenes_inf443/base/src/ball.cpp +++ b/projet-code/scenes_inf443/base/src/ball.cpp @@ -21,7 +21,7 @@ void ball::initialize() void ball::simulate(float dt, float terrain_length) { for (int i = 0; i < N; i++) { if (pos[i][2] < -1 || cgp::abs(pos[i][0]) > terrain_length / 2 || cgp::abs(pos[i][1]) > terrain_length / 2) { - pos[i] = { 0,0, evaluate_terrain_height(0,0) }; + pos[i] = { 0,0, evaluate_terrain_height(0,0, terrain_length) }; v[i] = { 3 * rand_interval(), 3 * rand_interval(), 4 + i }; } else { @@ -29,8 +29,8 @@ void ball::simulate(float dt, float terrain_length) { v[i][2] -= 10 * dt; } - if (pos[i][2] < evaluate_terrain_height(pos[i][0], pos[i][1])) { - vec3 normal = normalize(terrain_orientation(pos[i][0], pos[i][1])); + if (pos[i][2] < evaluate_terrain_height(pos[i][0], pos[i][1], terrain_length)) { + vec3 normal = normalize(terrain_orientation(pos[i][0], pos[i][1], terrain_length)); v[i][2] += 10 * dt; vec3 temp = v[i] - dot(v[i], normal) * normal; @@ -42,11 +42,11 @@ void ball::simulate(float dt, float terrain_length) { } } -vec3 terrain_orientation(float x, float y) { - float z = evaluate_terrain_height(x, y); +vec3 terrain_orientation(float x, float y, float terrain_length) { + float z = evaluate_terrain_height(x, y, terrain_length); float step = 0.1f; - vec3 u = { step, 0, evaluate_terrain_height(x + step,y) - z }; - vec3 v = { 0, step, evaluate_terrain_height(x,y + step) - z }; + vec3 u = { step, 0, evaluate_terrain_height(x + step,y, terrain_length) - z }; + vec3 v = { 0, step, evaluate_terrain_height(x,y + step, terrain_length) - z }; return cross(v, u); } diff --git a/projet-code/scenes_inf443/base/src/ball.hpp b/projet-code/scenes_inf443/base/src/ball.hpp index a1c8db3ce42b91111929ab6ec585972a1bf4194b..03af3f623ec71431f17beffdb9d37a96107f73cd 100644 --- a/projet-code/scenes_inf443/base/src/ball.hpp +++ b/projet-code/scenes_inf443/base/src/ball.hpp @@ -17,5 +17,5 @@ struct ball { void simulate(float dt, float terrain_length); }; -vec3 terrain_orientation(float x, float y); +vec3 terrain_orientation(float x, float y, float terrain_length); diff --git a/projet-code/scenes_inf443/base/src/scene.cpp b/projet-code/scenes_inf443/base/src/scene.cpp index 2a6246698bf58eb0889b92f1c1f0e50fc0375b56..1e025007df9b3b8a8e641db619ea438eedac77ba 100644 --- a/projet-code/scenes_inf443/base/src/scene.cpp +++ b/projet-code/scenes_inf443/base/src/scene.cpp @@ -11,7 +11,7 @@ int num_trees = 50; int num_grass = 100; std::vector<vec3> tree_position; std::vector<vec3> grass_position; -float terrain_length = 20; +float terrain_length = 50; void scene_structure::initialize() { @@ -55,7 +55,7 @@ void scene_structure::initialize() float x = 1.0; float y = 2.0; - tree.model.translation = { x, y, evaluate_terrain_height(x,y) }; + tree.model.translation = { x, y, evaluate_terrain_height(x,y, terrain_length) }; tree_position = generate_positions_on_terrain(num_trees, terrain_length-1); @@ -119,9 +119,12 @@ void scene_structure::display_frame() //custom function we added to ..first_person_eulor, changes whether the cursor is trapped or not camera_control.trap_cursor(gui.trap_cursor); - vec3 eye_level = camera_control.camera_model.position_camera; - eye_level[2] = evaluate_terrain_height(eye_level[0], eye_level[1]) + 0.75; - camera_control.camera_model.position_camera = eye_level; + //Walking on ground + if (!gui.fly) { + vec3 eye_level = camera_control.camera_model.position_camera; + eye_level[2] = evaluate_terrain_height(eye_level[0], eye_level[1], terrain_length) + 0.75; + camera_control.camera_model.position_camera = eye_level; + } // Set the light to the current position of the camera environment.light = camera_control.camera_model.position(); @@ -284,6 +287,7 @@ void scene_structure::display_gui() ImGui::Checkbox("Frame", &gui.display_frame); ImGui::Checkbox("Wireframe", &gui.display_wireframe); ImGui::Checkbox("Trapped Cursor", &gui.trap_cursor); + ImGui::Checkbox("Fly", &gui.fly); ImGui::SliderFloat("Time", &timer_mvt.t, timer_mvt.t_min, timer_mvt.t_max); ImGui::SliderFloat("Time scale", &timer_mvt.scale, 0.0f, 2.0f); diff --git a/projet-code/scenes_inf443/base/src/scene.hpp b/projet-code/scenes_inf443/base/src/scene.hpp index 25b5280daed873d51875ad44c63a80999c115a82..dd142fee9b9b2730dc97f9193d4719f7265eb694 100644 --- a/projet-code/scenes_inf443/base/src/scene.hpp +++ b/projet-code/scenes_inf443/base/src/scene.hpp @@ -23,6 +23,7 @@ struct gui_parameters { bool display_wireframe = false; float k = 0.5f; bool trap_cursor = true; + bool fly = false; }; // The structure of the custom scene diff --git a/projet-code/scenes_inf443/base/src/terrain.cpp b/projet-code/scenes_inf443/base/src/terrain.cpp index 98ff20e26d3d3ec98660512783f314d6bb4d59a3..4b05afa3a14c5e5f6435521a2165f1e374a6856f 100644 --- a/projet-code/scenes_inf443/base/src/terrain.cpp +++ b/projet-code/scenes_inf443/base/src/terrain.cpp @@ -6,20 +6,29 @@ using namespace cgp; // Evaluate 3D position of the terrain for any (x,y) -float evaluate_terrain_height(float x, float y) +float evaluate_terrain_height(float x, float y, float terrain_length) { + //p, h, sigma -> positions, heights and wideness of bell curves vec2 p[] = { {-10, -10}, {5, 5}, {-3, 4}, {6, 4} }; float h[] = { 3.0f, -1.5f, 1.0f, 2.0f }; float sigma[] = { 10.0f, 3.0f, 4.0f, 4.0f }; - float noise = 0.4*noise_perlin(vec2(x/50,y/50), 4.5f, 0.5, 5.0f); - float z = 0; for (int i = 0; i < 4; i++) { float d = norm(vec2(x, y) - p[i]) / sigma[i]; z += h[i] * std::exp(-d * d); } - z += noise; - return z; + + perlin_noise_parameters parameters; + parameters.terrain_height = 6.03; + parameters.octave = 5; + parameters.frequency_gain = 2.89; + parameters.persistency = 0.39; + + + float perlin_noise = parameters.terrain_height * noise_perlin(vec2(x / terrain_length, y / terrain_length), parameters.octave, parameters.persistency, parameters.frequency_gain); + + + return perlin_noise; } @@ -44,7 +53,7 @@ mesh create_terrain_mesh(int N, float terrain_length) float y = (v - 0.5f) * terrain_length; // Compute the surface height function at the given sampled coordinate - float z = evaluate_terrain_height(x,y); + float z = evaluate_terrain_height(x,y, terrain_length); // Store vertex coordinates terrain.position[kv+N*ku] = {x,y,z}; @@ -81,7 +90,7 @@ std::vector<cgp::vec3> generate_positions_on_terrain(int N, float terrain_length for (int i = 0; i < N; i++) { x = rand_interval(-d, d); y = rand_interval(-d, d); - rand_pos.push_back({ x,y, evaluate_terrain_height(x, y) }); + rand_pos.push_back({ x,y, evaluate_terrain_height(x, y, terrain_length) }); } return rand_pos; diff --git a/projet-code/scenes_inf443/base/src/terrain.hpp b/projet-code/scenes_inf443/base/src/terrain.hpp index 757b2ae0136a47595db5b8c5fd7570ac408e92a6..96f8be2b972e2a9996042d5c16ab7d54f983d5df 100644 --- a/projet-code/scenes_inf443/base/src/terrain.hpp +++ b/projet-code/scenes_inf443/base/src/terrain.hpp @@ -2,8 +2,15 @@ #include "cgp/cgp.hpp" +struct perlin_noise_parameters +{ + float persistency = 0.35f; + float frequency_gain = 2.0f; + int octave = 6; + float terrain_height = 0.5f; +}; -float evaluate_terrain_height(float x, float y); +float evaluate_terrain_height(float x, float y, float terrain_length); /** Compute a terrain mesh The (x,y) coordinates of the terrain are set in [-length/2, length/2].