Cześć, mam taki problem. Napisałem sobie taki oto kod:
void AChunk::createMesh()
{
int32 X = FMath::FloorToInt(GetActorLocation().X / 100.0f);
int32 Y = FMath::FloorToInt(GetActorLocation().Y / 100.0f);
int32 Z = FMath::FloorToInt(GetActorLocation().Z / 100.0f);
for (int32 x = 0; x < 16; ++x)
{
for (int32 y = 0; y < 16; ++y)
{
for (int32 z = 0; z < 16; ++z)
{
//Jeżeli od dowolnej strony jest odkryty
float noiseXplus = noise3D((x + X + 1) * generationRange, (y + Y) * generationRange, (z + Z) * generationRange);
float noiseXminus = noise3D((x + X - 1) * generationRange, (y + Y) * generationRange, (z + Z) * generationRange);
float noiseYplus = noise3D((x + X) * generationRange, (y + Y + 1) * generationRange, (z + Z) * generationRange);
float noiseYminus = noise3D((x + X) * generationRange, (y + Y - 1) * generationRange, (z + Z) * generationRange);
float noiseZplus = noise3D((x + X) * generationRange, (y + Y) * generationRange, (z + Z + 1) * generationRange);
float noiseZMinus = noise3D((x + X) * generationRange, (y + Y) * generationRange, (z + Z - 1) * generationRange);
if (noiseYplus > 0.2 || noiseYminus > 0.2 || noiseXplus > 0.2 || noiseXminus > 0.2 || noiseZplus > 0.2 || noiseZMinus > 0.2)
{
if (noise3D((x + X) * generationRange, (y + Y) * generationRange, (z + Z) * generationRange) > 0.2)
{
int32 vFind000 = vertices.Find(FVector(x * 100, y * 100, z * 100));
int32 vFind100 = vertices.Find(FVector((x + 1) * 100, y * 100, z * 100));
int32 vFind010 = vertices.Find(FVector(x * 100, (y + 1) * 100, z * 100));
int32 vFind001 = vertices.Find(FVector(x * 100, y * 100, (z + 1) * 100));
int32 vFind110 = vertices.Find(FVector((x + 1) * 100, (y + 1) * 100, z * 100));
int32 vFind101 = vertices.Find(FVector((x + 1) * 100, y * 100, (z + 1) * 100));
int32 vFind011 = vertices.Find(FVector(x * 100, (y + 1) * 100, (z + 1) * 100));
int32 vFind111 = vertices.Find(FVector((x + 1) * 100, (y + 1) * 100, (z + 1) * 100));
if (!(noiseXminus > 0.2))
{
int32 v1 = 0;
int32 v2 = 0;
int32 v3 = 0;
int32 v4 = 0;
if (vFind000 == -1)
{
vertices.Add(FVector(x * 100, y * 100, z * 100));
v1 = vertices.Num() - 1;
}
else
{
v1 = vFind000;
}
//***************************************************************
if (vFind001 == -1)
{
vertices.Add(FVector(x * 100, y * 100, (z + 1) * 100));
v2 = vertices.Num() - 1;
}
else
{
v2 = vFind001;
}
//***************************************************************
if (vFind011 == -1)
{
vertices.Add(FVector(x * 100, (y + 1) * 100, (z + 1) * 100));
v3 = vertices.Num() - 1;
}
else
{
v3 = vFind011;
}
//***************************************************************
if (vFind010 == -1)
{
vertices.Add(FVector(x * 100, (y + 1) * 100, z * 100));
v4 = vertices.Num() - 1;
}
else
{
v4 = vFind010;
}
//***************************************************************
addTriangle(v1, v2, v3);
addTriangle(v1, v3, v4);
}
///***************************************************************************************
if (!(noiseXplus > 0.2))
{
int32 v1 = 0;
int32 v2 = 0;
int32 v3 = 0;
int32 v4 = 0;
if (vFind100 == -1)
{
vertices.Add(FVector((x + 1) * 100, y * 100, z * 100));
v1 = vertices.Num() - 1;
}
else
{
v1 = vFind100;
}
//***************************************************************
if (vFind101 == -1)
{
vertices.Add(FVector((x + 1) * 100, y * 100, (z + 1) * 100));
v2 = vertices.Num() - 1;
}
else
{
v2 = vFind101;
}
//***************************************************************
if (vFind111 == -1)
{
vertices.Add(FVector((x + 1) * 100, (y + 1) * 100, (z + 1) * 100));
v3 = vertices.Num() - 1;
}
else
{
v3 = vFind111;
}
//***************************************************************
if (vFind110 == -1)
{
vertices.Add(FVector((x + 1) * 100, (y + 1) * 100, z * 100));
v4 = vertices.Num() - 1;
}
else
{
v4 = vFind110;
}
//***************************************************************
addTriangle(v1, v3, v2);
addTriangle(v1, v4, v3);
}
///***************************************************************************************
if (!(noiseYplus > 0.2))
{
int32 v1 = 0;
int32 v2 = 0;
int32 v3 = 0;
int32 v4 = 0;
if (vFind010 == -1)
{
vertices.Add(FVector(x * 100, (y + 1) * 100, z * 100));
v1 = vertices.Num() - 1;
}
else
{
v1 = vFind010;
}
//***************************************************************
if (vFind111 == -1)
{
vertices.Add(FVector((x + 1) * 100, (y + 1) * 100, (z + 1) * 100));
v2 = vertices.Num() - 1;
}
else
{
v2 = vFind111;
}
//***************************************************************
if (vFind110 == -1)
{
vertices.Add(FVector((x + 1) * 100, (y + 1) * 100, z * 100));
v3 = vertices.Num() - 1;
}
else
{
v3 = vFind110;
}
//***************************************************************
if (vFind011 == -1)
{
vertices.Add(FVector(x * 100, (y + 1) * 100, (z + 1) * 100));
v4 = vertices.Num() - 1;
}
else
{
v4 = vFind011;
}
//***************************************************************
addTriangle(v1, v2, v3);
addTriangle(v1, v4, v2);
}
///***************************************************************************************
if (!(noiseYminus > 0.2))
{
int32 v1 = 0;
int32 v2 = 0;
int32 v3 = 0;
int32 v4 = 0;
if (vFind000 == -1)
{
vertices.Add(FVector(x * 100, y * 100, z * 100));
v1 = vertices.Num() - 1;
}
else
{
v1 = vFind000;
}
//***************************************************************
if (vFind101 == -1)
{
vertices.Add(FVector((x + 1) * 100, y * 100, (z + 1) * 100));
v2 = vertices.Num() - 1;
}
else
{
v2 = vFind101;
}
//***************************************************************
if (vFind001 == -1)
{
vertices.Add(FVector(x * 100, y * 100, (z + 1) * 100));
v3 = vertices.Num() - 1;
}
else
{
v3 = vFind001;
}
//***************************************************************
if (vFind100 == -1)
{
vertices.Add(FVector((x + 1) * 100, y * 100, z * 100));
v4 = vertices.Num() - 1;
}
else
{
v4 = vFind100;
}
//***************************************************************
addTriangle(v1, v2, v3);
addTriangle(v1, v4, v2);
}
///**************************************************************************************
if (!(noiseZMinus > 0.2))
{
int32 v1 = 0;
int32 v2 = 0;
int32 v3 = 0;
int32 v4 = 0;
if (vFind000 == -1)
{
vertices.Add(FVector(x * 100, y * 100, z * 100));
v1 = vertices.Num() - 1;
}
else
{
v1 = vFind000;
}
//***************************************************************
if (vFind110 == -1)
{
vertices.Add(FVector((x + 1) * 100, (y + 1) * 100, z * 100));
v2 = vertices.Num() - 1;
}
else
{
v2 = vFind110;
}
//***************************************************************
if (vFind100 == -1)
{
vertices.Add(FVector((x + 1) * 100, y * 100, z * 100));
v3 = vertices.Num() - 1;
}
else
{
v3 = vFind100;
}
//***************************************************************
if (vFind010 == -1)
{
vertices.Add(FVector(x * 100, (y + 1) * 100, z * 100));
v4 = vertices.Num() - 1;
}
else
{
v4 = vFind010;
}
//***************************************************************
addTriangle(v1, v2, v3);
addTriangle(v1, v4, v2);
}
if (!(noiseZplus > 0.2))
{
int32 v1 = 0;
int32 v2 = 0;
int32 v3 = 0;
int32 v4 = 0;
if (vFind001 == -1)
{
vertices.Add(FVector(x * 100, y * 100, (z + 1) * 100));
v1 = vertices.Num() - 1;
}
else
{
v1 = vFind001;
}
//***************************************************************
if (vFind101 == -1)
{
vertices.Add(FVector((x + 1) * 100, y * 100, (z + 1) * 100));
v2 = vertices.Num() - 1;
}
else
{
v2 = vFind101;
}
//***************************************************************
if (vFind111 == -1)
{
vertices.Add(FVector((x + 1) * 100, (y + 1) * 100, (z + 1) * 100));
v3 = vertices.Num() - 1;
}
else
{
v3 = vFind111;
}
//***************************************************************
if (vFind011 == -1)
{
vertices.Add(FVector(x * 100, (y + 1) * 100, (z + 1) * 100));
v4 = vertices.Num() - 1;
}
else
{
v4 = vFind011;
}
//***************************************************************
addTriangle(v1, v2, v3);
addTriangle(v1, v3, v4);
}
}
}
}
}
}
TArray<FColor> colors;
TArray<FProcMeshTangent> tangents;
mesh->CreateMeshSection(0, vertices, triangles, TArray<FVector>(), TArray<FVector2D>(), colors, tangents, true);
}
Problem jest jednak z tym, że generuje się to trochę czasu. Najwięcej tego czasu zżera miejsce, gdzie obliczam noiseXplus, noiseXminus itd. zaraz pod komentarzem "//Jeżeli od dowolnej strony jest odkryty". Kod działa w ten sposób, że generuje chunk 16/16/16 składający się z sześcianów, coś ala minecraft. Generuje on niekończące się jaskinie 3d. Samo generowanie siatki wygląda w ten sposób, że dla każdego sześcianu muszę obliczać szum perlina 7 razy. Dla samego sześcianu, a potem sprawdzam czy od jakiejś strony nie przylega inny sześcian, dla których również muszę obliczysz szum. Jest to strasznie zasobożerny algorytm, czy moglibyście podsunąć mi jakiś inny pomysł? Mam też inny pomysł, by to wszystko wpisać w tablicę i obliczać dodatkowo szum jedynie dla "obrzeży" tej tablicy, ale może macie jakieś inne, lepsze rozwiązanie?
Szybki edit: Wypróbowałem drugie rozwiązanie z tablicą i działa szybciej, ale efekt mnie nie zadowala