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].