summaryrefslogtreecommitdiffstats
path: root/dev/a6-harold/ground.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dev/a6-harold/ground.cc')
-rw-r--r--dev/a6-harold/ground.cc40
1 files changed, 26 insertions, 14 deletions
diff --git a/dev/a6-harold/ground.cc b/dev/a6-harold/ground.cc
index 51d4d92..969e2d0 100644
--- a/dev/a6-harold/ground.cc
+++ b/dev/a6-harold/ground.cc
@@ -164,18 +164,27 @@ void Ground::ReshapeGround(const Matrix4 &view_matrix, const Matrix4 &proj_matri
// should pass through these two points on the ground. The plane should also
// have a normal vector that points toward the camera and is parallel to the
// ground plane.
+ int first_point = 0;
+ int last_point = stroke2d.size()-1;
+ Point3 start, end;
+ ScreenPtHitsGround(view_matrix, proj_matrix, stroke2d[first_point], &start);
+ ScreenPtHitsGround(view_matrix, proj_matrix, stroke2d[last_point], &end);
+ Vector3 plane_x = Vector3::Normalize(start - end);
+ Vector3 plane_y = Vector3(0, 1, 0);
+ Vector3 plane_normal = Vector3::Normalize(-look);
-
-
-
-
// 2. Project the 2D stroke into 3D so that it lies on the "projection plane"
// defined in step 1.
-
-
-
-
-
+ std::vector<Point3> stroke3d;
+ for (int i = 0; i < last_point; i++) {
+ Point3 pt3d;
+ Point3 mouseIn3d = GfxMath::ScreenToNearPlane(view_matrix, proj_matrix, stroke2d[i]);
+ Ray eyeThroughMouse = Ray(eye, (mouseIn3d - eye).ToUnit());
+ float time;
+ eyeThroughMouse.IntersectPlane(start, plane_normal, &time, &pt3d);
+ stroke3d.push_back(pt3d);
+ }
+
// 3. Loop through all of the vertices of the ground mesh, and adjust the
// height of each based on the equations in section 4.5 of the paper, also
// repeated in the assignment handout. The equations rely upon a function
@@ -186,11 +195,14 @@ void Ground::ReshapeGround(const Matrix4 &view_matrix, const Matrix4 &proj_matri
Point3 P = ground_mesh_.read_vertex_data(i); // original vertex
// adjust P according to equations...
-
-
-
-
-
+ float h = hfunc(plane_normal, stroke3d, P);
+ float wd = 0;
+ float d = P.DistanceToPlane(start, plane_normal);
+ if (1 - pow(d / 5, 2) > 0)
+ wd = 1 - pow(d / 5, 2);
+ if (h != 0)
+ P = Point3(P[0], (1 - wd) * P[1] + wd * h, P[2]);
+
new_verts.push_back(P);
}
ground_mesh_.SetVertices(new_verts);