Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.X] Mesh - siatka dla obiektów 2D

Ostatnio zmodyfikowano 2024-11-11 21:06
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X] Mesh - siatka dla obiektów 2D
» 2024-11-10 18:56:47
Witam!
Chciałbym napisać program do generowania meshu dla obiektów 2D.
W programie wyświetlany byłby sprajt GameObjectu, a użytkownik poprzez kliknięcia myszą wskazywałby kolejne punkty dla siatki mesh. Jak generować mesh z podanych punktów ?
P-181879
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 19:15:09
Chat GPT doradził mi coś takiego. Ciekawe czy będzie działać.

C/C++
#include <SFML/Graphics.hpp>
#include <vector>
#include <cmath>

struct Triangle {
   
sf::Vector2f a, b, c;
};

// Funkcja pomocnicza sprawdzająca, czy punkt P leży wewnątrz trójkąta ABC
bool isPointInTriangle( sf::Vector2f A, sf::Vector2f B, sf::Vector2f C, sf::Vector2f P ) {
   
float w1 =( A.x *( C.y - A.y ) +( P.y - A.y ) *( C.x - A.x ) - P.x *( C.y - A.y ) ) /
    ((
B.y - A.y ) *( C.x - A.x ) -( B.x - A.x ) *( C.y - A.y ) );
   
float w2 =( P.y - A.y - w1 *( B.y - A.y ) ) /( C.y - A.y );
   
return w1 >= 0 && w2 >= 0 &&( w1 + w2 ) <= 1;
}

// Funkcja sprawdzająca, czy trójkąt (A, B, C) jest uchem
bool isEar( const std::vector < sf::Vector2f > & vertices, int i, int prev, int next ) {
   
sf::Vector2f A = vertices[ prev ];
   
sf::Vector2f B = vertices[ i ];
   
sf::Vector2f C = vertices[ next ];
   
   
// Sprawdź, czy trójkąt jest wypukły
   
float crossProduct =( B.x - A.x ) *( C.y - A.y ) -( B.y - A.y ) *( C.x - A.x );
   
if( crossProduct <= 0 ) return false; // Trójkąt jest wklęsły, nie jest uchem
   
    // Sprawdź, czy inne wierzchołki leżą wewnątrz trójkąta
   
for( size_t j = 0; j < vertices.size(); j++ ) {
       
if( j != i && j != prev && j != next && isPointInTriangle( A, B, C, vertices[ j ] ) ) {
           
return false; // Trójkąt zawiera inne wierzchołki, nie jest uchem
       
}
    }
   
return true; // Trójkąt jest uchem
}

// Funkcja do triangulacji wielokąta metodą Ear Clipping
std::vector < Triangle > triangulate( std::vector < sf::Vector2f > & vertices ) {
   
std::vector < Triangle > triangles;
   
std::vector < int > indices( vertices.size() );
   
for( int i = 0; i < vertices.size(); i++ ) {
       
indices[ i ] = i;
   
}
   
   
int n = vertices.size();
   
while( n > 3 ) {
       
bool earFound = false;
       
       
for( int i = 0; i < n; i++ ) {
           
int prev =( i + n - 1 ) % n;
           
int next =( i + 1 ) % n;
           
           
if( isEar( vertices, indices[ i ], indices[ prev ], indices[ next ] ) ) {
               
// Dodaj trójkąt do listy meshu
               
triangles.push_back( { vertices[ indices[ prev ] ], vertices[ indices[ i ] ], vertices[ indices[ next ] ] } );
               
               
// Usuń ucho z listy
               
indices.erase( indices.begin() + i );
               
n--;
               
earFound = true;
               
break;
           
}
        }
       
       
// Jeśli nie znaleziono ucha, zakończ (uniknięcie nieskończonej pętli)
       
if( !earFound ) break;
       
   
}
   
   
// Dodaj ostatni pozostały trójkąt
   
if( n == 3 ) {
       
triangles.push_back( { vertices[ indices[ 0 ] ], vertices[ indices[ 1 ] ], vertices[ indices[ 2 ] ] } );
   
}
   
   
return triangles;
}
P-181880
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 20:17:30
Nie działa niestety :-/

P-181882
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 20:31:01
Jednak działa. Tylko trzeba dodawać punkty w kierunku zgodnym z ruchem wskazówek zegara.

P-181883
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 20:37:25
Jak myślicie, da sie to zautomatyzować czy nie za bardzo ? To znaczy takie drzewo triangulować jakoś ?

P-181884
DejaVu
» 2024-11-10 21:31:34
Na pewno się da, tylko czy to takie ważne.
P-181885
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 22:05:35
W sumie dałoby się obejść bez tego, ale musiałbym wtedy dla każdego prefabrykatu ręcznie ustawiać mesh. Poza tym gdybym to zautomatyzować to mogłoby to być precyzyjniejsze od ręcznego ustawiania.

Na razie wymyśliłem coś takiego, że punkty z krawędzi płótna są przesuwane do centrum obrazka aż napotkają piksel który nie jest przezroczysty. Następnie obliczany jest obwód kształtu i wtedy jeszcze raz generujemy punkty na krawędziach płótna w zależności od wielkości obwodu i znów tym razem ostatecznie przesuwamy punkty do centrum.
P-181886
pekfos
» 2024-11-11 11:42:08
A czemu to ma służyć?
P-181889
« 1 » 2
  Strona 1 z 2 Następna strona