Ray Intersection

Started by
4 comments, last by Dmytry 19 years, 8 months ago
Well I found a piece of code, that proccesses ray to sphere intersection. But I am not sure I understand it completely. I have tested it with a ray that has origin in 0 and direction (1,0,0). The sphere (_bs) has a position of (5,0,0) and a radious of 1.5. With this setup it fails at test 3. Wich I dont see why it should. What am I doing wrong?...

public final boolean intersect(Ray ray) {
		
		
		float dx = _ps.get_position().getX() - ray.get_origin().getX();
		float dy = _ps.get_position().getY() - ray.get_origin().getY();
		float dz = _ps.get_position().getZ() - ray.get_origin().getZ();
	  
		float v = Vector3.dot(ray.get_direction(), new Vector3(dx, dy, dz));
	 

		// Do the following quick check to see if there is even a chance
		// that an intersection here might be closer than a previous one
		if (v -_radius > ray.getT())
		   return false;
		// Test if the ray actually intersects the sphere
		double t = this._radSqr + v*v - dx*dx - dy*dy - dz*dz;
		if (t < 0)
		  return false;

		// Test if the intersection is in the positive
		// ray direction and it is the closest so far
		t = v - ((float) Math.sqrt(t));
		System.out.println("hum"+ t);
		if ((t > ray.getT()) || (t < 0))
		  return false;

		ray.setT((float)t);
	//	ray._asterHit= this;
	   
		return true;	
	
	}


Advertisement
im too lazy to completely check your code, but this is what i use for sphere intersection:

	public bit SolidHitTrace(Ray ray){		//relative distance		ray.pos.x = Void.World.Position.x - ray.pos.x;		ray.pos.y = Void.World.Position.y - ray.pos.y;		ray.pos.z = Void.World.Position.z - ray.pos.z;				//sphere check		float A, B, C, D;		A = (ray.dir.x*ray.dir.x + ray.dir.y*ray.dir.y + ray.dir.z*ray.dir.z);		B = (ray.pos.x*ray.dir.x + ray.pos.y*ray.dir.y + ray.pos.z*ray.dir.z) * 2;		C = (ray.pos.x*ray.pos.x + ray.pos.y*ray.pos.y + ray.pos.z*ray.pos.z) - (Radius*Radius);		D = (B*B) - (4*A*C);				if (D >= 0){			if (ray.infinite){				if ((B * fabs(B) + D > 0)) return true;			}else{				C = B - 2 * A;				//if    not behind ray    &&    not too far away				if ((B * fabs(B) + D > 0) && (C * fabs(C) - D < 0)) return true;			}		}		return false;	}

if the ray is infinite it means it is checked for t=0..infinity, non infinite means a linesegment from t=0..1, usefull for shadowrays for example.

the rest should all be pretty obvious.

note how i used my l33t math skills to remove all sqrts [grin]
cool stuff

I want to

1) Either check with an infinite ray and get the point on the ray where it intersects with the sphere

2)use a limited ray and get the point of intersection?.. can I do that?
I'm using
//// Ray-sphere intersection routine. // p=(ray origin position - sphere position),// d=ray direction,// r=sphere radius,// i1=first intersection distance,// i2=second intersection distance// i1<=i2// i1>=0// returns true if intersection found,false otherwise.// bool RaySphereIntersect(const Vec3d &p, const Vec3d &d,real64 r, real64 &i1, real64 &i2){	real64 det,b;	b = -DotProd(p,d);	det=(b*b) - (p.x*p.x + p.y*p.y + p.z*p.z) + r*r;	if (det<0){		return false;	}//else	det= sqrt(det);	i1= b - det;	i2= b + det;	// intersecting with ray?	if(i2<0) return false;	if(i1<0)i1=0;	return true;};

clean and readable :).I prefer not to pass two parameters if i can just pass their difference.
Ah so first and second intersection distance is the ray punching through the sphere in both sided?
yes,exactly :) Also it returns zero for first intersection if you're inside sphere. I really used both results :)

This topic is closed to new replies.

Advertisement