public void Render(Matrix camera, params Obj3D[] objects) { List <Light[]> listlights = new List <Light[]>(); foreach (Obj3D o in objects) { if (o.Lights != null) { Light[] lights = new Light[o.Lights.Length]; for (int i = 0; i < o.Lights.Length; i++) { lights[i] = new Light(); lights[i].Coordinates = o.Lights[i].Coordinates.Rotation(o.Rotation).Translation(o.Position); lights[i].Color = o.Lights[i].Color; lights[i].Normal = o.Lights[i].Normal.Rotation(o.Rotation); lights[i].angle = o.Lights[i].angle; } listlights.Add(lights); } } //Vector3 cam = new Vector3(camera[0,0], camera[1, 0], camera[2, 0]).Rotation(objects[0].Rotation).Translation(objects[0].Position); //Matrix newcamera = camera; //newcamera[0, 0] = cam.first; //newcamera[1, 0] = cam.second; //newcamera[2, 0] = cam.third; //camera = newcamera Matrix ViewMatrix = Matrix.ViewMatrix(camera); Matrix ProjectionMatrix = Matrix.ProjectionMatrix(bmpHeightDouble / bmpWidthDouble, 1, 100, 45); foreach (Obj3D o in objects) { Matrix TransformMatrix = Matrix.MultiplyMatrix(ProjectionMatrix, ViewMatrix); Color4 color = new Color4(1, 1, 1, 1); Parallel.ForEach(o.Triangles, triangle => { Vertex vA = new Vertex { Coordinates = o.Vertices[triangle.VerA].Coordinates.Rotation(o.Rotation).Translation(o.Position), Normal = o.Vertices[triangle.VerA].Normal.Rotation(o.Rotation) }; Vertex vB = new Vertex { Coordinates = o.Vertices[triangle.VerB].Coordinates.Rotation(o.Rotation).Translation(o.Position), Normal = o.Vertices[triangle.VerB].Normal.Rotation(o.Rotation) }; Vertex vC = new Vertex { Coordinates = o.Vertices[triangle.VerC].Coordinates.Rotation(o.Rotation).Translation(o.Position), Normal = o.Vertices[triangle.VerC].Normal.Rotation(o.Rotation) }; DrawTriangle(Project(vA, TransformMatrix), Project(vB, TransformMatrix), Project(vC, TransformMatrix), color, listlights); }); } }
public Vertex Project(Vertex coord, Matrix TransformMatrix) { Matrix point = Matrix.MultiplyMatrix(TransformMatrix, new Matrix(new double[, ] { { coord.Coordinates.first, coord.Coordinates.second, coord.Coordinates.third, 1 } })); Vector3 pointWorld = coord.Coordinates; Vector3 normalWorld = coord.Normal; point[0, 0] = point[0, 0] / point[0, 3]; point[0, 1] = point[0, 1] / point[0, 3]; point[0, 2] = point[0, 2] / point[0, 3]; //point[0, 3] = point[0, 3] / point[0, 3]; point[0, 3] = 1; var x = (point[0, 0] * bmpWidth + bmpWidth) / 2.0; var y = (-point[0, 1] * bmpHeight + bmpHeight) / 2.0; return(new Vertex { Coordinates = new Vector3(x, y, point[0, 2]), Normal = normalWorld, WorldCoordinates = pointWorld }); }