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

[Irrlicht] Generowanie trójwymiarowej siatki heksagonalnej

Ostatnio zmodyfikowano 2024-03-17 11:35
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2024-03-10 06:25:19
Spróbuję przebudować kod.

Plan - wyznaczyć współrzędne v5, v6 każdego z trójkątów sześciokąta ( uwaga - zmieniłem numery wierzchołków )

Udało mi się wyznaczyć długość |v3 v5| i |v4 v6| czyli d. Teraz jakos muszę ją dodać do v3 i v5. Pomoże ktoś? Nie wiem jak pracować z wektorami a w necie są słabe poradniki.

 


float outerRadius = 10.0f;
float innerRadius = outerRadius * 0.866025404f;
float heightStep = 6.0f;
float tileBaseFactor = 0.8f;

float hexVertices[ ] =
{
    0.0f, outerRadius,
    innerRadius, outerRadius * 0.5f,
    innerRadius, - outerRadius * 0.5f,
    0.0f, - outerRadius,
    - innerRadius, - outerRadius * 0.5f,
    - innerRadius, outerRadius * 0.5f,
    0.0f, outerRadius
};

// ... --- ... //

for(int direction=0; direction<6; direction++)
{
    v1x = hexVertices[2*direction] * tileBaseFactor;
    v1z = hexVertices[2*direction+1] * tileBaseFactor;

    v2x = hexVertices[2*(direction+1)] * tileBaseFactor;
    v2z = hexVertices[2*(direction+1)+1] * tileBaseFactor;

    v3x = hexVertices[2*direction];
    v3z = hexVertices[2*direction+1];

    v4x = hexVertices[2*(direction+1)];
    v4z = hexVertices[2*(direction+1)+1];

    float d = (1.0f - tileBaseFactor) * outerRadius / 2.0f;    // distance between |v3 v5| or |v4 v6|

    // v5x = v3x + d
    // v5z = v3z;

    // v6x = v4x - d;
    // v6z = v4z;

   
}
P-180931
pekfos
» 2024-03-13 18:44:51
Trochę na upartego to robisz.
1. Utwórz sześciokąty (6 współrzędnych na kafel)
2. Utwórz trójkąty na styku 3 sześciokątów, prostokąty na styku dwóch sześciokątów
3. Podziel te trójkąty i prostokąty na części pod teksturowanie przejść.

Te kroki są proste bo sprowadzają się do uśredniania współrzędnych by obliczyć punkt pośredni między dwoma lub trzeba punktami. Nie kombinuj ze swoim podwójnym sześciokątem bo licząc każdy taki kawałek niezależnie robisz sobie pod górę z obliczeniami, a na koniec wynik wcale nie musi być poprawny przez błąd obliczeń. Jeśli dwa wierzchołki mają mieć te same współrzędne to oblicz te współrzędne raz, bo jak będziesz obliczać to kilka razy z różnych stron to to nie będą te same współrzędne. Im dalej od (0,0) tym większy błąd obliczeń i możesz zacząć obserwować artefakty.
P-180936
tBane
Temat założony przez niniejszego użytkownika
» 2024-03-14 12:02:16
A nieważne, albo Ty nie rozumiesz co próbuję osiągnąć albo też nie wiesz jak to zrobić.

P-180942
DejaVu
» 2024-03-14 21:32:50
Ja chętnie zobaczę jaki osiągniesz wizualnie efekt końcowy :) Koncept wygląda nieźle, a prototypy wyglądają obiecująco.
P-180943
pekfos
» 2024-03-14 22:13:25
A nieważne, albo Ty nie rozumiesz co próbuję osiągnąć albo też nie wiesz jak to zrobić.
Hold my beer...

Coś takiego? Wygenerowane opisanym algorytmem. Implementację pozostawiam jako ćwiczenie dla czytelnika.
P-180944
tBane
Temat założony przez niniejszego użytkownika
» 2024-03-15 02:19:00
No, to ja tego nie zrobię, bo nie potrafię.

To znaczy mam pewną metodę ale tracę na wydajności, mam też drugą metodę ale mogę wtedy użyć tylko jednego materiału dla mesh. Pewnie porzucę projekt z braku wiedzy.
P-180945
pekfos
» 2024-03-15 18:53:11
Jeśli najpierw obliczysz sześciokąty, dodatkowe wierzchołki możesz obliczyć jako średnią arytmetyczną z dwóch lub trzech współrzędnych.

Problemem jest wtedy tylko połapanie się z tym gdzie leży jaki sąsiad. Możesz tu po prostu trzymać zestawy 6 współrzędnych w tablicy dwuwymiarowej. Wcale nie potrzebujesz siódmego wierzchołka na środku by mieć trójkąty, chociaż przyznaję że wireframe wygląda ładniej z nim. I dobrze czytasz - tablica dwuwymiarowa. Ja bym nie wrzucał wszystkiego od razu do mesh buffer, bo to ogranicza swobodę manewru. Dobra forma pośrednia danych upraszcza kod, a wydajność nie jest w tym wypadku istotna bo mapę wystarczy wygenerować raz.
P-180946
tBane
Temat założony przez niniejszego użytkownika
» 2024-03-16 11:33:16
Wiem o tym, ale u mnie każdy sceneNode ma wartości z zakresu [-outerRadius, outerRadius]. Gdybym zrobił tak jak mi doradzasz wtedy miałbym jeden wielki mesh, a na jeden mesh można użyć tylko jeden materiał w Irrlicht
C/C++
sidesMeshBuffer[ direction ]->Material.setTexture( 0, tex );
.
Czyli metoda błędna.

Kolejna metoda to rysowanie ręczne trójkątów (jeżeli taka jest w ogóle) lub stworzenie olbrzymiej ilości mesh'ów, na zasadzie jeden trójkąt = jeden mesh. Ale raczej jest to nieoptymalne. Ewentualnie może zmienie środowisko :-/
P-180949
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona