2.3. Camera
Prev | Chapter 2. MegaPOV References | Next

## 2.3. Camera

### 2.3.1. `user_defined` camera type

### Włodzimierz ABX Skiba

Instead of patching POV-Ray™ with new camera types MegaPOV provides a tool to define any projection type directly inside the scene scripts. This tool is named `user_defined` camera type. It allows starting camera rays from any point in any direction. Both the location and direction of rays is specified as a set of three functions or as one pigment.

Syntax is:

    camera {
      user_defined
      location { FUNCTION_VECTOR }
      direction { FUNCTION_VECTOR }
    }

    FUNCTION_VECTOR:
      PIGMENT | 3_USER_DEFINED_FUNCTIONS ...

    3_USER_DEFINED_FUNCTIONS:
      USER_DEFINED_FUNCTION
      USER_DEFINED_FUNCTION
      USER_DEFINED_FUNCTION

In the case of 3 functions used to define location or direction, please remember that those functions operate on screen coordinates (`u` and `v`) in the area <0,0>-<1,1> so that they are independent of the image resolution. If you want to convert the value from the range 0-1 to the range 0-image_width or 0-image_height you can use the function `adj_range` from the `math.inc` include file.

In the case of a pigment used to define location or direction, please remember that the values of the pigment are taken from the area <0,0,0>-<1,1,0>.

Example 2.8. Alternative forms of `user_defined` camera type definition

Let's imagine we want to recreate the orthographic camera using a user_defined camera:

    camera{
      orthographic
      location <.5,.5,0>
      direction z
      up y
      right x
    }

Written as a set of functions it would be:

    camera{
      user_defined
      location{
        function{u}
        function{v}
        function{0}
      }
      direction{
        function{0}
        function{0}
        function{1}
      }
    }

Defined with pigments it would be:

    camera{
      user_defined
      location{
        pigment{
          gradient x
          pigment_map{
            [0 gradient y color_map{[0 rgb 0][1 rgb x]}]
            [1 gradient y color_map{[0 rgb y][1 rgb x+y]}]
          }
        }
      }
      direction{
        pigment{rgb z}
      }
    }

Of course if it can make the script shorter, you can mix notations. You can use both functions and pigments in one camera definition:

    camera{
      user_defined
      location{
        function{u}
        function{v}
        function{0}
      }
      direction{
        pigment{rgb z}
      }
    }

Prev | Up | Next
2.2. Expressions | Home | 2.4. Objects