Hello! I’m writing a documentation about planar projected shadow algorithm. I have to write how I get the projection matrix from light position and the plane’s equation, but I can’t find any documentation that tells this. Can someone help me?
Well, the plane has a normal and offset(the plane equation) and the light source has a direction. So essentially, you want everything smushed onto the plane using the direction as the smushing direction. This is a 3D to 2D projection, so there are many possible correct answers.
Try doing this in 2D first, project some test points onto a line on the page, using a random direction vector. This would be the 2D to 1D projection. Extend what you’ve learned to the third coordinate.
OR if you want to cheat NeHe has a project on this, and its also in the back of the RedBook.
Thanks for your help.
For planar shadows you need to project a set of points(your mesh) onto a plane under a certain direction. This is the same as finding the intersection between a line and a plane.
For a point in space V0, you will find its projection point V1 on a plane P by solving the intersection between line l and P where v is the direction of projection.
l = V0 + v(t)
P = n.V1 + d
Intersection occurs when
V1 = V0 + v(t)
and V1 lies in P
n.V1 + d = 0
To solve, insert V0+v(t) into P and solve for t. This will give you an expression of t in V0. Then insert expression for t into V1 = V0 + v(t) and resolve into the form V1 = X*V0 where X will be your projection matrix.
Thanks. I think I understand.
This equation projects a point onto an arbitary plane:
s = v - ((n.v - d) / (n.l)) l
where v is a point in space
d is the plane’s offset
n is the plane’s normal
l is the projection direction
Resolving this into a matrix (with columns I, J, K and T) gives:
float dotInv = 1.0f / (n.x * l.x + n.y * l.y + n.z * l.z);
matrix.I.x = 1.0f - n.x * l.x * dotInv;
matrix.I.y = -n.x * l.y * dotInv;
matrix.I.z = -n.x * l.z * dotInv;
matrix.J.x = -n.y * l.x * dotInv;
matrix.J.y = 1.0f - n.y * l.y * dotInv;
matrix.J.z = -n.y * l.z * dotInv;
matrix.K.x = -n.z * l.x * dotInv;
matrix.K.y = -n.z * l.y * dotInv;
matrix.K.z = 1.0f - n.z * l.z * dotInv;
matrix.T.x = n.w * l.x * dotInv;
matrix.T.y = n.w * l.y * dotInv;
matrix.T.z = n * l.z * dotInv;
But you’d better check, since it’s been a while since I tried this.
Sorry, those last few lines should read
matrix.T.x = d * l.x * dotInv;
matrix.T.y = d * l.y * dotInv;
matrix.T.z = d * l.z * dotInv;