Tôi đang cố gắng duyệt qua một cây KD 3D trong bộ lọc tia. Cây là chính xác, nhưng có vẻ là một cái gì đó sai với thuật toán traversal của tôi kể từ khi tôi nhận được một số lỗi so với cách sử dụng một cách tiếp cận brute-force (một số diện tích bề mặt nhỏ dường như bị bỏ qua).KD-Tree traversal (raytracing) - Tôi có thiếu một trường hợp không?
Lưu ý: không có tia nào trong câu hỏi song song với bất kỳ trục nào.
Đây là thuật toán traversal của tôi:
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
}
}
}
}
Tôi tạo ra một hình ảnh với tất cả các trường hợp khác nhau:
alt text http://neo.cycovery.com/KDTree_traversal.jpg
Tôi có thiếu một trường hợp?
cảm ơn sự giúp đỡ của bạn!
Bất kỳ ý tưởng nào về tác giả hoặc tên của bài báo? Liên kết dường như đã ngừng hoạt động. – Arend
ftp://ftp.cs.utexas.edu/.snapshot/backup/pub/techreports/tr88-07.pdf – gamers2000
Khi liên kết thứ hai cũng đã chết, tôi đã theo dõi lại bài viết. [Truy tìm nhanh Ray bằng cây KD] (ftp://ftp.cs.utexas.edu/pub/techreports/tr88-07.pdf) Donald Fussell, KR Subramanian Khoa Khoa học Máy tính Đại học Texas tại Austin tháng 3 năm 1988 – winnetou