示例#1
0
        public static Polygone MovePoly(Polygone polygone, Vector3 amount)
        {
            for (int i = 0; i < polygone.listVerticies.Count; i++)
            {
                polygone.listVerticies[i] += amount;
            }

            polygone.center = Polygone.GetGravityCenter(polygone.listVerticies);

            return(polygone);
        }
示例#2
0
        public static Polygone RotatePoly(Polygone polygone, Vector3 amount)
        {
            List <Vector3> newVertex = new List <Vector3>();

            Quaternion newRotation = GetQuaternion(amount.X, amount.Y, amount.Z);
            Vector3    vecRotation = GetEulerAngle(newRotation.W, newRotation.X, newRotation.Y, newRotation.Z);

            for (int i = 0; i < polygone.listVerticies.Count; i++)
            {
                polygone.listVerticies[i] = vecRotation * (polygone.listVerticies[i] - polygone.center) + polygone.center;
            }
            polygone.center = Polygone.GetGravityCenter(polygone.listVerticies);

            return(polygone);
        }
示例#3
0
        static void Main(string[] args)
        {
            uint    width            = 1000;
            uint    height           = 1000;
            Vector3 pointPerspective = new Vector3(width / 2, height / 2, -5000);
            Image   image            = new Image(width, height, SFML.Graphics.Color.Cyan);

            Scene mainScene = new Scene();

            foreach (Sphere sphere in BuildSphere(width, height))
            {
                mainScene.objectsInScene.Add(new Box(sphere));
            }

            //Polygone poly = new Polygone();
            OFFReader.ReadFile(@"D:\bunny.off", out List <Vector3> listVerticies, out List <int> listIndexes, 2500);
            //Sphere sphereCentre = new Sphere(new Vector3(width / 2, height / 2, 800), 200);
            //GetMeshFromSphere(sphereCentre, 10, 10, out List<Vector3> listVerticies, out List<int> listIndexes);
            Polygone poly = new Polygone(listVerticies, listIndexes);

            poly = MovePoly(poly, new Vector3(500, 650, 650));
            poly = RotatePoly(poly, new Vector3(90, 90, 0));
            mainScene.objectsInScene.Add(poly);



            mainScene.lamps.AddRange(BuildLamp(width, height));

            for (uint y = 0; y < height; y++)
            {
                for (uint x = 0; x < width; x++)
                {
                    Option option = new Option();
                    //option.backgroundColor = new Vector3(0, 0, 0);
                    option.cameraType = CameraType.Perspective;
                    option.maxDepth   = 5;
                    Direction dir       = new Direction(new Vector3(0, 0, 1));
                    float     offsetRay = 0.5f;
                    if (option.cameraType == CameraType.Perspective)
                    {
                        dir = new Direction(new Vector3(x, y, 0) - new Vector3(pointPerspective.X, pointPerspective.Y, pointPerspective.Z));
                    }

                    int raycount = 1000;

                    Vector3 couleur = Vector3.Zero;

                    for (int i = 0; i < raycount; i++)
                    {
                        Ray ray = new Ray(new Position(new Vector3(x + GetRandomNumber(-offsetRay, offsetRay), y + GetRandomNumber(-offsetRay, offsetRay), 0)), dir);

                        if (CastRay(ray, mainScene, option, out Vector3 couleurPix))
                        {
                            couleur += couleurPix;
                        }
                        else
                        {
                            couleur += option.backgroundColor;
                        }
                    }

                    Color col = CreateColorFromVector(couleur / raycount);
                    image.SetPixel(x, y, col); // Lumiere
                }
            }
            image.SaveToFile(@"D:\result.png");
        }