从那时起,我一直致力于实现 Transvoxel。现在它起作用了,它多边形化了,但它有点像块状。如下图所示:
这是多边形化的代码:
private static Mesh PolygonizeRegularCell (Vector3i pos, Mesh mesh, int lodIndex, Chunk samples)
{
int lod = 1 << lodIndex;
for (int i = 0; i < density.Length; i++) {
density [i] = samples [pos + Transvoxel.cornerIndex [i] * lod].Density;
}
byte caseCode = getCaseCode(density);
if ((caseCode ^ ((density [7] >> 7) & 0xFF)) != 0) {
byte cellClass = Transvoxel.regularCellClass [caseCode];
vertexLocations = Transvoxel.regularVertexData [caseCode];
Transvoxel.RegularCell c = Transvoxel.regularCellData [cellClass];
vertexCount = (long)c.GetVertexCount ();
triangleCount = (long)c.GetTriangleCount ();
indexOffset = c.Indizes ();
localVertexMapping = new int[indexOffset.Length];
for (int i = 0; i < vertexCount; i++) {
ushort edgeCode = (ushort)(vertexLocations [i] & 0xFF);
byte v0 = (byte)((edgeCode >> 4) & 0x0F);
byte v1 = (byte)(edgeCode & 0x0F);
Vector3 p0 = (pos + Transvoxel.cornerIndex [v0] * lod).ToVector3 ();
Vector3 p1 = (pos + Transvoxel.cornerIndex [v1] * lod).ToVector3 ();
long t = (density [v1] << 8) / (density [v1] - density [v0]);
long u = 0x0100 - t;
localVertexMapping [i] = vertices.Count;
Vector3 Q = p0 * t + p1 * u;
Q /= 256f;
AddVertex (Q, samples [pos.x, pos.y, pos.z].block);
}
for (int t = 0; t < triangleCount; t++) {
for (int i = 0; i < 3; i++) {
triangles.Add (localVertexMapping [c.Indizes () [t * 3 + i]]);
}
}
}
return mesh;
}
这是另一个用于生成高度图和密度值的方法:
public void GenerateNewDensityField (int x, int z)
{
densityColumn = new sbyte[128];
noise = (float)(Noise.noise (x * 0.01f, z * 0.01f) * 0.25f);
fHeight = ((noise + 1f) * 54f) + worldSize;
height = Mathf.FloorToInt (fHeight);
for (int i = 0; i < densityColumn.Length; i++) {
if (i < height - 1)
densityColumn [i] = -128;
else if (i == height - 1)
densityColumn [height - 1] = (sbyte)Mathf.Clamp (height - 128, -127, 128);
else if (i == height)
densityColumn [height] = (sbyte)Mathf.Clamp (-height, -128, 127);
else if (i == height + 1)
densityColumn [height + 1] = (sbyte)Mathf.Clamp (127 - height, -128, 127);
else
densityColumn [i] = 127;
}
densityCache [x, z] = new DensityColumn (densityColumn, height);
}
如果您以前使用过 Transvoxel,或者您对此有任何想法,请发表评论或回答。我真的坚持这一点。
编辑:密度生成代码的变化,不生成太多的零等等,但它仍然是块状的。