Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/48: Рейтинг темы: голосов - 48, средняя оценка - 4.83
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

2D квадрат

12.03.2022, 16:00. Показов 10200. Ответов 54

Студворк — интернет-сервис помощи студентам
Не могу понять, как сделать 2D ESP (квадрат) с помощью OpenGL (фиксированный конвейер) У меня есть позиции нужных объектов (сохранены матрицы с настройками) я могу рисовать трёхмерные объекты, но как сделать так, чтобы я нарисовал двумерный объект который всегда будет повёрнут к камере? (может есть возможность как-то принудительно сбрасывать настройку поворота или что-то типа того) Зайчик помоги :33

Добавлено через 2 минуты
Так же у меня есть возможность получить настройки матрицы камеры. Но как этот велосипед собрать, чтобы он работал, я понятия не имею.

Добавлено через 3 часа 50 минут
Как повернуть объект к камере используя glGetFloatv с GL_PROJECTION_MATRIX и GL_MODELVIEW_MATRIX?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2022, 16:00
Ответы с готовыми решениями:

Нарисовать окружность, вписать в неё квадрат, и в квадрат - другой квадрат
Добрый день, прошу помощи в решении задачи: Нужно вписать в окружность цветной квадрат а собственно в сам квадрат вписать еще и другого...

Если квадрат числа меньше 100, напечатать число и его квадрат
Ввести с клавиатуры 10 чисел. Если квадрат числа меньше 100, напечатать число и его квадрат.

Умножить положительные элементы массива на квадрат минимального, а отрицательные - на квадрат максимального
Даны целые числа а0, ...., аn-1. Требуется домножить все положительные элементы массива элементы на квадрат минимального, а отрицательные...

54
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 16:34  [ТС]
Сделал сброс матрицы modelview, эффект очень близкий но что-то не то

(position.modelview.data() + i)[0] = 1;
(position.modelview.data() + i)[1] = 0;
(position.modelview.data() + i)[2] = 0;
(position.modelview.data() + i)[3] = 0;

(position.modelview.data() + i)[4] = 0;
(position.modelview.data() + i)[5] = 1;
(position.modelview.data() + i)[6] = 0;
(position.modelview.data() + i)[7] = 0;
Миниатюры
2D квадрат  
Изображения
 
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 16:36  [ТС]
Хотелось увидеть такой результат (выделено красным)
Изображения
 
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 16:53  [ТС]
Или вот ещё как пример
Изображения
 
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 17:13  [ТС]
zayats80888 помоги пожалуйста :3
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.03.2022, 19:17
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
zayats80888 помоги пожалуйста :3
Насколько я понял, ты хочешь рисовать 2D bounding box объекта? Тогда:
1) Установи и подключи библиотеку glm(она header-only), вручную писать/объяснять математику я не буду.
Матрицы храни в виде glm::mat4.
Например, загрузить матрицу проекции можно так:
C++
1
2
3
4
5
6
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
//...
glm::mat4 m;
glGetFloatv(GL_PROJECTION_MATRIX, glm::value_ptr(m));
//...
2) Найди способ задать/найти 3D bounding box объекта:
C++
1
2
3
4
5
6
7
// например, такая структура AABB(Axis Aligned Bounding Box):
struct bbox3
{
  glm::vec3 min{std::numeric_limits<float>::max()}, // минимальные компоненты координат вершин модели
            max{std::numeric_limits<float>::min()}; // максимальные компоненты координат вершин модели
};
// собственно рассчитать AABB можно из координат вершин геометрии, находя минимальные и максимальные значения отдельных компонент x, y и z
После поговорим.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 19:57  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Насколько я понял, ты хочешь рисовать 2D bounding box объекта?
Да.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Установи и подключи библиотеку glm(она header-only)
Уже есть, не проблема.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Найди способ задать/найти 3D bounding box объекта
В интернете или где? Я не понимаю что конкретно нужно.

Добавлено через 1 минуту

Не по теме:

p.s Рад видеть что ты жив :3



Добавлено через 15 минут
zayats80888, Объясни пожалуйста, ты вроде говорил что из glm откуда-то взял это

C++
1
2
3
4
5
6
7
8
9
    float m3[4]{};
    
    for (int i = 0; i < 4; ++i)
    {
        m3[i] = modelview[i] * offsetX
                + modelview[i + 4] * offsetY
                + modelview[i + 8] * offsetZ
                + modelview[i + 12];
    }
Мб там готовая функция какая есть? Я сейчас glm подключил, а как оффсеты для матрицы glm задать не знаю.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.03.2022, 20:16
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
В интернете или где? Я не понимаю что конкретно нужно.
Я тебе написал, что нужно:
Цитата Сообщение от zayats80888 Посмотреть сообщение
собственно рассчитать AABB можно из координат вершин геометрии, находя минимальные и максимальные значения отдельных компонент x, y и z
Если так не понятно, погугли, что такое AABB.


Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Объясни пожалуйста, ты вроде говорил что из glm откуда-то взял это
Давай не будем засирать тему оффтопом.
Это умножение матрицы на вектор:
C++
1
2
3
glm::mat4 modelview;
//...
glm::vec4 m3 = modelview * glm::vec4{ offsetX, offsetY, offsetZ, 1.0f };
Добавлено через 8 минут
Я тебе дал задание, сделаешь, дальше будет разговор.
Твоя задача, заполнить структуру boxes:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 3D AABB
struct bbox3 { glm::vec3 min{ std::numeric_limits<float>::max() }, max{ std::numeric_limits<float>::lowest() }; };
 
// 2D AABB, понадобится позже
struct bbox2 { glm::vec2 min{ std::numeric_limits<float>::max() }, max{ std::numeric_limits<float>::lowest() }; };
 
struct boxes {
  // матрица проекции
  glm::mat4 projection; // GL_PROJECTION_MATRIX, каждый кадр
  // данные объекта
  struct object_data { 
    glm::mat4 modelview; // GL_MODELVIEW_MATRIX, каждый кадр
    bbox3 bb; // AABB объекта, считается один раз, НЕ каждый кадр, если игнорировать анимацию
  };
  std::vector<object_data> objects; // вектор объектов, для которых нужно построить 2D bbox
};
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 20:20  [ТС]

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
Давай не будем засирать тему оффтопом.
Это умножение матрицы на вектор:
Прости. Просто, как мне кажется, создавать отдельный тред, было бы чересчур.
Как сделать чтобы матрица перезаписалась? vec4 один тип, а mat4 другой..
Может есть какая-то функция типа translatef для матрицы в самой glm? Чтобы не делать костыли.



Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я тебе дал задание, сделаешь, дальше будет разговор.
Я постараюсь, просто, для меня это тёмный лес и я даже понятия не имею, откуда брать эти значения. Могут ли подойти "примерные" (вручную подобрать) или нужно как-то по другому париться. Попробую.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.03.2022, 20:31

Не по теме:

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Может есть какая-то функция типа translatef для матрицы в самой glm? Чтобы не делать костыли.
glm::translate


Цитата Сообщение от eXpl01TeR Посмотреть сообщение
просто, для меня это тёмный лес и я даже понятия не имею, откуда брать эти значения.
Из геометрии объекта (vertex positions). Координаты исходных вершин. Например, для кубика с центром в начале координат и стороной 1.0 - AABB:
min = { -0.5, -0.5, -0.5 }, max = { 0.5, 0.5, 0.5 }.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 20:57  [ТС]

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
glm::translate
Так?

C++
1
modelview = translate(modelview, { offsetX, offsetY, offsetZ });



Добавлено через 9 минут

Не по теме:

вроде работает как выше написал >_< пойду разбираться с AABB



Добавлено через 7 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
Например, для кубика с центром в начале координат и стороной 1.0 - AABB:
min = { -0.5, -0.5, -0.5 }, max = { 0.5, 0.5, 0.5 }.
Я когда рисую 3D обводку для игроков использую "радиус" (вспомогательный класс)

Кликните здесь для просмотра всего текста


C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
class Radius
{
public:
    Radius(float x, float y, float z);
 
    float x;
    float y;
    float z;
};


Radius(0.8F, 2.0F, 0.8F)

И как бы делю на два все и от текущих настроек матрицы рисую.

Т.е минимум по X -0.4F, максимум 0.4F, минимум по Y -1.0F, максимум 1.0F, минимум по Z -0.4F, максимум 0.4F. Это то, о чём ты говорил?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.03.2022, 21:13
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Т.е минимум по X -0.4F, максимум 0.4F, минимум по Y -1.0F, максимум 1.0F, минимум по Z -0.4F, максимум 0.4F. Это то, о чём ты говорил?
Если это работает, то да.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 21:20  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если это работает, то да.
Ну моя 3D обводка так работает..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    for (int i = 0; i < position.modelview.size(); i += 16)
    {
        glMatrixMode(GL_PROJECTION);
        glLoadMatrixf(position.projection.data() + i);
        
        glMatrixMode(GL_MODELVIEW);
        glLoadMatrixf(position.modelview.data() + i);
 
        glLineWidth(2.0F);
        glColor4f(boxColor.red, boxColor.green, boxColor.blue, 1.0F);
 
        glBegin(GL_LINES);
        glVertex3f(radius.x / 2, -radius.y / 2, radius.z / 2);
        glVertex3f(radius.x / 2, radius.y / 2, radius.z / 2);
 
        glVertex3f(-radius.x / 2, -radius.y / 2, radius.z / 2);
        glVertex3f(radius.x / 2, -radius.y / 2, radius.z / 2);
 
        glVertex3f(-radius.x / 2, -radius.y / 2, radius.z / 2);
        glVertex3f(-radius.x / 2, radius.y / 2, radius.z / 2);
 
        glVertex3f(-radius.x / 2, radius.y / 2, radius.z / 2);
        glVertex3f(radius.x / 2, radius.y / 2, radius.z / 2);
 
        glVertex3f(radius.x / 2, radius.y / 2, radius.z / 2);
        glVertex3f(radius.x / 2, radius.y / 2, -radius.z / 2);
 
        glVertex3f(radius.x / 2, radius.y / 2, -radius.z / 2);
        glVertex3f(radius.x / 2, -radius.y / 2, -radius.z / 2);
 
        glVertex3f(radius.x / 2, radius.y / 2, -radius.z / 2);
        glVertex3f(-radius.x / 2, radius.y / 2, -radius.z / 2);
 
        glVertex3f(-radius.x / 2, radius.y / 2, -radius.z / 2);
        glVertex3f(-radius.x / 2, radius.y / 2, radius.z / 2);
 
        glVertex3f(-radius.x / 2, radius.y / 2, -radius.z / 2);
        glVertex3f(-radius.x / 2, -radius.y / 2, -radius.z / 2);
 
        glVertex3f(-radius.x / 2, -radius.y / 2, -radius.z / 2);
        glVertex3f(radius.x / 2, -radius.y / 2, -radius.z / 2);
 
        glVertex3f(-radius.x / 2, -radius.y / 2, -radius.z / 2);
        glVertex3f(-radius.x / 2, -radius.y / 2, radius.z / 2);
 
        glVertex3f(radius.x / 2, -radius.y / 2, -radius.z / 2);
        glVertex3f(radius.x / 2, -radius.y / 2, radius.z / 2);
        glEnd();
    }
Допустим я эти минималки и максималки знаю, как мне попробовать ими воспользоваться чтобы отрисовать правильно 2D bounding box?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.03.2022, 21:27
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Если получилось заполнить структуру, то вот упрощенный пример, как по 3D AABB построить 2D AABB (с учетом кода из поста #8):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
std::vector<bbox2> build_quads(boxes const& b)
{
  std::vector<bbox2> result;
  for (auto const& obj : b.objects)
  {
    const auto mvp = b.projection * obj.modelview;
    const auto mid = mvp * glm::vec4{ glm::mix(obj.bb.min, obj.bb.max, 0.5f), 1.0f };
    if (mid.z < -mid.w || mid.z > mid.w)
      continue;
    std::array<glm::vec4, 8> const box_vertices{
      glm::vec4{obj.bb.min, 1.0f},
      glm::vec4{obj.bb.min.x, obj.bb.min.y, obj.bb.max.z, 1.0f},
      glm::vec4{obj.bb.min.x, obj.bb.max.y, obj.bb.min.z, 1.0f},
      glm::vec4{obj.bb.max.x, obj.bb.min.y, obj.bb.min.z, 1.0f},
      glm::vec4{obj.bb.min.x, obj.bb.max.y, obj.bb.max.z, 1.0f},
      glm::vec4{obj.bb.max.x, obj.bb.min.y, obj.bb.max.z, 1.0f},
      glm::vec4{obj.bb.max.x, obj.bb.max.y, obj.bb.min.z, 1.0f},
      glm::vec4{obj.bb.max, 1.0f}
    };
    bbox2 box;
    for (auto const vtx : box_vertices) {
      auto const vtx_proj = mvp * vtx;
      glm::vec2 clamped_vtx_proj{ glm::clamp(glm::vec2{vtx_proj}, glm::vec2{-vtx_proj.w}, glm::vec2{vtx_proj.w}) };
      clamped_vtx_proj /= vtx_proj.w;
      box.min = glm::min(box.min, clamped_vtx_proj);
      box.max = glm::max(box.max, clamped_vtx_proj);
    }
    result.push_back(box);
  }
  return result;
}
И как их потом отрисовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void draw_boxes(std::vector<bbox2> const & data)
{
    // предпологаем, что активна матрица GL_MODELVIEW
    // depth и stencil тесты выключены
    gl->PushMatrix();
    gl->LoadIdentity();
    gl->MatrixMode(GL_PROJECTION);
    gl->PushMatrix();
    gl->LoadIdentity();
 
    for (auto b : data)
    {
      gl->Begin(GL_LINE_LOOP);
      gl->Color3f(1.0f, 1.0f, 1.0f); // цвет тут условно
      gl->Vertex2f(b.min.x, b.min.y);
      gl->Vertex2f(b.max.x, b.min.y);
      gl->Vertex2f(b.max.x, b.max.y);
      gl->Vertex2f(b.min.x, b.max.y);
      gl->End();
    }
    gl->PopMatrix();
    gl->MatrixMode(GL_MODELVIEW);
    gl->PopMatrix();
}
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
12.03.2022, 21:44  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
std::array<glm::vec4, 8> const box_vertices{
Ругается на box_verticles "Local variable is not initializated"
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.03.2022, 21:58
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Ругается на box_verticles "Local variable is not initializated"
Не гони. #include <array>
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.03.2022, 11:54  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Не гони. #include <array>
Да, спасибо. Это исправило ошибку.

Цитата Сообщение от zayats80888 Посмотреть сообщение
struct boxes {
  // матрица проекции
  glm::mat4 projection; // GL_PROJECTION_MATRIX, каждый кадр
Матрица проекции камеры или матрица проекции объекта?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.03.2022, 12:03
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Матрица проекции камеры или матрица проекции объекта?
Матрица проекции одна, общая, она меняется только при изменении разрешения и переходе от 3D к 2D.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
13.03.2022, 12:49  [ТС]
zayats80888, У меня пока что не получается нарисовать AABB, хотя ошибок уже нет. Сейчас говнокод свой поправлю, скорее всего как обычно дело в нём. Надеюсь получится.

Добавлено через 18 минут
zayats80888,

C++
1
2
3
4
5
struct bbox2
{
    glm::vec2 min{ std::numeric_limits<float>::max() },
        max{ std::numeric_limits<float>::lowest() };
};
Разве не должно быть так?

C++
1
2
3
4
5
struct bbox2
{
    glm::vec2 min{ std::numeric_limits<float>::lowest() },
        max{ std::numeric_limits<float>::max() };
};
Добавлено через 16 минут
zayats80888, Почему-то ничего не рисуется. Не могу понять в чём дело.

C++
1
2
3
4
// Глобальные
bbox3 entity { { -0.4F, -1.0F, -0.4F} , {0.4F, 1.0F, 0.4F } };
bbox3 chest { { -0.5F,  -0.5F,  -0.5F,}, { 0.5F, 0.5F, 0.5F } };
bbox3 largeChest { { -1.0F,  -0.5F,  -0.5F,}, { 1.0F, 0.5F, 0.5F } };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct bbox3
{
    glm::vec3 min{ std::numeric_limits<float>::max() },
    max{ std::numeric_limits<float>::lowest() };
};
 
// 2D AABB, понадобится позже
struct bbox2
{
    glm::vec2 min{ std::numeric_limits<float>::max() },
    max{ std::numeric_limits<float>::lowest() };
};
 
struct object_data
{
    glm::mat4 modelview; // GL_MODELVIEW_MATRIX, каждый кадр
    bbox3 bb;// AABB объекта, считается один раз, НЕ каждый кадр, если игнорировать анимацию
};
 
struct boxes
{
    // матрица проекции
    glm::mat4 projection; // GL_PROJECTION_MATRIX, каждый кадр
    // данные объекта
 
    std::vector<object_data> objects; // вектор объектов, для которых нужно построить 2D bbox
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
std::vector<bbox2> build_quads(boxes const& b)
{
    std::vector<bbox2> result;
    for (auto const& obj : b.objects)
    {
        const auto mvp = b.projection * obj.modelview;
        const auto mid = mvp * glm::vec4{ glm::mix(obj.bb.min, obj.bb.max, 0.5f), 1.0f };
 
        if (mid.z < -mid.w || mid.z > mid.w)
            continue;
 
        std::array<glm::vec4, 8> const box_vertices
        {
          glm::vec4{obj.bb.min, 1.0f},
          glm::vec4{obj.bb.min.x, obj.bb.min.y, obj.bb.max.z, 1.0f},
          glm::vec4{obj.bb.min.x, obj.bb.max.y, obj.bb.min.z, 1.0f},
          glm::vec4{obj.bb.max.x, obj.bb.min.y, obj.bb.min.z, 1.0f},
          glm::vec4{obj.bb.min.x, obj.bb.max.y, obj.bb.max.z, 1.0f},
          glm::vec4{obj.bb.max.x, obj.bb.min.y, obj.bb.max.z, 1.0f},
          glm::vec4{obj.bb.max.x, obj.bb.max.y, obj.bb.min.z, 1.0f},
          glm::vec4{obj.bb.max, 1.0f}
        };
 
        bbox2 box;
        for (auto const vtx : box_vertices)
        {
            auto const vtx_proj = mvp * vtx;
            glm::vec2 clamped_vtx_proj{ glm::clamp(glm::vec2{vtx_proj}, glm::vec2{-vtx_proj.w}, glm::vec2{vtx_proj.w}) };
            clamped_vtx_proj /= vtx_proj.w;
            box.min = glm::min(box.min, clamped_vtx_proj);
            box.max = glm::max(box.max, clamped_vtx_proj);
        }
 
        result.push_back(box);
    }
 
    return result;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void draw_boxes(std::vector<bbox2> const& data)
{
    // предпологаем, что активна матрица GL_MODELVIEW
    // depth и stencil тесты выключены
    glPushMatrix();
    glLoadIdentity();
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
 
    for (auto b : data)
    {
        glBegin(GL_LINE_LOOP);
        glColor3f(1.0f, 1.0f, 1.0f); // цвет тут условно
        glVertex2f(b.min.x, b.min.y);
        glVertex2f(b.max.x, b.min.y);
        glVertex2f(b.max.x, b.max.y);
        glVertex2f(b.min.x, b.max.y);
        glEnd();
    }
 
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
}
C++
1
boxes bboxes; // Глобальная
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// В конце когда нужно рисовать
glGetFloatv(GL_PROJECTION_MATRIX, value_ptr(test.projection));
 
glPushAttrib(GL_ALL_ATTRIB_BITS);
 
glMatrixMode(GL_PROJECTION);
glPushMatrix();
 
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
 
glDisable(GL_TEXTURE_2D);
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
 
glEnable(GL_LINE_SMOOTH);
 
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
vector<bbox2> box = build_quads(bboxes);
draw_boxes(box);
 
bboxes.objects.clear();
 
glPopAttrib();
 
glMatrixMode(GL_PROJECTION);
glPopMatrix();
 
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
C++
1
2
3
4
5
6
// Когда рисуется игрок
 
mat4 modelview;
glGetFloatv(GL_MODELVIEW_MATRIX, value_ptr(modelview));
 
bboxes.objects.push_back({ modelview, entity });
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.03.2022, 13:10
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Разве не должно быть так?
нет
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Почему-то ничего не рисуется. Не могу понять в чём дело.
В состоянии, когда должно рисоваться, скинь распечатку данных этого вектора box:
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
vector<bbox2> box = build_quads(bboxes);
А также состояние bboxes.
Для удобства распечатки объектов glm можешь использовать glm::to_string из заголовка <glm/gtx/string_cast.hpp>.

Не по теме:

Только для 1-2 объектов, не засоряй



Добавлено через 4 минуты
И где загрузка матрицы проекции? Она меня больше всего интересует.

Добавлено через 3 минуты
А, вижу. Загружай её тогда же, когда и modelview, только один раз(используй флаг).
Или убедись, что она одна и та же.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2022, 13:10
Помогаю со студенческими работами здесь

Отрицательные элементы умножить на квадрат наименьшего элемента, а неотрицательные - на квадрат наибольшего
В массиве необходимо все отрицательные элементы умножить на квадрат его наименьшего элемента, а все неотрицательные элементы на квадрат...

Если квадрат числа меньше 100, напечатать число и его квадрат
Ввести с клавиатуры 10 чисел. Если квадрат числа меньше 100, напечатать число и его квадрат

Нарисовать квадрат с одинокой звёздочкой в центре. Весь квадрат орисовывается плюсиками
Нарисовать квадрат с одинокой звёздочкой в центре. Весь квадрат орисовывается плюсиками. Пользователь задаёт высоту и ширину.С++ Помогите...

Если квадрат числа меньше 100, напечатать число и его квадрат
Ввести с клавиатуры 10 чисел. Если квадрат числа меньше 100, напечатать число и его квадрат.

Если квадрат числа меньше 100, напечатать число и его квадрат
Ввести с клавиатуры 10 чисел. Если квадрат числа меньше 100, напечатать число и его квадрат.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru