Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


#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