Top.Mail.Ru
Ответы

Помогите с кодом c++ (sfml)

У меня есть такой код:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
 #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))) 
    ); 
} 


и также есть класс , но он не вмещается в * текст вопроса *

одна точка полигона всегда уходит в ноль (или не одна) как это можно исправить?
И да отображаются все грани сразу (пофикшу это когда буду делать освещение)

По дате
По Рейтингу
Аватар пользователя
Новичок
11мес

Одна точка равна нулю (индекс = 3) потому что тут

1
 polygon.setPoint(j, sf::Vector2f(scrX + offsetX, scrY + offsetY));  

индексатор j взят из внутреннего цикла [0...2].
Видимо во внутреннем цикле должны браться три координаты из Vector3 и проецироваться на плоскость вывода (c координатами Vector2).
А уже после него записывать этот самый Vector2 по индексатору i (из верхнего цикла).

Аватар пользователя
Профи
11мес

Мои познания в 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)))
);
}
Данный ответ я получил из нейросети