/** * Parse a line containing a facet **/ private void ParseFacet(String[] tokens) { if (tokens.Length < 4) { return; } int[] vertexIndices = { -1, -1, -1 }; int[] texCoordIndices = { -1, -1, -1 }; bool hasTextureCoordinates = false; for (int i = 0; i < 3; i++) { string field = tokens [i + 1]; string[] slashSeparatedIndices = field.Split('/'); vertexIndices [i] = int.Parse(slashSeparatedIndices [0]) - 1; if (slashSeparatedIndices.Length > 1) { texCoordIndices [i] = int.Parse(field.Split('/') [1]) - 1; hasTextureCoordinates = true; } } if (!hasTextureCoordinates) { mesh.AddTriangle(vertexIndices [0], vertexIndices [1], vertexIndices [2]); } else { Triangle t = new Triangle(vertexIndices [0], vertexIndices [1], vertexIndices [2], texCoordIndices [0], texCoordIndices [1], texCoordIndices [2]); mesh.AddTriangle(t); } }
public static void CreateSquare(ITriangleMesh mesh, float extend) { mesh.Clear(); mesh.AddVertex(new Vector3(-extend, 0, -extend)); mesh.AddVertex(new Vector3(extend, 0, -extend)); mesh.AddVertex(new Vector3(extend, 0, extend)); mesh.AddVertex(new Vector3(-extend, 0, extend)); mesh.AddTriangle(0, 2, 1); mesh.AddTriangle(0, 3, 2); mesh.ComputeTriangleNormals(); }
/** * Create sphere. * */ public static void CreateSphere(ITriangleMesh mesh, float radius, int resolution) { mesh.Clear(); float dTheta = (float)(Math.PI / (resolution + 1)); float dPhi = (float)(Math.PI * 2.0 / resolution); // Create vertices // 0-180 degrees: i, theta for (int i = 0; i < resolution; i++) { // 0-360 degres: j, phi for (int j = 0; j < resolution; j++) { Vector3 p0 = EvaluateSpherePoint((i + 1) * dTheta, j * dPhi, radius); mesh.AddVertex(p0); } } int leftIndex = mesh.AddVertex(new Vector3(0, 0, radius)); int rightIndex = mesh.AddVertex(new Vector3(0, 0, -radius)); // Add triangles for (int i = 0; i < resolution - 1; i++) { for (int j = 0; j < resolution; j++) { mesh.AddTriangle(GetSphereIndex(i, j, resolution), GetSphereIndex(i + 1, j, resolution), GetSphereIndex(i + 1, j + 1, resolution)); mesh.AddTriangle(GetSphereIndex(i, j, resolution), GetSphereIndex(i + 1, j + 1, resolution), GetSphereIndex(i, j + 1, resolution)); } } for (int j = 0; j < resolution; j++) { mesh.AddTriangle(GetSphereIndex(0, j, resolution), GetSphereIndex(0, (j + 1) % resolution, resolution), leftIndex); mesh.AddTriangle(GetSphereIndex(resolution - 1, j, resolution), rightIndex, GetSphereIndex(resolution - 1, (j + 1) % resolution, resolution)); } mesh.ComputeTriangleNormals(); }
public void CreateShadowPolygons(Vector3 lightPosition, float extend, ITriangleMesh shadowPolygonMesh) { shadowPolygonMesh.Clear(); ArrayList silhouetteEdges = GetSilhouette(lightPosition); for (int i = 0; i < silhouetteEdges.Count; i++) { Edge edge = (Edge)silhouetteEdges[i]; Vector3 v0 = GetVertex(edge.a); Vector3 v1 = GetVertex(edge.b); Vector3 dv0 = Vector3.Multiply(Vector3.Subtract(v0, lightPosition).Normalized(), extend); Vector3 dv1 = Vector3.Multiply(Vector3.Subtract(v1, lightPosition).Normalized(), extend); Vector3 v0Dash = Vector3.Add(v0, dv0); Vector3 v1Dash = Vector3.Add(v1, dv1); int v0Index = shadowPolygonMesh.AddVertex(v0); int v1Index = shadowPolygonMesh.AddVertex(v1); int v0DashIndex = shadowPolygonMesh.AddVertex(v0Dash); int v1DashIndex = shadowPolygonMesh.AddVertex(v1Dash); shadowPolygonMesh.AddTriangle(v0Index, v0DashIndex, v1DashIndex); shadowPolygonMesh.AddTriangle(v0Index, v1DashIndex, v1Index); } shadowPolygonMesh.ComputeTriangleNormals(); }
/** * Generated the unification of two meshes. Attention: no new mesh is generated, in fact the * geometry of mesh2 is added to mesh1. */ public static void Unite(ITriangleMesh mesh1, ITriangleMesh mesh2) { int numberOfVertsMesh1 = mesh1.GetNumberOfVertices(); int numberOfTexCoordsMesh1 = mesh1.GetNumberOfTexCoords(); for (int i = 0; i < mesh2.GetNumberOfVertices(); i++) { mesh1.AddVertex(mesh2.GetVertex(i)); } for (int i = 0; i < mesh2.GetNumberOfTexCoords(); i++) { mesh1.AddTextureCoordinate(mesh2.GetTextureCoordinate(i)); } for (int i = 0; i < mesh2.GetNumberOfTriangles(); i++) { Triangle t = mesh2.GetTriangle(i).Clone(); t.VertexIndexOffset(numberOfVertsMesh1); t.TexCoordsIndexOffset(numberOfTexCoordsMesh1); mesh1.AddTriangle(t); } mesh1.ComputeTriangleNormals(); }
/** * Create cube. * */ public static void CreateCube(ITriangleMesh mesh, float sideLength) { mesh.Clear(); mesh.AddVertex(new Vector3(-sideLength / 2.0f, -sideLength / 2.0f, -sideLength / 2.0f)); mesh.AddVertex(new Vector3(sideLength / 2.0f, -sideLength / 2.0f, -sideLength / 2.0f)); mesh.AddVertex(new Vector3(sideLength / 2.0f, sideLength / 2.0f, -sideLength / 2.0f)); mesh.AddVertex(new Vector3(-sideLength / 2.0f, sideLength / 2.0f, -sideLength / 2.0f)); mesh.AddVertex(new Vector3(-sideLength / 2.0f, -sideLength / 2.0f, sideLength / 2.0f)); mesh.AddVertex(new Vector3(sideLength / 2.0f, -sideLength / 2.0f, sideLength / 2.0f)); mesh.AddVertex(new Vector3(sideLength / 2.0f, sideLength / 2.0f, sideLength / 2.0f)); mesh.AddVertex(new Vector3(-sideLength / 2.0f, sideLength / 2.0f, sideLength / 2.0f)); mesh.AddTriangle(new Triangle(0, 2, 1)); mesh.AddTriangle(new Triangle(0, 3, 2)); mesh.AddTriangle(new Triangle(1, 2, 5)); mesh.AddTriangle(new Triangle(2, 6, 5)); mesh.AddTriangle(new Triangle(4, 5, 6)); mesh.AddTriangle(new Triangle(4, 6, 7)); mesh.AddTriangle(new Triangle(4, 7, 0)); mesh.AddTriangle(new Triangle(0, 7, 3)); mesh.AddTriangle(new Triangle(3, 7, 2)); mesh.AddTriangle(new Triangle(2, 7, 6)); mesh.AddTriangle(new Triangle(4, 0, 1)); mesh.AddTriangle(new Triangle(1, 5, 4)); mesh.ComputeTriangleNormals(); }