Как отрисовать все грани куба в самописном движке на С++/SFML

Я пишу небольшую программу, которая должна просто вывести куб, не привлекая библиотеки типа OpenGl или SDL. Я написал все преобразования над матрицами и другими данными, этот куб представляющий, но я застопорился при попытке написания цикла отрисовки граней куба, так как не представляю как это сделать с SFML. Отрисовка происходит в 3DObjectDescription.cpp Заранее спасибо за помощь).

3DObjectDescription.h

#pragma once
#include <SFML/Graphics.hpp>
#include "MoveMatrix.h"
#include "MainRender.h"

class MainRender;

class Object3D
{
public:
    MainRender *render;
    nc::NdArray<float> vertexes;

    nc::NdArray<int> faces;

    Object3D(MainRender& render);

    void translation(float tX, float tY, float tZ);
    void rotate_x(float angle);
    void rotate_y(float angle);
    void rotate_z(float angle);
    void scale_(float scale_c);

    void screen_projection();
};

3DObjectDescription.cpp

#include "3DObjectDescription.h"
#include <NumCpp.hpp>
#include "MainRender.h"

Object3D::Object3D(MainRender &render_class)
{
    this->render = &render_class;
    vertexes = {{0,0,0,1}, {0,1,0,1}, {1,1,0,1}, {1,0,0,1},
                {0,0,1,1}, {0,1,1,1}, {1,1,1,1}, {1,0,1,1}};

    faces = {{0,1,2,3}, {4,5,6,7}, {0,4,5,1}, {2,3,7,6}, {1,2,6,5}, {0,3,7,4}};
}

void Object3D::translation(float tX, float tY, float tZ)
{
    vertexes = nc::dot(vertexes, translate(tX, tY, tZ));
}

void Object3D::rotate_x(float angle_)
{
    vertexes = nc::dot(vertexes, rotation_X(angle_));
}

void Object3D::rotate_y(float angle_)
{
    vertexes = nc::dot(vertexes, rotation_Y(angle_));
}

void Object3D::rotate_z(float angle_)
{
    vertexes = nc::dot(vertexes, rotation_Z(angle_));
}

void Object3D::scale_(float scale_c)
{
    vertexes = nc::dot(vertexes, scale(scale_c));
}

void Object3D::screen_projection()
{
    float a = 2; float b = -2;
    nc::NdArray <float> vertexes1 = dot(this->vertexes, render->camera.camera_matrix());
    vertexes1 = dot(vertexes1, render->projection.projection_matrix);

    vertexes1 = vertexes1 / vertexes1(vertexes1.rSlice(), -1).reshape(-1, 1);
    vertexes1.putMask((vertexes1 > a | (vertexes1 < b)), 0);

    vertexes1 = dot(vertexes1, render->projection.screen_resl_matrix);
    vertexes1 = vertexes1(vertexes1.rSlice(), vertexes1.rSlice(2));

}

    // Моя попытка что-то придумать оказалась провальной...
    /*for(auto& face : this->faces)
    {
        int polygonCounter = vertexes1[face];
        sf::ConvexShape polygon;

        if (!(nc::any((polygonCounter == render.RenderX) | (polygonCounter == render.RenderY))))
        {
            polygon.setPointCount(polygonCounter);
            for (int i = 0; i < sizeof(face) / sizeof(float); i++)
            {
                polygon.setPoint(i, Vector2f(face[i]));
            }
        }
    }*/

Ответы (0 шт):