• Create Account

### #ActualJossos

Posted 18 April 2013 - 05:18 AM

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.

### #3Jossos

Posted 18 April 2013 - 05:17 AM

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.

### #2Jossos

Posted 18 April 2013 - 05:15 AM

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.

### #1Jossos

Posted 13 April 2013 - 10:10 PM

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(float nx, float ny, float nz, // normals coord
float sx, float sy, float sz, // start point
float dx, float dy, float dz, // direction vector
vector3d p1, vector3d p2, vector3d p3, vector3d p4, float* dist, vector3d* point)
{
// Dot product of the normal vector and the direction vector
float a = dx*nx + dy*ny + dz*nz;

if (a == 0)			// If the ray is parallel to the plane
return false;

float t = ((p1.x*nx + p1.y*ny + p1.z*nz - nx*sx - ny*sy - nz*sz) / a);
if (t < 0)
return false;

// The intersection of the plane
float x = sx + t*dx;
float y = sy + t*dy;
float z = sz + t*dz;
vector3d cp(x,y,z);

/*** NOTE: I had to reduce the check to 0.001 from 0.00001. Apparently windows 64-bit has trouble with float accuracy. ***/

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)
{
if (dist != NULL)
{
(*dist) = t;
if (point != NULL)
{
point->x = x;
point->y = y;
point->z = z;
}
}
return true;
}
return false;
}


It checks each of the two triangles that make up each tile(quad) for an intersection.

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(0.0, 1.0, 0.0, mousePosNear.x, mousePosNear.y, mousePosNear.z,
mousePosFar.x, mousePosFar.y, mousePosFar.z, 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.

PARTNERS