Пример #1
0
        public Camera(Camera camera, Vec3 movement, Vec3 turn)
        {
            this.width      = camera.width;
            this.height     = camera.height;
            this.maxBounces = camera.maxBounces;

            Vector4 temp = camera.lookAt - camera.origin;

            if (turn.y != 0)
            {
                temp += Vector4.Transform(temp, Matrix4x4.CreateFromAxisAngle(Vec3.cross(Vec3.cross(camera.up, (camera.lookAt - camera.origin)), (camera.lookAt - camera.origin)), (float)turn.y));
            }
            if (turn.x != 0)
            {
                temp += Vector4.Transform(temp, Matrix4x4.CreateFromAxisAngle(Vec3.cross(camera.up, (camera.lookAt - camera.origin)), (float)turn.x));
            }

            lookAt = camera.origin + Vec3.unitVector(temp);

            this.origin  = camera.origin + movement;
            this.lookAt += movement;
            this.up      = camera.up;

            axis = OrthoNormalBasis.fromZY(Vec3.unitVector(lookAt - origin), up);

            aspectRatio      = ((float)width / (float)height);
            cameraPlaneDist  = 1.0f / XMath.Tan(camera.verticalFov * XMath.PI / 360.0f);
            this.verticalFov = camera.verticalFov;
            reciprocalHeight = 1.0f / height;
            reciprocalWidth  = 1.0f / width;
        }
Пример #2
0
        public Camera(Vec3 origin, Vec3 lookAt, Vec3 up, int width, int height, int maxBounces, float verticalFov)
        {
            this.width       = new SpecializedValue <int>(width);
            this.height      = new SpecializedValue <int>(height);
            this.maxBounces  = new SpecializedValue <int>(maxBounces);
            this.verticalFov = verticalFov;
            this.origin      = origin;
            this.lookAt      = lookAt;
            this.up          = up;

            axis = OrthoNormalBasis.fromZY(Vec3.unitVector(lookAt - origin), up);

            aspectRatio      = ((float)width / (float)height);
            cameraPlaneDist  = 1.0f / XMath.Tan(verticalFov * XMath.PI / 360.0f);
            reciprocalHeight = 1.0f / height;
            reciprocalWidth  = 1.0f / width;
        }