Developer knowledge network · moderated exchange

Сообщество UnreliableCode

Сообщество разработчиков, обратного проектирования и кодирования

Tutorial

Drawing 3D Bounding Boxes with 8-corner World-to-Screen projection

matrix_math_guy
Math Specialist
MEMBER
Представитель: 105
Дата присоединения: Aug 2018
Сообщения: 52
Спасибо: 41
1 месяцев назад · Jul 1, 2026 8:30 AM
#1

How to render a true 3D oriented bounding box in Dear ImGui:

CPP
void Draw3DBox(Vector3 origin, Vector3 min, Vector3 max, float yaw, const Matrix4x4& vMatrix, ImU32 color) {
    Vector3 corners[8] = {
        { min.x, min.y, min.z }, { max.x, min.y, min.z },
        { max.x, max.y, min.z }, { min.x, max.y, min.z },
        { min.x, min.y, max.z }, { max.x, min.y, max.z },
        { max.x, max.y, max.z }, { min.x, max.y, max.z }
    };
    
    Vector2 screenCorners[8];
    for (int i = 0; i < 8; i++) {
        Vector3 rotated = RotateYaw(corners[i], yaw) + origin;
        if (!WorldToScreen(rotated, screenCorners[i], vMatrix, screenW, screenH)) return;
    }
    
    // Connect 12 edges with ImDrawList::AddLine
    ImDrawList* dl = ImGui::GetBackgroundDrawList();
    for (int i = 0; i < 4; i++) {
        dl->AddLine(ImVec2(screenCorners[i].x, screenCorners[i].y), ImVec2(screenCorners[(i+1)%4].x, screenCorners[(i+1)%4].y), color);
        dl->AddLine(ImVec2(screenCorners[i+4].x, screenCorners[i+4].y), ImVec2(screenCorners[((i+1)%4)+4].x, screenCorners[((i+1)%4)+4].y), color);
        dl->AddLine(ImVec2(screenCorners[i].x, screenCorners[i].y), ImVec2(screenCorners[i+4].x, screenCorners[i+4].y), color);
    }
}
imgui_artisan
UI Designer
MEMBER
Представитель: 202
Дата присоединения: Apr 2019
Сообщения: 54
Спасибо: 28
1 месяцев назад · Jul 1, 2026 2:21 PM
#2

Oriented 3D bounding boxes that rotate with player yaw look so much more professional than static 2D rectangles!

matrix_math_guy
Math Specialist
MEMBER
Представитель: 105
Дата присоединения: Aug 2018
Сообщения: 52
Спасибо: 41
1 месяцев назад · Jul 2, 2026 6:16 AM
#3

Clean math. Works in Source 2, UE5, and Unity.