Descriptions and Examples for the POV-Ray Raytracer by Friedrich A. Lohmüller
Geometric Transformations with POV-Ray -
Deutsch Deutsch
Italiano Italiano
Français français

- POV-Ray Tutorial
   - Index

    - "translate<  ... >"
    - "rotate<  ... >"
    - "scale<  ... >"
    - mirror symmetry

    - "matrix<  ... >"
    - Shearing

    - "transform{ ...}"
       and "inverse"

    Vectors and
    - vrotate
    - vaxis_rotate
    - vtransform
    - vinv_transform
    - vturbulence
    - vnormalize
    - vcross
    - vdot()
    - vlength()
    - VAngle(), VAngleD()
    - VProject_Axis

    Insert Menu Add-on
      & Download
Vectors and Transformations
Vector transformations and other vector related things in POV-Ray:

vrotate( V, <Rotate.x, Rotate.y, Rotate.z>)
Rotation of a vector V around the center <0,0,0>
by a rotation vector <Rotate.x, Rotate.y, Rotate.z>.
vrotate( < 2.5, 1, 0>,
          < 0, 90, 0> ) 
vrotate example

vaxis_rotate( V1, V2, A)
Rotates a vector V1 around a vector V2 as axis of rotation by A degrees.
vaxis_rotate(< 0, 1, 0.5>,
             < 2, 3,   0>,
                       70 ) 
vaxis_rotate example

vtransform ( V, Transformation )
vinv_transform( V , Transformation )

Needs: #include ""
Combining transformations translate, scale, rotate and matrix.
vtransform() applies a transformation to a point.
vinv_transform() does the inverse transformation ('undo').
#declare A = < 1.5, 0.3, 0.25 >;
#declare Trans1 =
   transform{ rotate<0,-50,0>
              translate<0,0.7,0> };
#declare B = vtransform ( A, Trans1 );
vtransform example

vturbulence(Lambda, Omega, Octaves, V)
Returns the turbulence vector for the point V based on the given turbulence values. (For Lambda, Omega, Octaves see POV-Ray Wiki.
The amplitude Ampl of turbulence can be controlled by multiplying the turbulence vector. The frequency Freq at which the turbulence vector changes can be controlled by multiplying V.
We can get a turbulated version of the vector V by :
#declare V_Turb =
    V + Ampl*vturbulence(2, 0.5, 6, V*Freq);
vturbulence example
Example vturbulence.txt

vnormalize( V )
Normalized vector A, a unit length vector in direction of A.
Formula: vnormalize(A)= A / vlength(A).
Warning: Using vnormalize(<0,0,0>) will result in an error.
#if( vlength(V) != 0 )// if is not <0,0,0>
  #declare Vo = vnormalize( V );
vnormalize example

vcross( V1, V2)
Cross product of A and B (' A x B '),
A vector perpendicular to the two original vectors and with the length equal to the area of the parallelogram defined by them. Formula:
AxB = |A|*|B|*sin(angle(A,B))*perpendicular_unit_vector(A,B)
The length of the cross product vector is proportional to the sine of the angle between A and B.
#declare YellowVector =
            vcross( BlueVextor, GreenVector);
vcross example

vdot( V1, V2)
Dot product of V1 and V2. ('scalar product'). It's directly proportional to the length of the vectors V1 and V2 and the cosine of the angle between V1 and V2.
If vdot(A,B) = 0, then VAngleD(A,B) = 90 degrees.
Formula: vdot=V1.x*V2.x + V1.y*V2.y + V1.z*V2.z.
#declare Vyellow =
vdot example

vlength( V )
Returns the length of V as a float value.
Formula: vlength=sqrt(vdot(A,A)).
#declare Distance_AB = vlength( B-A );
vlength example

VAngle( V1, V2 )
VAngleD( V1, V2 )

Needs: #include ""
These return the angle between the vectors V1 and V2.
VAngle() returns the angle in radians, VAngleD() in degrees.
VAngle example

VProject_Axis(V, Axis)
Needs: #include ""
Projects a vector V onto the an axis Axis.
Formula: Axis*vdot(V, Axis)/vdot(Axis, Axis).
#declare YellowV =
      VProject_Axis( BlueV, GreenV);
VProject_Axis example

The vector transformations shown here are also available as text templates in the section "Shearing & transform" in my "Insert Menu Add-on" .

translate | rotate | scale | matrix | shearing | | transform | vector transformations
© Friedrich A. Lohmüller, 2013