计算立方体/长方体的边界框/缺失点

时间:2016-09-03 03:46:55

标签: c++ c math vector 3d

enter image description here

目前我正在尝试根据情况计算矩形/正方形的点(在3D空间中,每个点都是3D矢量)。

我的问题是因为我不是数学家的天才。无论哪种情况,我都能正常工作。

给定点为0和6计算原点+最小值和原点+最大值。起源并不总是在地面上它也可以升高。我之所以不知道原因。

对于一个立方体: 获得0和2之间的点,称为D,并将矢量D-> 0旋转90°和-90°获得6和2之间的高度,将它们应用于所有点,并且您已达到立方体的所有点。 / p>

对于长方体: 我假设矢量6-> 2与6-> 5相同因此通过观察6-> 2的z轴计算所有与之前相同的原理然后在给定点6,0处应用它们。和计算出的点4和2.

这两种方法本身都有效,但我想问的是,是否有人知道一种方法,或者允许以比一个接一个地计算所有点更容易/更快的方式组合获得这些点以及无论如何都能工作的方法结果框的形状(适用于长方体和立方体)。

提前感谢任何愿意花些时间在这件事上的人。 问候。

进一步可视化我想要实现的目标。橙色=原点+分钟,蓝色=原点+最大值。 Origin是世界空间中的一个点min和max都是3D Vector,用于定义框的点。Ingame screenshot.

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;
}

3 个答案:

答案 0 :(得分:1)

这是一个经过测试的边界框计算代码。

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;
}

答案 1 :(得分:0)

@codetiger完全答案的变化,以避免幻数-999.0, 999.0

通过将>测试反转为! <=,有价值的数字会产生相同的结果。然而,当MaxEdge.x是NaN时,初始值!(point.x <= MaxEdge.x)为真,并且MaxEdge.x在第一次调用addPointsToCalculateBoundingBox()时被分配。如果代码在调用MaxEdge.x之前尝试使用addPointsToCalculateBoundingBox(),它将具有NaN的“值”。可能比-999.0的值更快地触发问题。

BoundingBox::BoundingBox() {
    // Initialize to Not-A-Number
    MaxEdge = Vector3(0.0/0.0);
    MinEdge = Vector3(0.0/0.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;
}

答案 2 :(得分:0)

Vector* Vector::CreateBoundingBox(Vector bb_min, Vector bb_max, const Vector& Rotation) const {
    static Vector retVertices[8];
    retVertices[0] = bb_min;
    retVertices[1] = Vector(bb_max.X, bb_min.Y, bb_min.Z);
    retVertices[2] = Vector(bb_max.X, bb_max.Y, bb_min.Z);
    retVertices[3] = Vector(bb_min.X, bb_max.Y, bb_min.Z);
    retVertices[4] = Vector(bb_min.X, bb_min.Y, bb_max.Z);
    retVertices[5] = Vector(bb_max.X, bb_min.Y, bb_max.Z);
    retVertices[6] = bb_max;
    retVertices[7] = Vector(bb_min.X, bb_max.Y, bb_max.Z);

    for (int i = 0; i < 8; i++) {
        retVertices[i].RotateXYZ(Rotation);
        retVertices[i] += *this;
    }

    return retVertices;
}

我选择的最终资料来源。其实没什么好算的,我只是迟钝了。如果做类似的话,也许有人需要这个。