public void DrawObject(Object3D obj, Color color, Vec3f lightDirection, float c = 5) { var Width = graphicsProvider.Width; var Height = graphicsProvider.Height; var vertexesFromMem = new Vec3f[3]; var vertexes = new Vec3i[3]; for (int i = 0; i < graphicsProvider.Width; i++) { for (int j = 0; j < graphicsProvider.Height; j++) { zbuffer[i, j] = Int32.MinValue; } } foreach (var face in obj.Faces) { //Работает медленно vertexesFromMem[0] = (obj.Vertexes.ElementAt(face.v1.v - 1)); vertexesFromMem[1] = (obj.Vertexes.ElementAt(face.v2.v - 1)); vertexesFromMem[2] = (obj.Vertexes.ElementAt(face.v3.v - 1)); for (int i = 0; i < vertexes.Length; i++) { Vec3f v = vertexesFromMem[i]; v *= c; vertexes[i] = new Vec3i(new Vec3f(Width / 2, Height / 2, 0) - new Vec3f(-v.X, v.Y, -v.Z)); } //color = Color.FromArgb(random.Next(255), random.Next(255), random.Next(255)); Vec3f normal = Vec3f.VecMul(vertexesFromMem[2] - vertexesFromMem[0], vertexesFromMem[1] - vertexesFromMem[0]); normal.Normalize(); float intensity = normal * lightDirection; if (intensity > 1.0f) { //Костыль intensity = 1.0f; } if (intensity > 0) { DrawTriangle(vertexes[0], vertexes[1], vertexes[2], Color.FromArgb( (int)(color.R * intensity), (int)(color.G * intensity), (int)(color.B * intensity) )); } } }