J'essaie de traverser un 3D KD-Tree dans mon raytracer. L'arbre est correct, mais il semble y avoir quelque chose qui ne va pas dans mon algorithme de traversée, car j'ai des erreurs par rapport à l'approche par force brute (certaines petites surfaces semblent être ignorées).KD-Tree traversal (raytracing) - Ai-je manqué un étui?
Note: aucun des rayons en question est parallèle à un axe quelconque.
Ceci est mon algorithme traversal:
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
}
}
}
}
J'ai créé un graphique avec tous les différents cas:
alt text http://neo.cycovery.com/KDTree_traversal.jpg
Suis-je manque un cas?
merci de votre aide!
Une idée sur l'auteur ou le nom du papier? Le lien semble avoir cessé de fonctionner. – Arend
ftp://ftp.cs.utexas.edu/.snapshot/backup/pub/techreports/tr88-07.pdf – gamers2000
Comme le deuxième lien est également mort, j'ai retrouvé l'article à nouveau. [Traçage rapide des rayons à l'aide d'arbres KD] (ftp://ftp.cs.utexas.edu/pub/techreports/tr88-07.pdf) Donald Fussell, KR Subramanian Département d'informatique L'Université du Texas à Austin Mars 1988 – winnetou