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 ? |
|
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ć. #include <SFML/Graphics.hpp> #include <vector> #include <cmath>
struct Triangle { sf::Vector2f a, b, c; };
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; }
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 ]; float crossProduct =( B.x - A.x ) *( C.y - A.y ) -( B.y - A.y ) *( C.x - A.x ); if( crossProduct <= 0 ) return false; for( size_t j = 0; j < vertices.size(); j++ ) { if( j != i && j != prev && j != next && isPointInTriangle( A, B, C, vertices[ j ] ) ) { return false; } } return true; }
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 ] ) ) { triangles.push_back( { vertices[ indices[ prev ] ], vertices[ indices[ i ] ], vertices[ indices[ next ] ] } ); indices.erase( indices.begin() + i ); n--; earFound = true; break; } } if( !earFound ) break; } if( n == 3 ) { triangles.push_back( { vertices[ indices[ 0 ] ], vertices[ indices[ 1 ] ], vertices[ indices[ 2 ] ] } ); } return triangles; }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-10 20:17:30 |
|
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. |
|
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ś ? |
|
DejaVu |
» 2024-11-10 21:31:34 Na pewno się da, tylko czy to takie ważne. |
|
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. |
|
pekfos |
» 2024-11-11 11:42:08 A czemu to ma służyć? |
|
« 1 » 2 |