Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Вопрос Circle Outline [LW]

  • Автор темы Автор темы Dark001
  • Дата начала Дата начала
С++
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
18 Янв 2021
Сообщения
88
Реакции
8
Подскажите ребят либо буду благодарен примеру
Как сделать обводку круга примеры :
1620033772643.png
1620033811933.png
 
Вычисляется круг в трехмерном мире, вернее его точки, сколько их будет зависеть от детализации.
Затем они перегоняются из 3д мира на экран (в 2д мир т.е. worldtoscreen), из них вычисляется контур (гугли convex hull).
И наконец по этим точкам просто рисуется из треугольников многогранник (для imgui смотри AddConvexPolyFilled) и по этим же точкам линия (для imgui смотри AddPolyline).
 
Вычисляется круг в трехмерном мире, вернее его точки, сколько их будет зависеть от детализации.
Затем они перегоняются из 3д мира на экран (в 2д мир т.е. worldtoscreen), из них вычисляется контур (гугли convex hull).
И наконец по этим точкам просто рисуется из треугольников многогранник (для imgui смотри AddConvexPolyFilled) и по этим же точкам линия (для imgui смотри AddPolyline).
Не будет примера?, а то я слегка тупенький
 
C++:
Expand Collapse Copy
void render::Draw3DFilledCircle(const Vector& origin, float radius, Color color, float fill_alpha)
{
    auto prevScreenPos = ZERO;
    auto step = M_PI * 2.0f / 72.0f;
    auto screenPos = ZERO;
    auto screen = ZERO;

    if (!math::world_to_screen(origin, screen))
        return;

    color.SetAlpha(static_cast<int>(fill_alpha));

    for (auto rotation = 0.0f; rotation <= M_PI * 2.0f; rotation += step)
    {
        Vector pos(radius * cos(rotation) + origin.x, radius * sin(rotation) + origin.y, origin.z);

        if (math::world_to_screen(pos, screenPos))
        {
            if (!prevScreenPos.IsZero() && prevScreenPos.IsValid() && screenPos.IsValid() && prevScreenPos != screenPos)
            {
                line(prevScreenPos.x, prevScreenPos.y, screenPos.x, screenPos.y, Color(color.r(), color.g(), color.b(), 255));
                triangle(Vector2D(screen.x, screen.y), Vector2D(screenPos.x, screenPos.y), Vector2D(prevScreenPos.x, prevScreenPos.y), color);
            }
            prevScreenPos = screenPos;
        }
    }
}
 
Назад
Сверху Снизу