Picking up stuff from 3D-space with mouse rays
Okay so I finally have it figured out thanks to the nice people at microsoft.public.win32.programmer.directx.managed newsgroup.
I'll just post the code here too in case someone else might someday run into a similar problem, and to be honest, there are no good examples of doing this unless you're using a Mesh object.
//Checks if point P is inside the plane
internal bool PointIntersects(Point p, Device d, out IntersectInformation intersectInfo)
{
//Create near and far vectors from the Point location
Vector3 near = new Vector3(p.X, p.Y, 0);
Vector3 far = new Vector3(p.X, p.Y, 1);
//Unproject the vectors into world coordinates
near.Unproject(d.Viewport,
d.Transform.Projection,
d.Transform.View, Matrix.Translation(location));
far.Unproject(d.Viewport,
d.Transform.Projection,
d.Transform.View, Matrix.Translation(location));
//Calculate the direction of the ray from the vectors
Vector3 dir = Vector3.Subtract(far, near);
//Set up the locations of the vertices
//in the first triangle in the quad
Vector3 loc1 = location; //Bottom left
Vector3 loc2 = new Vector3(location.X,
location.Y + size.Height, location.Z); //top left
Vector3 loc3 = new Vector3(location.X+size.Width,
location.Y, location.Z); //bottom right
//check for intersection
bool intersection = Geometry.IntersectTri(loc1, loc2, loc3,
near, dir, out intersectInfo);
//If we didn't find an intersection in the first triangle,
//check the second
if (!intersection)
{
//Set loc1 to the coordinate of the top right vertex
loc1 = new Vector3(location.X + size.Width,
location.Y + size.Height, location.Z);
//Check the other triangle
intersection = Geometry.IntersectTri(loc2, loc1, loc3,
near, dir, out intersectInfo);
}
return intersection;
}
I used that inside my Plane class which is used for rendering 2D-like quads.
1 Comments:
near and far are both on a straight
line from the camera origin
so you can drop the near from this and get the same result (ie: a direction vector from the camera)
Vector3 dir = new Vector3(p.X, p.Y, 1);
//Unproject the vectors into world coordinates
dir.Unproject(d.Viewport,
d.Transform.Projection,
d.Transform.View, Matrix.Translation(location));
same result
By Anonymous, at 4:31 PM
Post a Comment
<< Home