Помогите с кодом c++ (sfml)
У меня есть такой код:
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Vector3.h";
#include <windows.h>
Vector3 RotateY(Vector3 v, float angle);
Vector3 RotateX(Vector3 v, float angle);
int main()
{
sf::RenderWindow window(sf::VideoMode(1440, 720), "3D renderer");
sf::CircleShape circle(5);
circle.setFillColor(sf::Color::Red);
int offsetX = 720;
int offsetY = 360;
float fov, zoom, x, y, z, scrX, scrY;
float RotX = 0;//sf::Mouse::getPosition(window).x;
float RotY = 0;//sf::Mouse::getPosition(window).y;
Vector3 R(0, 0, 0);
fov = 2;
zoom = 80;
Vector3 light(-2, 2, -2);
Vector3 vertexes[] = {
Vector3(-1, 1, -1), //0
Vector3(1, 1, -1), //1
Vector3(1, -1, -1), //2
Vector3(-1, -1, -1),//3
Vector3(-1, 1, 1), //4
Vector3(1, 1, 1), //5
Vector3(1, -1, 1), //6
Vector3(-1, -1, 1) //7
};
table edges[] = {
table(0, 1, 2, 3),
table(4, 5, 6, 7),
table(0, 4, 7, 3),
table(1, 5, 6, 2),
table(0, 4, 5, 1),
table(3, 7, 6, 2)
};
float rr = 0.00000;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
sf::ConvexShape polygon;
polygon.setPointCount(4);
for (int i = 0; i != sizeof(edges) / sizeof(*edges); i++)
{
for (int j = 0; j != 3; j++)
{
R = RotateY(RotateX(vertexes[edges[i].get(j)], RotY), RotX);
scrX = (fov * R.x) / (fov + R.z);
scrY = (fov * R.y) / (fov + R.z);
scrX *= zoom;
scrY *= zoom;
polygon.setPoint(j, sf::Vector2f(scrX + offsetX, scrY + offsetY));
}
polygon.setFillColor(sf::Color::White);
window.draw(polygon);
}
rr += 0.0008;
//RotX = sin(rr);//-(sqrt(sf::Mouse::getPosition(window).y) / sf::Mouse::getPosition(window).y)*360;
//RotY = cos(rr);//(sqrt(sf::Mouse::getPosition(window).x) / sf::Mouse::getPosition(window).x) * 360;
window.display();
}
return 0;
}
Vector3 RotateX(Vector3 v, float angle)
{
return Vector3(
v.x,
(v.y * (cos(angle))) - (v.z * (sin(angle))),
(v.y * (sin(angle))) + (v.z * (cos(angle)))
);
}
Vector3 RotateY(Vector3 v, float angle)
{
return Vector3(
(v.z * (sin(angle))) + (v.x * (cos(angle))),
v.y,
(v.z * (cos(angle))) - (v.x * (sin(angle)))
);
}
и также есть класс , но он не вмещается в * текст вопроса *
одна точка полигона всегда уходит в ноль (или не одна) как это можно исправить?
И да отображаются все грани сразу (пофикшу это когда буду делать освещение)
Одна точка равна нулю (индекс = 3) потому что тут
polygon.setPoint(j, sf::Vector2f(scrX + offsetX, scrY + offsetY));
индексатор j взят из внутреннего цикла [0...2].
Видимо во внутреннем цикле должны браться три координаты из Vector3 и проецироваться на плоскость вывода (c координатами Vector2).
А уже после него записывать этот самый Vector2 по индексатору i (из верхнего цикла).
Мои познания в c++ не очень хорош, я больше по java, но попробуй это
#include <SFML/Graphics.hpp>
#include <iostream>
#include "Vector3.h"
#include <windows.h>
Vector3 RotateY(Vector3 v, float angle);
Vector3 RotateX(Vector3 v, float angle);
int main()
{
sf::RenderWindow window(sf::VideoMode(1440, 720), "3D renderer");
sf::CircleShape circle(5);
circle.setFillColor(sf::Color::Red);
int offsetX = 720;
int offsetY = 360;
float fov, zoom, scrX, scrY;
float RotX = 0;
float RotY = 0;
fov = 2;
zoom = 80;
Vector3 vertexes[] = {
Vector3(-1, 1, -1), //0
Vector3(1, 1, -1), //1
Vector3(1, -1, -1), //2
Vector3(-1, -1, -1),//3
Vector3(-1, 1, 1), //4
Vector3(1, 1, 1), //5
Vector3(1, -1, 1), //6
Vector3(-1, -1, 1) //7
};
table edges[] = {
table(0, 1, 2, 3),
table(4, 5, 6, 7),
table(0, 4, 7, 3),
table(1, 5, 6, 2),
table(0, 4, 5, 1),
table(3, 7, 6, 2)
};
float rr = 0.00000;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
sf::ConvexShape polygon;
polygon.setPointCount(4);
for (int i = 0; i != sizeof(edges) / sizeof(*edges); i++)
{
for (int j = 0; j != 4; j++)
{
Vector3 R = RotateY(RotateX(vertexes[edges[i].get(j)], RotY), RotX);
if (R.z != 0)
{
scrX = (fov * R.x) / (fov + R.z);
scrY = (fov * R.y) / (fov + R.z);
scrX *= zoom;
scrY *= zoom;
polygon.setPoint(j, sf::Vector2f(scrX + offsetX, scrY + offsetY));
}
}
polygon.setFillColor(sf::Color::White);
window.draw(polygon);
}
rr += 0.0008;
window.display();
}
return 0;
}
Vector3 RotateX(Vector3 v, float angle)
{
return Vector3(
v.x,
(v.y * (cos(angle))) - (v.z * (sin(angle))),
(v.y * (sin(angle))) + (v.z * (cos(angle)))
);
}
Vector3 RotateY(Vector3 v, float angle)
{
return Vector3(
(v.z * (sin(angle))) + (v.x * (cos(angle))),
v.y,
(v.z * (cos(angle))) - (v.x * (sin(angle)))
);
}
Данный ответ я получил из нейросети