Anonymous
Как получить мировое положение вершины
Сообщение
Anonymous » 09 ноя 2024, 00:54
Я пытаюсь получить мировую позицию моей ограничивающей рамки вершины.
Код: Выделить всё
void Container::GetTransformedBoundingBoxDimensions2WithProjection(float* minimum_x, float* minimum_y, float* minimum_z, float* maximum_x, float* maximum_y, float* maximum_z, glm::mat4 projectionMatrix)
{
std::vector childContainers;
std::vector vertices;
glm::mat4 transformationMatrixRoot = this->GetTransformationMatrixPointer();
glm::mat4 combinedMatrix = projectionMatrix * wavefrontAccess->GetViewMatrix() * transformationMatrixRoot;
GLfloat min_x = 999999, max_x = -999999;
GLfloat min_y = 999999, max_y = -999999;
GLfloat min_z = 999999, max_z = -999999;
// Process vertices of the current container
if (Geom != nullptr)
{
vertices = Geom->GetVertices();
for (const auto& vertex : vertices)
{
glm::vec4 transformedVertex = combinedMatrix * glm::vec4(vertex.x, vertex.y, vertex.z, 1.0f);
min_x = std::min(min_x, transformedVertex.x);
max_x = std::max(max_x, transformedVertex.x);
min_y = std::min(min_y, transformedVertex.y);
max_y = std::max(max_y, transformedVertex.y);
min_z = std::min(min_z, transformedVertex.z);
max_z = std::max(max_z, transformedVertex.z);
}
}
// Retrieve active child containers
if (this->GetChildContainerCount() > 0)
{
childContainers = GetAllChildSubContainersActiveOnly();
}
// Process vertices of each active child container
for (Container* child : childContainers)
{
if (child->GetActive())
{
glm::mat4 transformationMatrixChild = child->GetTransformationMatrix();
glm::mat4 combinedMatrixChild = projectionMatrix * wavefrontAccess->GetViewMatrix() * transformationMatrixChild;
if (child->Geom != nullptr)
{
std::vector childVertices = child->Geom->GetVertices();
for (const auto& vertex : childVertices)
{
glm::vec4 transformedVertex = combinedMatrixChild * glm::vec4(vertex.x, vertex.y, vertex.z, 1.0f);
min_x = std::min(min_x, transformedVertex.x);
max_x = std::max(max_x, transformedVertex.x);
min_y = std::min(min_y, transformedVertex.y);
max_y = std::max(max_y, transformedVertex.y);
min_z = std::min(min_z, transformedVertex.z);
max_z = std::max(max_z, transformedVertex.z);
}
}
}
}
// Set the calculated bounding box dimensions
*minimum_x = min_x;
*minimum_y = min_y;
*minimum_z = min_z;
*maximum_x = max_x;
*maximum_y = max_y;
*maximum_z = max_z;
}
Мои окончательные положения вершин неверны.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -of-vertex
1731102899
Anonymous
Я пытаюсь получить мировую позицию моей ограничивающей рамки вершины. [code]void Container::GetTransformedBoundingBoxDimensions2WithProjection(float* minimum_x, float* minimum_y, float* minimum_z, float* maximum_x, float* maximum_y, float* maximum_z, glm::mat4 projectionMatrix) { std::vector childContainers; std::vector vertices; glm::mat4 transformationMatrixRoot = this->GetTransformationMatrixPointer(); glm::mat4 combinedMatrix = projectionMatrix * wavefrontAccess->GetViewMatrix() * transformationMatrixRoot; GLfloat min_x = 999999, max_x = -999999; GLfloat min_y = 999999, max_y = -999999; GLfloat min_z = 999999, max_z = -999999; // Process vertices of the current container if (Geom != nullptr) { vertices = Geom->GetVertices(); for (const auto& vertex : vertices) { glm::vec4 transformedVertex = combinedMatrix * glm::vec4(vertex.x, vertex.y, vertex.z, 1.0f); min_x = std::min(min_x, transformedVertex.x); max_x = std::max(max_x, transformedVertex.x); min_y = std::min(min_y, transformedVertex.y); max_y = std::max(max_y, transformedVertex.y); min_z = std::min(min_z, transformedVertex.z); max_z = std::max(max_z, transformedVertex.z); } } // Retrieve active child containers if (this->GetChildContainerCount() > 0) { childContainers = GetAllChildSubContainersActiveOnly(); } // Process vertices of each active child container for (Container* child : childContainers) { if (child->GetActive()) { glm::mat4 transformationMatrixChild = child->GetTransformationMatrix(); glm::mat4 combinedMatrixChild = projectionMatrix * wavefrontAccess->GetViewMatrix() * transformationMatrixChild; if (child->Geom != nullptr) { std::vector childVertices = child->Geom->GetVertices(); for (const auto& vertex : childVertices) { glm::vec4 transformedVertex = combinedMatrixChild * glm::vec4(vertex.x, vertex.y, vertex.z, 1.0f); min_x = std::min(min_x, transformedVertex.x); max_x = std::max(max_x, transformedVertex.x); min_y = std::min(min_y, transformedVertex.y); max_y = std::max(max_y, transformedVertex.y); min_z = std::min(min_z, transformedVertex.z); max_z = std::max(max_z, transformedVertex.z); } } } } // Set the calculated bounding box dimensions *minimum_x = min_x; *minimum_y = min_y; *minimum_z = min_z; *maximum_x = max_x; *maximum_y = max_y; *maximum_z = max_z; } [/code] Мои окончательные положения вершин неверны. Подробнее здесь: [url]https://stackoverflow.com/questions/79168879/how-to-get-the-world-position-of-vertex[/url]