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

[Irrlicht] Generowanie trójwymiarowej siatki heksagonalnej

Ostatnio zmodyfikowano 2024-03-20 14:01
Autor Wiadomość
pekfos
» 2024-03-16 17:06:15
Możesz mieć jeden materiał i umieścić różne grafiki na jednej teksturze. To dość typowe rozwiązanie bo wystarczy jeden wsad do karty graficznej. Następnym rozwiązaniem byłoby generowanie jednego modelu per materiał, wtedy wszystkie kafle mają takie same uv bo podmieniasz całą teksturę, a ilość wsadów jest zależna od ilości materiałów a nie rozmiaru mapy.

Wiem o tym, ale u mnie każdy sceneNode ma wartości z zakresu [-outerRadius, outerRadius].
Nieistotne. Takie założenie możesz spełnić na etapie konwersji z formy pośredniej do mesha. Dla renderowania zaaplikujesz dla każdego kafla translację by umieścić go we właściwym miejscu, więc przy konwersji zaaplikuj na współrzędnych translację przeciwną. Jeśli na prawdę musisz. Model może mieć swoje '0,0' gdziekolwiek, więc tak naprawdę wszystkie kafle mogą mieć pozycję 0,0 na scenie i mieć właściwe przesunięcie zamodelowane w sobie. I tak jest tylko jeden sposób w jaki te klocki można złożyć.
P-180950
tBane
Temat założony przez niniejszego użytkownika
» 2024-03-17 10:55:39
Nieistotne. Takie założenie możesz spełnić na etapie konwersji z formy pośredniej do mesha.
Właśnie pytałem jak to uzyskać i nie było odpowiedzi.

Model może mieć swoje '0,0' gdziekolwiek, więc tak naprawdę wszystkie kafle mogą mieć pozycję 0,0 na scenie i mieć właściwe przesunięcie zamodelowane w sobie.

Czyli, że jak. Współrzędne wierzchołków dać globalne a pozycje modelu każdego jako [0,0] ? Trochę mi się wtedy program wysypał, czasem nie wiadomo skąd generuje się mniejsze kafelki a dystans między nimi się zwiększa lub nawala system kolizji (koliduje tylko z kafelkiekm 0,0 )

C/C++
vector3df globalPos = hexToGlobal( x, z );
baseMeshBuffer->Vertices.push_back( S3DVertex( globalPos.X, height * heightStep, globalPos.Z, 0, 0, 0, color, 0, 0 ) ); // SET THE VERTICES
for( int dir = 0; dir < 6; dir++ )
{
   
   
   
baseMeshBuffer->Vertices.push_back( S3DVertex(
   
globalPos.X + hexVertices[ 2 * dir ] * tileBaseFactor,
   
height * heightStep,
   
globalPos.Z + hexVertices[ 2 * dir + 1 ] * tileBaseFactor,
   
0, 0, 0, color,
   
//texture_uv[2 * dir] * tileBaseFactor,
    //texture_uv[2 * dir + 1] * tileBaseFactor));
   
texture_uv[ 2 * dir ] * tileBaseFactor,
   
texture_uv[ 2 * dir + 1 ] * tileBaseFactor
    ) );
   
   
baseMeshBuffer->BoundingBox.addInternalPoint( vector3df(
   
globalPos.X + hexVertices[ 2 * dir ] * tileBaseFactor,
   
height * heightStep,
   
globalPos.Z + hexVertices[ 2 * dir + 1 ] * tileBaseFactor ) );
}

baseMeshBuffer->Material.Wireframe = false; // SET THE MATERIAL
baseMeshBuffer->Material.Lighting = false;
baseMeshBuffer->Material.setTexture( 0, getTexture( ttype ) );

baseMesh = new SMesh(); // CREATE MESH
baseMesh->addMeshBuffer( baseMeshBuffer );
baseMesh->recalculateBoundingBox();
P-180951
tBane
Temat założony przez niniejszego użytkownika
» 2024-03-17 11:35:17
Wiem już jak obliczyć wszystkie współrzędne zewnętrznego sześciokąta. Pozostało tylko te trójkąty między kafelkami załatać.

C/C++
for( int dir = 0; dir < 6; dir++ ) // direction
{
   
v1x = hexVertices[ 2 * dir ] * tileBaseFactor;
   
v1z = hexVertices[ 2 * dir + 1 ] * tileBaseFactor;
   
   
v2x = hexVertices[ 2 *( dir + 1 ) ] * tileBaseFactor;
   
v2z = hexVertices[ 2 *( dir + 1 ) + 1 ] * tileBaseFactor;
   
   
v3x = hexVertices[ 2 * dir ];
   
v3z = hexVertices[ 2 * dir + 1 ];
   
v4x = hexVertices[ 2 *( dir + 1 ) ];
   
v4z = hexVertices[ 2 *( dir + 1 ) + 1 ];
   
   
float d =( 1.0f - tileBaseFactor ) * outerRadius / 2.0f;
   
   
v5x = v3x +( d / outerRadius ) *( v4x - v3x );
   
v5z = v3z +( d / outerRadius ) *( v4z - v3z );
   
   
v6x = v4x +( d / outerRadius ) *( v3x - v4x );
   
v6z = v4z +( d / outerRadius ) *( v3z - v4z );
}
P-180952
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4