Exemplo n.º 1
0
bool Grid::intersect(const Ray &r, Hit &h, float tmin)
{
    //Prepare the Material objects
    Vec3f diffuseColor(1, 1, 1);
    Vec3f specularColor(0, 0, 0);
    float exponent = 1;
    Vec3f reflectiveColor(0, 0, 0);
    Vec3f transparentColor(0, 0, 0);
    float indexOfRefraction = 1;
    PhongMaterial *m = new PhongMaterial(diffuseColor, specularColor, exponent,
            reflectiveColor, transparentColor, indexOfRefraction);

    //Start to do DDA
    MarchingInfo mi;
    initializeRayMarch(mi, r, tmin);

    bool hitSomething = false;
    int i, j, k;
    do {
        mi.getIndices(i, j, k);
        
        printf("The current point is:%d,%d,%d\n", i, j, k);

        if (mObjects[offset(i, j, k)].getNumObjects() > 0) {
            h.set(mi.get_tmin(), m, mi.getNormal(), r);
            return true;
        }

        mi.nextCell();
    } while(i < mXSize && j < mYSize && k < mZSize);
    return false;
}
Exemplo n.º 2
0
bool Grid::intersect(const Ray &r, Hit &h, float tmin)
{
	MarchingInfo march;
	initialRayMarch(march,r,tmin);

	int currentI = march.GetI();
	int currentJ = march.GetJ();    
	int currentK = march.GetK();
	float currentT = march.GetT();
	int numObjects;
	//Object3DVector currentVector; 绝对不能新建一个Object3DVector,然后把isOpaque的值赋给这个Object3DVector,因为当这个函数结束时,会把Object3DVector销毁,对应的指针指向的对象也会被销毁。
	//当然还有一种方法是定义一个Object3DVector指针
	//printf("i:%d j:%d currentI:%d currentJ:%d currentK:%d\n",i,j,currentI,currentJ,currentK);

	Object3DVector isAlreadyIntersect;

	while(currentI>=0 && currentI<nx && currentJ>=0 && currentJ<ny && currentK>=0 && currentK<nz)
	{
		RayTracingStats::IncrementNumGridCellsTraversed();
		Object3DVector* currentVector = &isOpaque[currentI][currentJ][currentK];
		numObjects = currentVector->getNumObjects();
		//printf("%d %d %d\n",currentI,currentJ,currentK);
		for(int i=0; i<numObjects; ++i)
		{
			//already intersected object don't need intersect again
			if(isAlreadyIntersect.isInside(currentVector->getObject(i)))
				continue;
			RayTracingStats::IncrementNumIntersections();
			currentVector->getObject(i)->intersect(r,h,tmin);
			isAlreadyIntersect.addObject(currentVector->getObject(i));
		}
		if(h.getMaterial()!=NULL && h.getT()>=currentT && h.getT()<=march.GetNext_x() && h.getT()<=march.GetNext_y() && h.getT()<=march.GetNext_z())
		{
			return true;
		}

		march.nextCell();
		currentI = march.GetI();
		currentJ = march.GetJ();
		currentK = march.GetK();
		currentT = march.GetT();  //折射或反射,shadow时,光线圆点会在grid内
	}
	numObjects = others.getNumObjects();
	for(int i=0; i<numObjects; i++)
	{
		others.getObject(i)->intersect(r,h,tmin);
	}
	if(h.getMaterial()!=NULL)   //这里有问题,因为如果没有和平面相交的话,h的material也有可能不是null
		return true;

	return false;
}
Exemplo n.º 3
0
bool Grid::shadowIntersect(const Ray &r, Hit &h, float tmin)
{
	MarchingInfo march;
	initialRayMarch(march,r,tmin);

	int currentI = march.GetI();
	int currentJ = march.GetJ();    
	int currentK = march.GetK();
	float currentT = march.GetT();
	int numObjects;

	Object3DVector isAlreadyIntersect;

	while(currentI>=0 && currentI<nx && currentJ>=0 && currentJ<ny && currentK>=0 && currentK<nz)
	{
		RayTracingStats::IncrementNumGridCellsTraversed();
		Object3DVector &currentVector = isOpaque[currentI][currentJ][currentK];
		numObjects = currentVector.getNumObjects();
		for(int i=0; i<numObjects; ++i)
		{
			if(isAlreadyIntersect.isInside(currentVector.getObject(i)))
				continue;
			RayTracingStats::IncrementNumIntersections();
			if(currentVector.getObject(i)->intersect(r,h,tmin))
				return true;
			isAlreadyIntersect.addObject(currentVector.getObject(i));
		}
		march.nextCell();
		currentI = march.GetI();
		currentJ = march.GetJ();
		currentK = march.GetK();
		currentT = march.GetT();  //折射或反射,shadow时,光线圆点会在grid内
	}
	numObjects = others.getNumObjects();
	for(int i=0; i<numObjects; i++)
	{
		if(others.getObject(i)->intersect(r,h,tmin))
			return true;
	}
	return false;
}