#include "boxmesh.h" static const std::vector subdivedBoxObjVertices = { {-0.025357f, -0.025357f, 0.025357f}, {-0.025357f, 0.025357f, 0.025357f}, {-0.025357f, 0.025357f, -0.025357f}, {-0.025357f, -0.025357f, -0.025357f}, {0.025357f, -0.025357f, 0.025357f}, {0.025357f, -0.025357f, -0.025357f}, {0.025357f, 0.025357f, 0.025357f}, {0.025357f, 0.025357f, -0.025357f}, {-0.030913f, -0.030913f, -0.000000f}, {-0.030913f, -0.000000f, 0.030913f}, {-0.030913f, 0.030913f, 0.000000f}, {-0.030913f, 0.000000f, -0.030913f}, {0.030913f, -0.030913f, -0.000000f}, {0.000000f, -0.030913f, 0.030913f}, {-0.000000f, -0.030913f, -0.030913f}, {0.030913f, -0.000000f, 0.030913f}, {-0.000000f, 0.030913f, 0.030913f}, {0.030913f, 0.030913f, 0.000000f}, {0.030913f, 0.000000f, -0.030913f}, {-0.000000f, 0.030913f, -0.030913f}, {-0.042574f, 0.000000f, -0.000000f}, {-0.000000f, -0.042574f, -0.000000f}, {0.000000f, -0.000000f, 0.042574f}, {0.042574f, -0.000000f, -0.000000f}, {-0.000000f, 0.000000f, -0.042574f}, {0.000000f, 0.042574f, 0.000000f}, }; static const std::vector> subdivedBoxObjFaces = { {1, 10, 21, 9}, {10, 2, 11, 21}, {21, 11, 3, 12}, {9, 21, 12, 4}, {5, 14, 22, 13}, {14, 1, 9, 22}, {22, 9, 4, 15}, {13, 22, 15, 6}, {1, 14, 23, 10}, {14, 5, 16, 23}, {23, 16, 7, 17}, {10, 23, 17, 2}, {7, 16, 24, 18}, {16, 5, 13, 24}, {24, 13, 6, 19}, {18, 24, 19, 8}, {4, 12, 25, 15}, {12, 3, 20, 25}, {25, 20, 8, 19}, {15, 25, 19, 6}, {2, 17, 26, 11}, {17, 7, 18, 26}, {26, 18, 8, 20}, {11, 26, 20, 3}, }; void boxmesh(const QVector3D &position, float radius, size_t subdivideTimes, std::vector &vertices, std::vector> &faces) { if (subdivideTimes > 0) { vertices.reserve(subdivedBoxObjVertices.size()); auto ratio = 24 * radius; for (const auto &vertex: subdivedBoxObjVertices) { auto newVertex = vertex * ratio + position; vertices.push_back(newVertex); } faces.reserve(subdivedBoxObjFaces.size()); for (const auto &face: subdivedBoxObjFaces) { auto newFace = {face[0] - 1, face[1] - 1, face[2] - 1, face[3] - 1, }; faces.push_back(newFace); } return; } std::vector beginPlane = { {-radius, -radius, radius}, { radius, -radius, radius}, { radius, radius, radius}, {-radius, radius, radius}, }; std::vector endPlane = { beginPlane[0], beginPlane[3], beginPlane[2], beginPlane[1] }; for (auto &vertex: endPlane) { vertex.setZ(vertex.z() - radius - radius); } for (const auto &vertex: beginPlane) { vertices.push_back(vertex); } for (const auto &vertex: endPlane) { vertices.push_back(vertex); } std::vector beginLoop = { 0, 1, 2, 3 }; std::vector endLoop = { 4, 5, 6, 7 }; std::vector alignedEndLoop = { 4, 7, 6, 5 }; faces.push_back(beginLoop); faces.push_back(endLoop); for (size_t i = 0; i < beginLoop.size(); ++i) { size_t j = (i + 1) % beginLoop.size(); faces.push_back({ beginLoop[j], beginLoop[i], alignedEndLoop[i], alignedEndLoop[j] }); } for (auto &vertex: vertices) { vertex += position; } }