Estoy tratando de atravesar un árbol 3D KD en mi raytracer. The Tree es correcto, pero parece que hay algo mal con mi algoritmo transversal, ya que estoy obteniendo algunos errores en comparación con el uso de un enfoque de fuerza bruta (algunas áreas pequeñas parecen ser ignoradas).KD-Tree transversal (raytracing): ¿me falta un caso?
Nota: ninguno de los rayos en cuestión es paralelo a ningún eje.
Ésta es mi algoritmo de recorrido:
IntersectionData* intersectKDTree(const Ray &ray, KDTreeNode* node, double tMin, double tMax) const{
if (node->GetObjectCount()==0) return 0;
IntersectionData* current = 0;
bool intersected = false;
if (node->m_isLeaf){
...test all primitives in the leaf...
}
else{
int axis = node->m_splitAxis;
double splitPos = node->m_splitPos;
double tSplit = (splitPos-ray.point[axis])/ray.direction[axis];
KDTreeNode* nearNode = ray.point[axis]<splitPos?node->m_leftnode:node->m_rightnode;
KDTreeNode* farNode = ray.point[axis]<splitPos?node->m_rightnode:node->m_leftnode;
if (tSplit > tMax)
return intersectKDTree(ray, nearNode , tMin, tMax);//case A
else if (tSplit < tMin){
if(tSplit>0)
return intersectKDTree(ray, farNode, tMin, tMax);//case B
else if(tSplit<0)
return intersectKDTree(ray, nearNode, tMin,tMax);//case C
else{//tSplit==0
if(ray.direction[axis]<0)
return intersectKDTree(ray, farNode, tMin, tMax);//case D
else
return intersectKDTree(ray, nearNode, tMin, tMax);//case E
}
}
else{
if(tSplit>0){//case F
current = intersectKDTree(ray, nearNode, tMin, tSplit);
if (current != 0)
return current;
else
return intersectKDTree(ray, farNode, tSplit, tMax);
}
else{
return intersectKDTree(ray,nearNode,tSplit, tMax);//case G
}
}
}
}
que creó un gráfico con todos los casos diferentes:
alt text http://neo.cycovery.com/KDTree_traversal.jpg
me estoy perdiendo un caso?
gracias por la ayuda!
¿Alguna idea sobre el autor o el nombre del periódico? El enlace parece haber dejado de funcionar. – Arend
ftp://ftp.cs.utexas.edu/.snapshot/backup/pub/techreports/tr88-07.pdf – gamers2000
Como el segundo enlace también está muerto, rastreé el artículo nuevamente. [Rastreo rápido de rayos utilizando árboles KD] (ftp://ftp.cs.utexas.edu/pub/techreports/tr88-07.pdf) Donald Fussell, KR Subramanian Departamento de Ciencias de la Computación Universidad de Texas en Austin marzo de 1988 – winnetou