Example #1
0
        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);
                });
            }
        }
Example #2
0
        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
            });
        }