📄 imathboxalgo.h
字号:
min2new = max2new = M[3][2];
a = M[0][2] * min0;
b = M[0][2] * max0;
if (a < b) {
min2new += a;
max2new += b;
} else {
min2new += b;
max2new += a;
}
a = M[1][2] * min1;
b = M[1][2] * max1;
if (a < b) {
min2new += a;
max2new += b;
} else {
min2new += b;
max2new += a;
}
a = M[2][2] * min2;
b = M[2][2] * max2;
if (a < b) {
min2new += a;
max2new += b;
} else {
min2new += b;
max2new += a;
}
Box< Vec3<T> > xbbox;
xbbox.min[0] = min0new;
xbbox.max[0] = max0new;
xbbox.min[1] = min1new;
xbbox.max[1] = max1new;
xbbox.min[2] = min2new;
xbbox.max[2] = max2new;
return xbbox;
}
template <class T>
bool findEntryAndExitPoints(const Line3<T>& line,
const Box<Vec3<T> >& box,
Vec3<T> &enterPoint,
Vec3<T> &exitPoint)
{
if ( box.isEmpty() ) return false;
if ( line.distanceTo(box.center()) > box.size().length()/2. ) return false;
Vec3<T> points[8], inter, bary;
Plane3<T> plane;
int i, v0, v1, v2;
bool front = false, valid, validIntersection = false;
// set up the eight coords of the corners of the box
for(i = 0; i < 8; i++)
{
points[i].setValue( i & 01 ? box.min[0] : box.max[0],
i & 02 ? box.min[1] : box.max[1],
i & 04 ? box.min[2] : box.max[2]);
}
// intersect the 12 triangles.
for(i = 0; i < 12; i++)
{
switch(i)
{
case 0: v0 = 2; v1 = 1; v2 = 0; break; // +z
case 1: v0 = 2; v1 = 3; v2 = 1; break;
case 2: v0 = 4; v1 = 5; v2 = 6; break; // -z
case 3: v0 = 6; v1 = 5; v2 = 7; break;
case 4: v0 = 0; v1 = 6; v2 = 2; break; // -x
case 5: v0 = 0; v1 = 4; v2 = 6; break;
case 6: v0 = 1; v1 = 3; v2 = 7; break; // +x
case 7: v0 = 1; v1 = 7; v2 = 5; break;
case 8: v0 = 1; v1 = 4; v2 = 0; break; // -y
case 9: v0 = 1; v1 = 5; v2 = 4; break;
case 10: v0 = 2; v1 = 7; v2 = 3; break; // +y
case 11: v0 = 2; v1 = 6; v2 = 7; break;
}
if((valid=intersect (line, points[v0], points[v1], points[v2],
inter, bary, front)) == true)
{
if(front == true)
{
enterPoint = inter;
validIntersection = valid;
}
else
{
exitPoint = inter;
validIntersection = valid;
}
}
}
return validIntersection;
}
template<class T>
bool
intersects (const Box< Vec3<T> > &b, const Line3<T> &r, Vec3<T> &ip)
{
//
// Intersect a ray, r, with a box, b, and compute the intersection
// point, ip:
//
// intersect() returns
//
// - true if the ray starts inside the box or if the
// ray starts outside and intersects the box
//
// - false if the ray starts outside the box and intersects it,
// but the intersection is behind the ray's origin.
//
// - false if the ray starts outside and does not intersect it
//
// The intersection point is
//
// - the ray's origin if the ray starts inside the box
//
// - a point on one of the faces of the box if the ray
// starts outside the box
//
// - undefined when intersect() returns false
//
if (b.isEmpty())
{
//
// No ray intersects an empty box
//
return false;
}
if (b.intersects (r.pos))
{
//
// The ray starts inside the box
//
ip = r.pos;
return true;
}
//
// The ray starts outside the box. Between one and three "frontfacing"
// sides of the box are oriented towards the ray, and between one and
// three "backfacing" sides are oriented away from the ray.
// We intersect the ray with the planes that contain the sides of the
// box, and compare the distances between the ray-plane intersections.
// The ray intersects the box if the most distant frontfacing intersection
// is nearer than the nearest backfacing intersection. If the ray does
// intersect the box, then the most distant frontfacing ray-plane
// intersection is the ray-box intersection.
//
const T TMAX = limits<T>::max();
T tFrontMax = -1;
T tBackMin = TMAX;
//
// Minimum and maximum X sides.
//
if (r.dir.x > 0)
{
if (r.pos.x > b.max.x)
return false;
T d = b.max.x - r.pos.x;
if (r.dir.x > 1 || d < TMAX * r.dir.x)
{
T t = d / r.dir.x;
if (tBackMin > t)
tBackMin = t;
}
if (r.pos.x <= b.min.x)
{
T d = b.min.x - r.pos.x;
T t = (r.dir.x > 1 || d < TMAX * r.dir.x)? d / r.dir.x: TMAX;
if (tFrontMax < t)
{
tFrontMax = t;
ip.x = b.min.x;
ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);
ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);
}
}
}
else if (r.dir.x < 0)
{
if (r.pos.x < b.min.x)
return false;
T d = b.min.x - r.pos.x;
if (r.dir.x < -1 || d > TMAX * r.dir.x)
{
T t = d / r.dir.x;
if (tBackMin > t)
tBackMin = t;
}
if (r.pos.x >= b.max.x)
{
T d = b.max.x - r.pos.x;
T t = (r.dir.x < -1 || d > TMAX * r.dir.x)? d / r.dir.x: TMAX;
if (tFrontMax < t)
{
tFrontMax = t;
ip.x = b.max.x;
ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);
ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);
}
}
}
else // r.dir.x == 0
{
if (r.pos.x < b.min.x || r.pos.x > b.max.x)
return false;
}
//
// Minimum and maximum Y sides.
//
if (r.dir.y > 0)
{
if (r.pos.y > b.max.y)
return false;
T d = b.max.y - r.pos.y;
if (r.dir.y > 1 || d < TMAX * r.dir.y)
{
T t = d / r.dir.y;
if (tBackMin > t)
tBackMin = t;
}
if (r.pos.y <= b.min.y)
{
T d = b.min.y - r.pos.y;
T t = (r.dir.y > 1 || d < TMAX * r.dir.y)? d / r.dir.y: TMAX;
if (tFrontMax < t)
{
tFrontMax = t;
ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);
ip.y = b.min.y;
ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);
}
}
}
else if (r.dir.y < 0)
{
if (r.pos.y < b.min.y)
return false;
T d = b.min.y - r.pos.y;
if (r.dir.y < -1 || d > TMAX * r.dir.y)
{
T t = d / r.dir.y;
if (tBackMin > t)
tBackMin = t;
}
if (r.pos.y >= b.max.y)
{
T d = b.max.y - r.pos.y;
T t = (r.dir.y < -1 || d > TMAX * r.dir.y)? d / r.dir.y: TMAX;
if (tFrontMax < t)
{
tFrontMax = t;
ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);
ip.y = b.max.y;
ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);
}
}
}
else // r.dir.y == 0
{
if (r.pos.y < b.min.y || r.pos.y > b.max.y)
return false;
}
//
// Minimum and maximum Z sides.
//
if (r.dir.z > 0)
{
if (r.pos.z > b.max.z)
return false;
T d = b.max.z - r.pos.z;
if (r.dir.z > 1 || d < TMAX * r.dir.z)
{
T t = d / r.dir.z;
if (tBackMin > t)
tBackMin = t;
}
if (r.pos.z <= b.min.z)
{
T d = b.min.z - r.pos.z;
T t = (r.dir.z > 1 || d < TMAX * r.dir.z)? d / r.dir.z: TMAX;
if (tFrontMax < t)
{
tFrontMax = t;
ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);
ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);
ip.z = b.min.z;
}
}
}
else if (r.dir.z < 0)
{
if (r.pos.z < b.min.z)
return false;
T d = b.min.z - r.pos.z;
if (r.dir.z < -1 || d > TMAX * r.dir.z)
{
T t = d / r.dir.z;
if (tBackMin > t)
tBackMin = t;
}
if (r.pos.z >= b.max.z)
{
T d = b.max.z - r.pos.z;
T t = (r.dir.z < -1 || d > TMAX * r.dir.z)? d / r.dir.z: TMAX;
if (tFrontMax < t)
{
tFrontMax = t;
ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);
ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);
ip.z = b.max.z;
}
}
}
else // r.dir.z == 0
{
if (r.pos.z < b.min.z || r.pos.z > b.max.z)
return false;
}
return tFrontMax <= tBackMin;
}
template<class T>
bool
intersects (const Box< Vec3<T> > &box, const Line3<T> &ray)
{
Vec3<T> ignored;
return intersects (box, ray, ignored);
}
} // namespace Imath
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -