Isis Developer Reference
Isis::EmbreeTargetShape Class Reference

Embree Target Shape for planetary bodies. More...

#include <EmbreeTargetShape.h>

Collaboration diagram for Isis::EmbreeTargetShape:
Collaboration graph

Public Member Functions

 EmbreeTargetShape ()
 Default empty constructor.
 
 EmbreeTargetShape (pcl::PolygonMesh::Ptr mesh, const QString &name="")
 Constructs an EmbreeTargetShape from a PointCloudLibrary polygon mesh.
 
 EmbreeTargetShape (const QString &dem, const Pvl *conf=0)
 Constructs an EmbreeTargetShape from a file.
 
virtual ~EmbreeTargetShape ()
 Desctructor.
 
QString name () const
 Return the name of the target shape.
 
bool isValid () const
 Return if a valid mesh is internalized and ready for use.
 
int numberOfPolygons () const
 Return the number of polygons in the target shape.
 
int numberOfVertices () const
 Return the number of vertices in the target shape.
 
RTCBounds sceneBounds () const
 Returns the bounds of the Embree scene.
 
double maximumSceneDistance () const
 Return the maximum distance within the scene.
 
void intersectRay (RTCMultiHitRay &ray)
 Intersect a ray with the target shape.
 
bool isOccluded (RTCOcclusionRay &ray)
 Check if a ray intersects the target body.
 
RayHitInformation getHitInformation (RTCMultiHitRay &ray, int hitIndex)
 Extract the intersection point and unit surface normal from an RTCMultiHitRay that has been intersected with the target shape.
 

Static Public Member Functions

static void multiHitFilter (const RTCFilterFunctionNArguments *args)
 Filter function for collecting multiple hits during ray intersection.
 
static void occlusionFilter (const RTCFilterFunctionNArguments *args)
 Filter function for collecting multiple primitiveIDs This function is called by the Embree library during ray tracing.
 

Protected Member Functions

pcl::PolygonMesh::Ptr readDSK (FileName file)
 Read a NAIF type 2 DSK file into a PointCloudLibrary polygon mesh.
 
pcl::PolygonMesh::Ptr readPC (FileName file)
 Read a PointCloudLibrary file into a PointCloudLibrary polygon mesh.
 
void initMesh (pcl::PolygonMesh::Ptr mesh)
 Internalize a PointCloudLibrary polygon mesh in the target shape.
 
void addVertices (int geomID)
 Adds the vertices from the internalized vertex point cloud to the Embree scene.
 
void addIndices (int geomID)
 Adds the polygon vertex indices from the internalized polygon mesh to the Embree scene.
 

Detailed Description

Embree Target Shape for planetary bodies.

This class holds the Embree representation of a target body. All vectors are expected to be in the body-fixed reference frame for the target and all positions are expected to be in kilometers.

Author
2017-05-11 Jeannie Backer & Jesse Mapel

Constructor & Destructor Documentation

◆ EmbreeTargetShape() [1/3]

Isis::EmbreeTargetShape::EmbreeTargetShape ( )

Default empty constructor.

The filename defaults to an empty string and the file handle defaults to 0. Counts default to 0 and the cache size defaults to 0.

◆ EmbreeTargetShape() [2/3]

Isis::EmbreeTargetShape::EmbreeTargetShape ( pcl::PolygonMesh::Ptr mesh,
const QString & name = "" )

Constructs an EmbreeTargetShape from a PointCloudLibrary polygon mesh.

Parameters
meshThe polygon mesh to construct the scene from.
nameThe name of the target being represented.

References initMesh().

◆ EmbreeTargetShape() [3/3]

Isis::EmbreeTargetShape::EmbreeTargetShape ( const QString & dem,
const Pvl * conf = 0 )

Constructs an EmbreeTargetShape from a file.

Parameters
demThe file to construct the target shape from. The file type is determined based on the file extension.
confPvl containing configuration settings for the target shape. Currently unused.
Exceptions
IException::Io

References _FILEINFO_, initMesh(), Isis::IException::Io, readDSK(), and readPC().

◆ ~EmbreeTargetShape()

Isis::EmbreeTargetShape::~EmbreeTargetShape ( )
virtual

Desctructor.

The PointCloudLibrary objects are automatically cleaned up, but the Embree scene and device must be manually cleaned up.

Member Function Documentation

◆ addIndices()

void Isis::EmbreeTargetShape::addIndices ( int geomID)
protected

Adds the polygon vertex indices from the internalized polygon mesh to the Embree scene.

Parameters
geomIDThe Embree geometry ID of the Embree geometry that the indices will be stored in.
See also
EmbreeTargetShape::initMesh

◆ addVertices()

void Isis::EmbreeTargetShape::addVertices ( int geomID)
protected

Adds the vertices from the internalized vertex point cloud to the Embree scene.

Parameters
geomIDThe Embree geometry ID of the Embree geometry that the vertices will be stored in.
See also
EmbreeTargetShape::initMesh

◆ getHitInformation()

RayHitInformation Isis::EmbreeTargetShape::getHitInformation ( RTCMultiHitRay & ray,
int hitIndex )

Extract the intersection point and unit surface normal from an RTCMultiHitRay that has been intersected with the target shape.

This method performs two calculations. First, it converts the intersection point from barycentric coordinates relative to the intersected polygon to the body-fixed (x, y, z) coordinates. Second, it computes the unit normal vector of the intersected polygon. The polygon vertices are assumed to be ordered counter-clockwise about the exterior surface normal as they are in NAIF type 2 DSK files.

Parameters
rayThe ray to extract intersection information from.
hitIndexThe index of the intersection to extract.
Returns
RayHitInformation The body-fixed intersection coordinate in kilometers and the unit surface normal at the intersection.
Exceptions
IException::Programmer

References _FILEINFO_, Isis::LinearAlgebra::normalize(), Isis::IException::Programmer, and Isis::toString().

Referenced by Isis::EmbreeShapeModel::intersectSurface(), Isis::EmbreeShapeModel::isVisibleFrom(), and Isis::EmbreeShapeModel::localRadius().

◆ initMesh()

void Isis::EmbreeTargetShape::initMesh ( pcl::PolygonMesh::Ptr mesh)
protected

Internalize a PointCloudLibrary polygon mesh in the target shape.

The mesh itself is stored along with a duplicate of the vertex point cloud because the point cloud stored in the polygon mesh cannot be read without Robot Operating System routines. The mesh is loaded into the internal Embree scene and the scene is commited. Any changes made to the Embree scene after this method is called will not take effect until embree::rtcCommit is called again.

Note
This method is NOT reentrant. Calling this again with a new mesh will remove the PointCloudLibrary representation of the old mesh but the Embree scene will contain all previous meshes along with the new mesh. Use embree::rtcDeleteGeometry to remove an old mesh from the scene.
Parameters
meshThe mesh to be internalized.

References isValid(), multiHitFilter(), numberOfPolygons(), numberOfVertices(), and occlusionFilter().

Referenced by EmbreeTargetShape(), and EmbreeTargetShape().

◆ intersectRay()

void Isis::EmbreeTargetShape::intersectRay ( RTCMultiHitRay & ray)

Intersect a ray with the target shape.

After calling, up to 16 intersections will be stored within the RTCMultiHitRay. The intersection information will be stored in the following arrays:

  • hitGeomIDs: The Embree Geometry ID of the intersected geometry
  • hitPrimIDs: The index of the intersected polygon
  • hitUs: The Barycentric u coordinate of the intersection relative to the intersected polygon
  • hitVs: The Barycentric V coordinate of the intersection relative to the intersected polygon

The index of the last intersection is stored in lastHit.

Note
The intersection information is stored in the order that Embree finds them. This is not necessarily their order along the ray. Only the first intersection is guaranteed to be in the correct order. Other intersections may be swapped with the next, or previous, intersection relative to their order along the ray.
Parameters
[in,out]rayThe ray to intersect with the scene. After calling, The intersection information will be stored in the ray.
See also
embree::rtcIntersect

References isValid().

Referenced by Isis::EmbreeShapeModel::intersectSurface(), Isis::EmbreeShapeModel::intersectSurface(), Isis::EmbreeShapeModel::intersectSurface(), Isis::EmbreeShapeModel::isVisibleFrom(), and Isis::EmbreeShapeModel::localRadius().

◆ isOccluded()

bool Isis::EmbreeTargetShape::isOccluded ( RTCOcclusionRay & ray)

Check if a ray intersects the target body.

Returns
bool If the ray intersects anything.
See also
embree::rtcOccluded

Referenced by Isis::EmbreeShapeModel::intersectSurface(), and Isis::EmbreeShapeModel::intersectSurface().

◆ isValid()

bool Isis::EmbreeTargetShape::isValid ( ) const

Return if a valid mesh is internalized and ready for use.

Returns
bool If a mesh is internalized and the Embree scene is ready.

Referenced by initMesh(), intersectRay(), numberOfPolygons(), numberOfVertices(), and sceneBounds().

◆ maximumSceneDistance()

double Isis::EmbreeTargetShape::maximumSceneDistance ( ) const

Return the maximum distance within the scene.

This is computed as the length of the diagonal from once corner of the scene to the opposite.

Returns
double The maximum distance within the Embree scene in kilometers.

References Isis::LinearAlgebra::magnitude(), and sceneBounds().

◆ multiHitFilter()

void Isis::EmbreeTargetShape::multiHitFilter ( const RTCFilterFunctionNArguments * args)
static

Filter function for collecting multiple hits during ray intersection.

This function is called by the Embree library during ray tracing. Each time an intersection is found, this method is called.

Parameters
[in]userDataPtrData pointer from the geometry hit. Not used.
[in,out]rayThe ray being traced. Information about the intersection will be stored in the ray.

Referenced by initMesh().

◆ name()

QString Isis::EmbreeTargetShape::name ( ) const

Return the name of the target shape.

Returns
QString The name of the target.

◆ numberOfPolygons()

int Isis::EmbreeTargetShape::numberOfPolygons ( ) const

Return the number of polygons in the target shape.

Returns
int The number of polygons in the polygon mesh representation of the target.

References isValid().

Referenced by initMesh().

◆ numberOfVertices()

int Isis::EmbreeTargetShape::numberOfVertices ( ) const

Return the number of vertices in the target shape.

Returns
int The number of vertices in the polygon mesh representation of the target.

References isValid().

Referenced by initMesh().

◆ occlusionFilter()

void Isis::EmbreeTargetShape::occlusionFilter ( const RTCFilterFunctionNArguments * args)
static

Filter function for collecting multiple primitiveIDs This function is called by the Embree library during ray tracing.

Each time an intersection is found, this method is called.

Parameters
[in]userDataPtrData pointer from the geometry hit. Not used.
[in,out]rayThe ray being traced. Information about the intersection will be stored in the ray.

Referenced by initMesh().

◆ readDSK()

pcl::PolygonMesh::Ptr Isis::EmbreeTargetShape::readDSK ( FileName file)
protected

Read a NAIF type 2 DSK file into a PointCloudLibrary polygon mesh.

The vertex and plate ordering in the DSK file is maintained in the polygon mesh.

Parameters
fileThe DSK file to load.
Returns
pcl::PolygonMesh::Ptr A boost shared pointer to the mesh.
Exceptions
IException::User
IException::Io

References _FILEINFO_, Isis::NaifStatus::CheckErrors(), Isis::IException::Io, Isis::toString(), and Isis::IException::User.

Referenced by EmbreeTargetShape().

◆ readPC()

pcl::PolygonMesh::Ptr Isis::EmbreeTargetShape::readPC ( FileName file)
protected

Read a PointCloudLibrary file into a PointCloudLibrary polygon mesh.

Parameters
fileThe PointCloudLibrary file to load.
Returns
pcl::PolygonMesh::Ptr A boost shared pointer to the mesh.
Exceptions
IException::Io

References _FILEINFO_, and Isis::IException::Io.

Referenced by EmbreeTargetShape().

◆ sceneBounds()

RTCBounds Isis::EmbreeTargetShape::sceneBounds ( ) const

Returns the bounds of the Embree scene.

If the scene has not been initialized, then all bounds are returned as 0.0.

Returns
RTCBounds Struct containing the upper and lower bounds on each dimension of the scene. Bounds are stored as floats in lower_x, upper_x, lower_y, upper_y, lower_z, and upper_z.

References isValid(), and sceneBounds().

Referenced by maximumSceneDistance(), and sceneBounds().


The documentation for this class was generated from the following files: