Here is a screenshot of my program and the problem I'm having:
(I drew the mouse in yellow to show the problem since print screen doesn't copy the cursor)
At the 1,1 tile coordinate, the mouse ray-plane function works just fine. But as I venture out accross the map, the offset gets more and more extreme, and I have no idea why this is happening.
Here is my rayplane function (returns true if there's an intersection):
bool rayplane(vector3d n, vector3d s, vector3d d, vector3d p1, vector3d p2, vector3d p3, vector3d p4, float* dist, vector3d* point)
{
// Dot product of the normal vector and the direction vector
float a = d.x*n.x + d.y*n.y + d.z*n.z;
if (a == 0) // If the ray is parallel to the plane
return false;
float t = (((p1.x*n.x + p1.y*n.y + p1.z*n.z) - (n.x*s.x + n.y*s.y + n.z*s.z)) / a);
if (t < 0)
return false;
// The intersection of the plane
float x = s.x + t*d.x;
float y = s.y + t*d.y;
float z = s.z + t*d.z;
vector3d cp(x,y,z); // Collision point - The problem is this result - Everything after this point works correctly.
/*** The < 0.00001 corrects for precision innacuracies ***/
if (abs(trianglearea(p1,p3,p4)-trianglearea(p1,p4,cp)-trianglearea(p1,p3,cp)-trianglearea(p3,p4,cp))<0.00001 ||
abs(trianglearea(p1,p2,p3)-trianglearea(p1,p2,cp)-trianglearea(p2,p3,cp)-trianglearea(p1,p3,cp))<0.00001)
return true;
return false;
}
It checks each of the two triangles that make up each tile(quad) for an intersection. n = normal vector (I set this to (0, 1, 0) for a normal facing up. s = start point, d = direction point and p1 - p4 is each vertex of the quad.
The trianglearea Function:
float trianglearea(vector3d p1, vector3d p2, vector3d p3)
{
// sqrt(s^2 + b^2 + c^2)
// a, b and c are the lengths of the triangle sides
float a = sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*(p2.z-p1.z));
float b = sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)+(p3.z-p2.z)*(p3.z-p2.z));
float c = sqrt((p3.x-p1.x)*(p3.x-p1.x)+(p3.y-p1.y)*(p3.y-p1.y)+(p3.z-p1.z)*(p3.z-p1.z));
float s = (a+b+c)/2;
return (sqrt(s*(s-a)*(s-b)*(s-c)));
}
And here is how the Rayplane function is used in the program (the mouse coord is converted to world coords prior, as is the far coord):
if (rayplane(vector3d(0.0, 1.0, 0.0), mousePosNear, mousePosFar, vector3d(0.0 + i, 0.0, 0.0 + j),
vector3d(1.0 + i, 0.0, 0.0 + j),
vector3d(1.0 + i, 0.0, 1.0 + j),
vector3d(0.0 + i, 0.0, 1.0 + j)))
{
...Do stuff
}
Help is always appreciated.