raytracer에서 3D KD 트리를 탐색하려고합니다. 트리는 정확하지만 무차별 접근법 (일부 작은 표면 영역은 무시되는 것처럼 보임)을 사용하는 것에 비해 약간의 오류가 발생하므로 내 트래버 설 알고리즘에 문제가있는 것으로 보입니다.KD 트리 탐색 (광선 추적) - 사례가 누락 되었습니까?
참고 : 문제의 광선은 어느 축과도 평행하지 않습니다.
이 내 탐색 알고리즘 :
alt text http://neo.cycovery.com/KDTree_traversal.jpg
가 나는 경우 실종 :
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
}
}
}
}
내가 모든 다른 경우와 그래픽을 만들어?
도움에 감사드립니다.
저자 또는 논문 이름에 대한 아이디어가 있으십니까? 링크가 작동하지 않는 것 같습니다. – Arend
ftp://ftp.cs.utexas.edu/.snapshot/backup/pub/techreports/tr88-07.pdf – gamers2000
두 번째 링크도 죽었으므로 기사를 다시 추적했습니다. [사용 빠른 광선 추적 KD 나무] (ftp://ftp.cs.utexas.edu/pub/techreports/tr88-07.pdf) 도널드 Fussell, 컴퓨터 과학 KR Subramanian 부서 텍사스 오스틴 대학 1988 년 3 월 – winnetou