User defined geometry bouding box overlapping

User defined geometry bouding box overlapping

Hello, 

      I meet a problem when defining the user defined geometry.  I simply defined a box, i.e. its bouding box is the same as the box itself.

I implemented the intersection function as following:

The problem is when I put two boxes up and down with one common face, i.e. they are aligned perfectly.

For example, the center of the two boxes are: (0,0,0), (0, 10,0). while the edge length of them is 10. 

When I shoot a ray from top: org (0, 100, 0), dir (0, -1, 0). The 'cellIntersectFunc' function will be called two times:

intersect 0
intersect 0
p: (0, 5, 0)
p1: (0, 5, 0)

The two intersected points (tnear and tfar) is the same, which is the common edge of the two boxes.

If I seperate them slighly. (0,0,0), (0, 10.001,0), The results is correct:

intersect 0
p: (0, 15.001, 0)
p1: (0, 5.001, 0)

Does anyone know what's wrong with this problem. I don't want any gaps between boxes, because some

rays may just go through this gaps and then produce errors.

 

Thank you!

 

void cellIntersectFunc(void* cell_i, RTCRay& ray, size_t item) {
    cout << "intersect " << item<< endl;

    const Cell* cells = (const Cell*)cell_i;

    const Cell& cell = cells[item];

    Vec3fa dRcp = 1/ray.dir;
    Vec3fa upper_right = cell.left_bottom + Vec3fa(cell.xzExtent, cell.yExtent, cell.xzExtent);
    for (int i = 0; i < 3; i++) {
        const float origin = ray.org[i];
        const float minVal = cell.left_bottom[i], maxVal = upper_right[i];
        if (ray.dir[i] == 0) {//The ray is parallel to the planes.
            if (origin < minVal || origin > maxVal) {
                return;
            }
        }
        else {
            float t1 = (minVal - origin) * dRcp[i];
            float t2 = (maxVal - origin) * dRcp[i];
            bool flip = t1 > t2;
            if (flip)
                swap(t1, t2);
            
            ray.tnear = std::max(t1, ray.tnear);
            ray.tfar = std::min(t2,  ray.tfar);
            if (!(ray.tnear <= ray.tfar))
                return;
        }
    }
    ray.geomID = cell.geomID;
    ray.primID = (unsigned int)item;
    return;
}

2 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

That the intersection callback is called twice for the same object is very strange. Could you send us a more complete reproducer (including geometry setup) to embree_support@intel.com.

Thanks.

Leave a Comment

Please sign in to add a comment. Not a member? Join today