我想在我的raytracer中遍歷一個3D KD-Tree。樹是正確的,但似乎我的遍歷算法出了問題,因爲與使用暴力破解方法相比,我遇到了一些錯誤(一些小的表面區域似乎被忽略)。KD樹遍歷(光線跟蹤) - 我錯過了一個案例?
注意:所討論的光線中沒有一條與任何軸平行。
這是我的遍歷算法:
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
}
}
}
}
我創建了各種不同情況下的圖形:
alt text http://neo.cycovery.com/KDTree_traversal.jpg
我缺少的情況下?
感謝您的幫助!
關於作者或論文名稱的想法?該鏈接似乎已停止工作。 – Arend 2014-08-20 20:21:35
ftp://ftp.cs.utexas.edu/.snapshot/backup/pub/techreports/tr88-07.pdf – gamers2000 2014-12-09 09:38:42
由於第二個鏈接也死了,我再次追查這篇文章。 [快速射線追蹤使用KD樹(ftp://ftp.cs.utexas.edu/pub/techreports/tr88-07.pdf) 唐納德·福塞爾,計算機科學KR薩勃拉曼尼亞 部 德克薩斯大學奧斯汀分校1988年3月, – winnetou 2016-04-26 06:49:44