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.