PolyVox  0.2.1
Open source voxel management library
Namespaces | Typedefs | Enumerations | Functions
Raycast.h File Reference

OUT OF DATE SINCE UNCLASSING. More...

#include "PolyVoxCore/Vector.h"
#include "PolyVoxCore/Raycast.inl"

Go to the source code of this file.

Namespaces

namespace  PolyVox
 Main namespace.
namespace  PolyVox::RaycastResults

Typedefs

typedef
RaycastResults::RaycastResult 
PolyVox::RaycastResult

Enumerations

enum  PolyVox::RaycastResults::RaycastResult { PolyVox::RaycastResults::Completed, PolyVox::RaycastResults::Interupted }
 The results of a raycast. More...

Functions

template<typename VolumeType , typename Callback >
RaycastResult PolyVox::raycastWithEndpoints (VolumeType *volData, const Vector3DFloat &v3dStart, const Vector3DFloat &v3dEnd, Callback &callback)
 Cast a ray through a volume by specifying the start and end positions.
template<typename VolumeType , typename Callback >
RaycastResult PolyVox::raycastWithDirection (VolumeType *volData, const Vector3DFloat &v3dStart, const Vector3DFloat &v3dDirectionAndLength, Callback &callback)
 Cast a ray through a volume by specifying the start and a direction.

Detailed Description

OUT OF DATE SINCE UNCLASSING.

The principle behind raycasting is to fire a 'ray' through the volume and determine what (if anything) that ray hits. This simple test can be used for the purpose of picking, visibility checks, lighting calculations, or numerous other applications.

A ray is a stright line in space define by a start point and a direction vector. The length of the direction vector represents the length of the ray. When you call a Raycast object's execute() method it will iterate over each voxel which lies on the ray, starting from the defined start point. It will examine each voxel and terminate either when it encounters a solid voxel or when it reaches the end of the ray. If a solid voxel is encountered then its position is stored in the intersectionVoxel field of the RaycastResult structure and the intersectionFound flag is set to true, otherwise the intersectionFound flag is set to false.

Important Note: These has been confusion in the past with people not realising that the length of the direction vector is important. Most graphics API can provide a camera position and view direction for picking purposes, but the view direction is usually normalised (i.e. of length one). If you use this view direction directly you will only iterate over a single voxel and won't find what you are looking for. Instead you must scale the direction vector so that it's length represents the maximum distance over which you want the ray to be cast.

The following code snippet shows how the class is used:

Vector3DFloat start(rayOrigin.x(), rayOrigin.y(), rayOrigin.z());
Vector3DFloat direction(rayDir.x(), rayDir.y(), rayDir.z());
direction.normalise();
direction *= 1000.0f; //Casts ray of length 1000
RaycastResult raycastResult;
Raycast<Material8> raycast(m_pPolyVoxVolume, start, direction, raycastResult);
raycast.execute();
if(raycastResult.foundIntersection)
{
//...
}

Some further notes, the Raycast uses full 26-connectivity, which basically means it will examine every voxel the ray touches, even if it just passes through the corner. Also, it peforms a simple binary test against a voxel's threshold, rather than making use of it's density. Therefore it will work best in conjunction with one of the 'cubic' surace extractors. It's behaviour with the Marching Cubes surface extractor has not been tested yet.

Definition in file Raycast.h.