Рендеринг 3D-куба в SFML без OpenGLC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Рендеринг 3D-куба в SFML без OpenGL

Сообщение Anonymous »

Я пытаюсь реализовать однородные координаты в своем средстве 3D-рендеринга после того, как смог визуализировать ортогональную проекцию 3D-куба, используя только матрицы 3x3. Но теперь все пошло не так. В Интернете не так много учебных пособий по этому поводу, но я хочу иметь возможность использовать трехмерные векторы и однородные матрицы для отображения трехмерного куба в окне SFML с использованием перспективной проекции.
Репозиторий GitHub
Что конкретно не так с моим кодом, так это то, что я получаю большие числа для своих вершин (как показано в журнале консоли) и в конечном итоге не вижу куба!
Куб .cpp: функция-конструктор, в которой вершины проекции равны вершинам (функции перемещения и вращения вершин выполняются вне функции проекции экрана и вызываются только один раз перед игровым циклом)

Код: Выделить всё

Cube::Cube() {
vertices = {{0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0},
{0, 0, 1}, {0, 1, 1}, {1, 1, 1}, {1, 0, 1}};
projection_vertices = vertices;
modified_vertices = {{0, 0}, {0, 0}, {0, 0}, {0, 0},
{0, 0}, {0, 0}, {0, 0}, {0, 0}};
p_cube_vertbuff = new sf::VertexArray(sf::LineStrip, 8);
Cube.cpp: функция Screen Projection, которая обрабатывает все умножения трехмерных векторных матриц. Здесь вершины изменяются, а затем в конечном итоге отправляются в p_cube_vertbuff, который представляет собой линейную полосу массива вершин SFML, которая должна отображать 3D-куб.

Код: Выделить всё

void Cube::screen_projection(Camera* camera, Projection* projection, sf::RenderWindow& wind) {
printf("Cube\n");
for (int i = 0; i < projection_vertices.size(); i++) {
printf("%f, %f, %f\n", projection_vertices[i].x, projection_vertices[i].y, projection_vertices[i].z);
projection_vertices[i] = vec3_mat_mul(projection_vertices[i], camera->camera_matrix());
// printf("%f, %f, %f\n", vertices[i].x, vertices[i].y, vertices[i].z);
projection_vertices[i] = vec3_mat_mul(projection_vertices[i], projection->projection_matrix);
// printf("%f, %f, %f\n", vertices[i].x, vertices[i].y, vertices[i].z);
projection_vertices[i] = vec3_mat_mul(projection_vertices[i], projection->to_screen_matrix);
// printf("%f, %f, %f\n", vertices[i].x, vertices[i].y, vertices[i].z);
modified_vertices[i] = vec3_to_vec2(projection_vertices[i]);
}

for (int i = 0; i < modified_vertices.size(); i++) {
// printf("%f, %f\n", modified_vertices[i].x, modified_vertices[i].y);
(*(p_cube_vertbuff))[i].position = sf::Vector2f(modified_vertices[i].x, modified_vertices[i].y);
(*(p_cube_vertbuff))[0].color = sf::Color(255, 0, 0);
}

wind.draw(*p_cube_vertbuff);
}
РЕДАКТИРОВАТЬ: я добавил вершины, равные функции вершин проекции, которую я вызываю после функции проекции экрана в игровом цикле:

Код: Выделить всё

void Cube::vertices_to_projection() {
vertices = projection_vertices;}
Я пытался использовать структуры для векторов, создать функцию умножения матриц на вектор и использовать матрицы 4x4 для перспективной проекции, модели для просмотра, преобразований камеры и преобразований куба, которые я нашел. онлайн, но они, похоже, несовместимы с моим кодом, возможно, из-за того, что они произошли от OpenGL или Vulkan, но я не хочу использовать ни один из них, только чистый C++ и SFML (я знаю, что SFML использует OpenGl)

Подробнее здесь: https://stackoverflow.com/questions/786 ... out-opengl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»