Как отрисовать все грани куба в самописном движке на С++/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]));
}
}
}*/