简体   繁体   中英

Bounds of mesh are scaled by its world postion

I am trying to get the correct world postion and size of the bounds for a mesh, however the size of the bounds are scaled by the position of the mesh.

The bounds of the mesh itself are correct, but trying to get them into world space does not work.

Fotos: 1 and 2

The code for rendering the bounds:

void MeshRenderer::drawBounds() // FIXME: world bounds are scaled by the transforms position
{
    glm::mat4 transformation = entity->transform.getTransformationMatrix();
    bounds.center = transformation * glm::vec4(m_Mesh.bounds.center, 1.0);
    bounds.size = transformation * glm::vec4(m_Mesh.bounds.size, 1.0);

    bounds.updateCornerVertices();
    bounds.draw();
}

void Bounds::updateCornerVertices()
{
    glm::vec3 halfSize = size * 0.5f;
    auto verts = GeomUtil::createLineCubeVertices(
        center + glm::vec3(-halfSize.x, halfSize.y, -halfSize.z),
        center + glm::vec3(-halfSize.x, -halfSize.y, -halfSize.z),
        center + glm::vec3(halfSize.x, -halfSize.y, -halfSize.z),
        center + glm::vec3(halfSize.x, halfSize.y, -halfSize.z),
        center + glm::vec3(-halfSize.x, halfSize.y, halfSize.z),
        center + glm::vec3(-halfSize.x, -halfSize.y, halfSize.z),
        center + glm::vec3(halfSize.x, -halfSize.y, halfSize.z),
        center + glm::vec3(halfSize.x, halfSize.y, halfSize.z));

    m_Vertexbuffer.setData(&verts[0], 48);
}
void Bounds::draw() const
{
    Renderer::shaderColor.use();
    Renderer::shaderColor.setMat4("_ModelMatrix", glm::mat4(1.0));
    m_Vertexbuffer.bind();
    glDrawArrays(GL_LINES, 0, 48);
    m_Vertexbuffer.unbind();
}

glm::mat4 Transform::getTransformationMatrix() const
{
    glm::mat4 matrix(1.0f);
    matrix = glm::translate(matrix, position);
    matrix = glm::scale(matrix, scale);
    matrix = glm::rotate(matrix, glm::radians(rotation.x), GeomUtil::X_AXIS); // TODO: Figure out how rotations work (quaternions)
    matrix = glm::rotate(matrix, glm::radians(rotation.y), GeomUtil::Y_AXIS);
    matrix = glm::rotate(matrix, glm::radians(rotation.z), GeomUtil::Z_AXIS);

    if (entity->parent)
        matrix = entity->parent->transform.getTransformationMatrix() * matrix;

    return matrix;
}

size is a vector, but not a position. So it has to be

bounds.size = transformation * glm::vec4(m_Mesh.bounds.size, 1.0);

bounds.size = transformation * glm::vec4(m_Mesh.bounds.size, 0.0);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM