目前我正在尝试根据情况计算矩形/正方形的点(在 3D 空间中每个点都是一个 3D vector )。
我的问题是我不是数学天才。我在这两种情况下都工作得很好。
给定点为 0 和 6,通过 Origin + min 和 origin + max 计算。原点并不总是在地面上,也可以在高处。我不知道为什么会这样。
对于立方体: 获取 0 和 2 之间的点(称为 D),并将 vector D->0 旋转 90° 和 -90° 获取 6 和 2 之间的高度,将它们应用到所有点,您就达到了立方体的所有点。
对于长方体: 我假设 vector 6->2 与 6->5 相同,因此计算与之前相同的原理,通过查看 6->2 的 z 轴然后将它们应用在给定点 6、0 和计算得到的高度第 4 点和第 2 点。
这两种方法本身都有效,但我想问的是,是否有人知道一种方法,既可以比逐个计算所有点更容易/更快地组合获取这些点,又可以使用一种无论如何都有效的方法生成的盒子的形状(适用于长方体和立方体)。
预先感谢任何愿意花时间讨论此事的人。 问候。
进一步可视化我想要实现的目标。橙色 = 原点 + 最小值,蓝色 = 原点 + 最大值。 原点是世界空间中的一个点,最小值和最大值都是定义盒子点的 3D vector 。
Vector* Vector::CreateBoundingBox(const Vector& bb_min, const Vector& bb_max) const {
static Vector retVertices[8];
Vector vecInvmin;
float fHeight;
vecInvmin = bb_min * -1;
retVertices[0] = *this + bb_min;
retVertices[1] = *this + bb_min.RotateOnZ(90);
retVertices[2] = *this + vecInvmin;
retVertices[3] = *this + vecInvmin.RotateOnZ(90);
fHeight = (*this + bb_max).Z - retVertices[6].Z - retVertices[2].Z;
memcpy(&retVertices[4], &retVertices[0], sizeof(Vector) * 4);
for (__int32 i = 4; i < 8; i++) {
retVertices[i].Z += fHeight;
}
return retVertices;
}
最佳答案
这是一个经过测试的边界框计算代码。
BoundingBox::BoundingBox()
{
MaxEdge = Vector3(-999.0);
MinEdge = Vector3(999.0);
}
void BoundingBox::addPointsToCalculateBoundingBox(Vector3 point)
{
if (point.x > MaxEdge.x)
MaxEdge.x = point.x;
if (point.y > MaxEdge.y)
MaxEdge.y = point.y;
if (point.z > MaxEdge.z)
MaxEdge.z = point.z;
if (point.x < MinEdge.x)
MinEdge.x = point.x;
if (point.y < MinEdge.y)
MinEdge.y = point.y;
if (point.z < MinEdge.z)
MinEdge.z = point.z;
}
关于c++ - 计算立方体/长方体的边界框/缺失点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39303047/