The VulkanSceneGraph’s maths types and functions are found in the include/vsg/maths directory. The conventions broadly follow GLSL conventions with additions that are helpful for scene graph usage. In the Math Types section, earlier in this chapter, the vec2, vec3, vec4, mat3, mat4, quat, plane, box and sphere classes were introduced. In this section we build upon this with a tour of the range of helper functions available and an explanation of the conventions used.


The VulkanSceneGraph follows the GLSL convention of Right Hand Rule and Column Major matrices. The GLSL conventions are followed to make it easier to move code between shaders and C++ code, and to make it easier to follow 3rd party coding examples.

Headers and associated types/functionality

header types
vector and quaternion  
include/vsg/maths/vec2.h vsg::vec2
include/vsg/maths/vec3.h vsg::vec3
include/vsg/maths/vec4.h vsg::vec4
include/vsg/maths/quat.h vsg::quat
matrix types  
include/vsg/maths/mat3.h vsg::mat3
include/vsg/maths/mat4.h vsg::mat3
geometric primitive types  
include/vsg/maths/plane.h vsg::plane
include/vsg/maths/sphere.h vsg::sphere
include/vsg/maths/box.h vsg::box
include/vsg/maths/clamp.h clamp and repeat texture coord style functions
include/vsg/maths/color.h color helper functions
include/vsg/maths/common.h angle, square, smoothstep and mix helper functions
include/vsg/maths/sample.h sample function equvilant to GPU texture sampler
include/vsg/maths/transform.h range of transform related functions

Matrix and vector multiplication:

   vsg::dmat4 projection; // typically camera will provide projection matrix
   vsg::dmat4 view; // typically camera will provide view matrix
   vsg::dmat4 model; // typically transforms in scene graph will be accumulated into model matrix
   vsg::dvec3 object_coord; // typically provided by vertices in scene graph

   vsg::dmat4 modelview = view * model;
   vsg::dvec3 eye_coord = modelview * object_coord; // implicit transpose of object_coord vector
   vsg::dvec3 clip_coord = projection * modelview * object_coord;

Dot and cross products:

    vsg::vec3 a(1.0f, 0.0f, 0.0f);
    vsg::vec3 b(0.0f, 1.0f, 0.0f);
    vsg::vec3 c = vsg::cross(a, b);
    float d = vsg::dot(a, b);

Transform related functions:

    vsg::dmat4 matrix = vsg::translate(x, y, z) *
                        vsg::rotate(angle_radians, rx, ry, rz) *
                        vsg::scale(sx, sy, sz);

Difference with OpenSceneGraph conventions

The use of column major contrasts that of the OpenSceneGraph that uses row major, this not only affects order of access for elements of matrices but also the transformation order you’ll use. The row major convention used by the OpenSceneGraph was adopted prior to the existence of GLSL which unfortunately chose the opposite convention, leaving the OpenSceneGraph in an awkward situation where C++ and shaders follow differing conventions.

// OpenSceneGraph uses row major
osg::Vec3d osg_vec;
osg::Matrixd osg_matrix;
osg_matrix(row, column) = value;
osg::Vec3d osg_dash = osg_vec * matrix;

// VulkanSceneGraph using GLSL column major convention
vsg::dvec3 vsg_vec;
vsg::dmat4 vsg_matrix;
vsg_matrix(column, row) = value;
vsg::dvec3 vsg_dask = matrix * vsg_vec

The OpenSceneGraph also implements the dot product and cross product functions as * and ^ operators while the VulkanSceneGraph follows GLSL’s convention of using dot and cross functions.

Prev: Block memory management with vsg::Allocator Next: Next Chapter : Scene Graph