我正在尝试实现碰撞检测的边界框。为了移动max和min x,y和z值,我存储它们的原始模型空间坐标,然后,每次它们的位置改变时,我将这些坐标乘以一个平移矩阵,并将结果存储为当前的最大值和最小值。但是这些值没有正确更新。
代码是:
void BoundingBox::softUpdate(const glm::vec3 position)
{
glm::vec4 newMin = glm::translate(glm::mat4(), position) * glm::vec4(originalMin.x, originalMin.y, originalMin.z, 1);
min = glm::vec3(newMin.x, newMin.y, newMin.z);
glm::vec4 newMax = glm::vec4(originalMax, 1) * glm::translate(glm::mat4(), position);
max = glm::vec3(newMax.x, newMax.y, newMax.z);
}
其中originalMax
和originalMin
为glm::vec3
s,代表模型空间坐标。 min
和max
也是glm::vec3
,并存储当前,已翻译,最小和最大x,y和z值。
编辑:要求确定最小值和最大值的代码:
void BoundingBox::calculateMaxAndMins(const std::vector<glm::vec3> vertices)
{
originalMax.x = vertices.at(0).x;
originalMin.x = vertices.at(0).x;
originalMax.y = vertices.at(0).y;
originalMin.y = vertices.at(0).y;
originalMax.z = vertices.at(0).z;
originalMin.z = vertices.at(0).z;
for (glm::vec3 vertex : vertices)
{
if (vertex.x > originalMax.x) originalMax.x = vertex.x;
if (vertex.x < originalMin.x) originalMin.x = vertex.x;
if (vertex.y > originalMax.y) originalMax.y = vertex.y;
if (vertex.y < originalMin.y) originalMin.y = vertex.y;
if (vertex.z > originalMax.z) originalMax.z = vertex.z;
if (vertex.z < originalMin.z) originalMin.z = vertex.z;
}