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; }
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; }
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 ¤tVector = 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; }