/** * Parse a line containing a vertex **/ private void ParseVertex(String[] tokens) { if (tokens.Length < 4) { return; } Vector3 x = new Vector3(float.Parse(tokens [1], System.Globalization.CultureInfo.InvariantCulture), float.Parse(tokens [2], System.Globalization.CultureInfo.InvariantCulture), float.Parse(tokens [3], System.Globalization.CultureInfo.InvariantCulture)); mesh.AddVertex(x); }
/** * 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(); }