Jump to content

  • Log In with Google      Sign In   
  • Create Account

#ActualJossos

Posted 18 April 2013 - 05:18 AM

Here is a screenshot of my program and the problem I'm having:

 

myappnotworking.jpg

(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:

 

myappnotworking.jpg

(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:

 

myappnotworking.jpg

(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:

 

myappnotworking.jpg

(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