PDA

View Full Version : Малко помощ с Realtime екструзия на меш



Nicksey
04-01-2013, 22:36
Значи идеята е, че имам един меш и трябва с движението му в 3D средата да полужа негова екструзия (изтегляне). Кодът е в C#, но ако някой има идеи, може да пише и псевдокод.

И сега, имам това малко класче:

public class Edge
{
public int[] vertexIndex = new int[2];
public int[] faceIndex = new int[2];
}

Съответно, той държи фейсовете и вертексите в меша. И ако faceindex[n] е равно нa faceindex[n+1], то значи ръбът се връзва само към едина фасета (логично).

И сега класът за екструзия:

public class ExtrudeMesh
{
public static void ExtrudeMesh (Mesh srcMesh, Mesh extrudedMesh, Matrix4x4[] extrusion, bool invertFaces)
{
Edge[] edges = BuildManifoldEdges(srcMesh);
ExtrudeMesh(srcMesh, extrudedMesh, extrusion, edges, invertFaces);
}

public static void ExtrudeMesh (Mesh srcMesh, Mesh extrudedMesh, Matrix4x4[] extrusion, Edge[] edges, bool invertFaces)
{
int extrudedVertexCount = edges.Length * 2 * extrusion.Length;
int triIndicesPerStep = edges.Length * 6;
int extrudedTriIndexCount = triIndicesPerStep * (extrusion.Length -1);

Vector3[] inputVertices = srcMesh.vertices;
Vector2[] inputUV = srcMesh.uv;
int[] inputTriangles = srcMesh.triangles;

Vector3[] vertices = new Vector3[extrudedVertexCount + srcMesh.vertexCount * 2];
Vector2[] uvs = new Vector2[vertices.Length];
int[] triangles = new int[extrudedTriIndexCount + inputTriangles.Length * 2];

int v = 0;
for (int i=0;i<extrusion.Length;i++)
{
Matrix4x4 matrix = extrusion[i];
float vcoord = (float)i / (extrusion.Length -1);
foreach (Edge e in edges)
{
vertices[v+0] = matrix.MultiplyPoint(inputVertices[e.vIndex[0]]);
vertices[v+1] = matrix.MultiplyPoint(inputVertices[e.vIndex[1]]);

uvs[v+0] = new Vector2 (inputUV[e.vIndex[0]].x, vcoord);
uvs[v+1] = new Vector2 (inputUV[e.vIndex[1]].x, vcoord);

v += 2;
}
}
}

Нищо слобно не е...възможно е да има някакви грешки..още не е готово.

Таа въпросът ми е относно затварянето на обекта (cap). Знам, че е глупаво, но не ми идва идея как да стане:

Правим for-loop-а:


for (int i=0; i<2; i++)
{

int fcVertex= i == 0 ? extrudedVertexCount : extrudedVertexCount + inputVertices.Length;
}
Имаме първия cap вертекс... и какво после ? Как да осъществя cap - ването ? Предполагам ми трябва още една 4x4 матрица, с която да взема проекцията на даден вертекс... честно казано малко вече почвам да се обърквам тук.

Някой има ли идеи ? Ще съм много благодарен, ако помогнете с това :)