/*
 * Uses the technique described here:
 * http://zeuxcg.org/2010/10/17/aabb-from-obb-with-component-wise-abs/
 */
void BoundingVolume::transform(const BoundingVolume &in_volume, glm::mat4 matrix) {
    // Make sure the bounding volume itself is cleared before transformation
    reset();

    glm::vec3 center = (in_volume.min_corner() + in_volume.max_corner()) / 2.0f;
    glm::vec3 extent = (in_volume.max_corner() - in_volume.min_corner()) / 2.0f;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            scratch_abs_matrix[i, j] = abs(matrix[i, j]);
        }
    }

    glm::vec4 new_center = matrix * glm::vec4(center, 1.0f);
    glm::vec4 new_extent = scratch_abs_matrix * glm::vec4(extent, 0.0f);

    glm::vec4 bb_min = new_center - new_extent;
    glm::vec4 bb_max = new_center + new_extent;

    expand(glm::vec3(bb_min.x, bb_min.y, bb_min.z));
    expand(glm::vec3(bb_max.x, bb_max.y, bb_max.z));
}
Exemple #2
0
void BoundingVolume::transform(const BoundingVolume &in_volume,
        glm::mat4 matrix) {
    // Make sure the bounding volume itself is cleared before transformation
    reset();

    glm::vec4 min_corner(in_volume.min_corner(), 1.0f);
    glm::vec4 max_corner(in_volume.max_corner(), 1.0f);
    glm::vec4 transformed_min_corner = matrix * min_corner;
    glm::vec4 transformed_max_corner = matrix * max_corner;

    glm::vec3 transformed_min(transformed_min_corner.x, transformed_min_corner.y,
            transformed_min_corner.z);
    glm::vec3 transformed_max(transformed_max_corner.x, transformed_max_corner.y,
            transformed_max_corner.z);

    // expand with the new corners
    expand(transformed_min);
    expand(transformed_max);
}
Exemple #3
0
/*
 * expand the volume by the incoming volume
 */
void BoundingVolume::expand(const BoundingVolume &volume) {
    expand(volume.min_corner());
    expand(volume.max_corner());
}