Visual Servoing Platform  version 3.6.1 under development (2024-12-17)
vpPanda3DRGBRenderer Class Reference

#include <visp3/ar/vpPanda3DRGBRenderer.h>

+ Inheritance diagram for vpPanda3DRGBRenderer:

Public Member Functions

 vpPanda3DRGBRenderer ()
 
 vpPanda3DRGBRenderer (bool showSpeculars)
 
virtual ~vpPanda3DRGBRenderer ()=default
 
void getRender (vpImage< vpRGBa > &I) const
 
void addNodeToScene (const NodePath &object) VP_OVERRIDE
 
void setBackgroundImage (const vpImage< vpRGBa > &background)
 
GraphicsOutput * getMainOutputBuffer () VP_OVERRIDE
 
bool isShowingSpeculars () const
 
virtual void initFramework ()
 
virtual void initFromParent (std::shared_ptr< PandaFramework > framework, PointerTo< WindowFramework > window)
 
virtual void initFromParent (const vpPanda3DBaseRenderer &renderer)
 
virtual void beforeFrameRendered ()
 
virtual void renderFrame ()
 
virtual void afterFrameRendered ()
 
const std::string & getName () const
 
void setName (const std::string &name)
 
NodePath & getRenderRoot ()
 
virtual void setRenderParameters (const vpPanda3DRenderParameters &params)
 
virtual bool isRendering3DScene () const
 
int getRenderOrder () const
 
void setRenderOrder (int order)
 
virtual void setCameraPose (const vpHomogeneousMatrix &wTc)
 
virtual vpHomogeneousMatrix getCameraPose ()
 
virtual void setNodePose (const std::string &name, const vpHomogeneousMatrix &wTo)
 
virtual void setNodePose (NodePath &object, const vpHomogeneousMatrix &wTo)
 
virtual vpHomogeneousMatrix getNodePose (const std::string &name)
 
virtual vpHomogeneousMatrix getNodePose (NodePath &object)
 
void computeNearAndFarPlanesFromNode (const std::string &name, float &near, float &far, bool fast)
 
NodePath loadObject (const std::string &nodeName, const std::string &modelPath)
 
void setVerticalSyncEnabled (bool useVsync)
 
void setAbortOnPandaError (bool abort)
 
void enableDebugLog ()
 
void printStructure ()
 
virtual void enableSharedDepthBuffer (vpPanda3DBaseRenderer &sourceBuffer)
 
void addLight (const vpPanda3DLight &light) VP_OVERRIDE
 

Static Public Member Functions

static vpColVector vispPointToPanda (const vpColVector &point)
 
static vpColVector vispVectorToPanda (const vpColVector &vec)
 

Protected Member Functions

void setupScene () VP_OVERRIDE
 
void setupRenderTarget () VP_OVERRIDE
 
virtual std::string makeFragmentShader (bool hasTexture, bool specular)
 
virtual void setupCamera ()
 
void setLightableScene (NodePath &scene)
 

Protected Attributes

std::string m_name
 
int m_renderOrder
 
std::shared_ptr< PandaFramework > m_framework
 
PointerTo< WindowFramework > m_window
 
vpPanda3DRenderParameters m_renderParameters
 
NodePath m_renderRoot
 
PointerTo< Camera > m_camera
 
NodePath m_cameraPath
 
std::vector< GraphicsOutput * > m_buffers
 

Static Protected Attributes

static const vpHomogeneousMatrix VISP_T_PANDA
 
static const vpHomogeneousMatrix PANDA_T_VISP
 

Detailed Description

Implementation of a traditional RGB renderer in Panda3D.

The lighting model follows a Cook-torrance BRDF.

For each object, a specific Version of the cook-torrance shader is compiled: diffuse textures are supported, but normal/bump/roughness maps are not. This class will try to automatically detect whether an object has RGB textures.

Specular highlights and reflections can be ignored, depending on the value of isShowingSpeculars.

Warning
if an object is detected as having image textures but it actually doesn't have any, the object may appear washed out.
Note
Most of the tested objects were in BAM format, Panda3D's own format. The following pipeline was used:
  • Export to GLTF with Blender
  • In a Python environment, install gltf2bam with pip install panda3d-gltf
  • run gltf2bam path/to/yourObject.gltf path/to/yourObject.bam
  • then, in the code, use renderer.addNodeToScene("/path/to/yourObject.bam");
Examples
tutorial-panda3d-renderer.cpp.

Definition at line 66 of file vpPanda3DRGBRenderer.h.

Constructor & Destructor Documentation

◆ vpPanda3DRGBRenderer() [1/2]

vpPanda3DRGBRenderer::vpPanda3DRGBRenderer ( )
inline

Default constructor. Initialize an RGB renderer with the normal rendering behavior showing speculars.

Definition at line 73 of file vpPanda3DRGBRenderer.h.

◆ vpPanda3DRGBRenderer() [2/2]

vpPanda3DRGBRenderer::vpPanda3DRGBRenderer ( bool  showSpeculars)
inline

RGB renderer constructor allowing to specify whether specular highlights should be rendered or if only ambient/diffuse lighting should be considered.

Parameters
showSpecularswhether to render speculars

Definition at line 81 of file vpPanda3DRGBRenderer.h.

◆ ~vpPanda3DRGBRenderer()

virtual vpPanda3DRGBRenderer::~vpPanda3DRGBRenderer ( )
virtualdefault

Member Function Documentation

◆ addLight()

void vpPanda3DLightableScene::addLight ( const vpPanda3DLight light)
inlinevirtualinherited

Add a light to the scene. All of the objects in the scene will be lit.

Exceptions
ifthe scene is not setup (setLightableScene or constructor with NodePath has not been called)
Parameters
lightlight to add

Implements vpPanda3DLightable.

Definition at line 258 of file vpPanda3DLight.h.

References vpException::notInitialized.

◆ addNodeToScene()

void vpPanda3DRGBRenderer::addNodeToScene ( const NodePath &  object)
virtual

Add a node to the scene. Its pose is set as the identity matrix.

Parameters
object

Reimplemented from vpPanda3DBaseRenderer.

Definition at line 186 of file vpPanda3DRGBRenderer.cpp.

References vpPanda3DBaseRenderer::m_renderRoot, makeFragmentShader(), and vpPanda3DBaseRenderer::setNodePose().

◆ afterFrameRendered()

virtual void vpPanda3DBaseRenderer::afterFrameRendered ( )
inlinevirtualinherited

◆ beforeFrameRendered()

virtual void vpPanda3DBaseRenderer::beforeFrameRendered ( )
inlinevirtualinherited

Reimplemented in vpPanda3DRendererSet.

Definition at line 77 of file vpPanda3DBaseRenderer.h.

Referenced by vpPanda3DBaseRenderer::renderFrame().

◆ computeNearAndFarPlanesFromNode()

void vpPanda3DBaseRenderer::computeNearAndFarPlanesFromNode ( const std::string &  name,
float &  near,
float &  far,
bool  fast 
)
inherited

Compute the near and far planes for the camera at the current pose, given a certain node/part of the graph.

The near clipping value will be set to the distance to the closest point of the object. The far clipping value will be set to the distance to farthest vertex of the object.

Warning
Depending on geometry complexity, this may be an expensive operation.
if the object lies partly behind the camera, the near plane value will be zero. If it fully behind, the far plane will also be zero. If these near/far values are used to update the rendering parameters of the camera, this may result in an invalid projection matrix.
Parameters
namename of the node that should be used to compute near and far values.
nearresulting near clipping plane distance
farresulting far clipping plane distance
fastWhether to use the axis align bounding box to compute the clipping planes. This is faster than reprojecting the full geometry in the camera frame

Definition at line 191 of file vpPanda3DBaseRenderer.cpp.

References vpException::badValue, vpException::fatalError, vpPanda3DBaseRenderer::getCameraPose(), vpPanda3DBaseRenderer::getNodePose(), vpHomogeneousMatrix::inverse(), vpPanda3DBaseRenderer::m_camera, vpPanda3DBaseRenderer::m_cameraPath, vpPanda3DBaseRenderer::m_renderRoot, vpException::notInitialized, and vpPanda3DBaseRenderer::PANDA_T_VISP.

◆ enableDebugLog()

void vpPanda3DBaseRenderer::enableDebugLog ( )
inherited

Definition at line 312 of file vpPanda3DBaseRenderer.cpp.

◆ enableSharedDepthBuffer()

void vpPanda3DBaseRenderer::enableSharedDepthBuffer ( vpPanda3DBaseRenderer sourceBuffer)
virtualinherited

◆ getCameraPose()

vpHomogeneousMatrix vpPanda3DBaseRenderer::getCameraPose ( )
virtualinherited

Retrieve the camera's pose, in the world frame. The pose is specified using the ViSP convention (Y-down right handed).

Reimplemented in vpPanda3DRendererSet.

Definition at line 150 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::getNodePose(), vpPanda3DBaseRenderer::m_camera, vpPanda3DBaseRenderer::m_cameraPath, and vpException::notInitialized.

Referenced by vpPanda3DBaseRenderer::computeNearAndFarPlanesFromNode().

◆ getMainOutputBuffer()

GraphicsOutput* vpPanda3DRGBRenderer::getMainOutputBuffer ( )
inlinevirtual

Reimplemented from vpPanda3DBaseRenderer.

Definition at line 98 of file vpPanda3DRGBRenderer.h.

◆ getName()

const std::string& vpPanda3DBaseRenderer::getName ( ) const
inlineinherited

Get the name of the renderer.

Returns
const std::string&

Definition at line 92 of file vpPanda3DBaseRenderer.h.

◆ getNodePose() [1/2]

vpHomogeneousMatrix vpPanda3DBaseRenderer::getNodePose ( const std::string &  name)
virtualinherited

Get the pose of a Panda node, in world frame in the ViSP convention (Y-down right handed).

Parameters
nameNode path to search for.
See also
setNodePose(const std::string &, const vpHomogeneousMatrix &) for more info
Returns
wTo, the pose of the object in world frame
Exceptions
ifno node can be found from the given path.

Reimplemented in vpPanda3DRendererSet.

Definition at line 173 of file vpPanda3DBaseRenderer.cpp.

References vpException::badValue, and vpPanda3DBaseRenderer::m_renderRoot.

Referenced by vpPanda3DBaseRenderer::computeNearAndFarPlanesFromNode(), and vpPanda3DBaseRenderer::getCameraPose().

◆ getNodePose() [2/2]

vpHomogeneousMatrix vpPanda3DBaseRenderer::getNodePose ( NodePath &  object)
virtualinherited

Get the pose of a Panda node, in world frame in the ViSP convention (Y-down right handed). This version of the method directly uses the Panda Nodepath.

Reimplemented in vpPanda3DRendererSet.

Definition at line 182 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::PANDA_T_VISP.

◆ getRender()

void vpPanda3DRGBRenderer::getRender ( vpImage< vpRGBa > &  I) const

Store the render resulting from calling renderFrame() into a vpImage.

If the image does not have the correct dimensions, it is resized.

Parameters
IThe image in which to store the render.

Definition at line 257 of file vpPanda3DRGBRenderer.cpp.

References vpImage< Type >::getHeight(), vpImage< Type >::getWidth(), and vpImage< Type >::resize().

◆ getRenderOrder()

int vpPanda3DBaseRenderer::getRenderOrder ( ) const
inlineinherited

Get the rendering order of this renderer. If a renderer A has a lower order value than B, it will be rendered before B. This is useful, if for instance, B is a postprocessing filter that depends on the result of B.

Returns
int

Definition at line 123 of file vpPanda3DBaseRenderer.h.

Referenced by vpPanda3DPostProcessFilter::vpPanda3DPostProcessFilter().

◆ getRenderRoot()

NodePath& vpPanda3DBaseRenderer::getRenderRoot ( )
inlineinherited

Get the scene root.

Definition at line 100 of file vpPanda3DBaseRenderer.h.

◆ initFramework()

void vpPanda3DBaseRenderer::initFramework ( )
virtualinherited

◆ initFromParent() [1/2]

void vpPanda3DBaseRenderer::initFromParent ( const vpPanda3DBaseRenderer renderer)
virtualinherited

◆ initFromParent() [2/2]

void vpPanda3DBaseRenderer::initFromParent ( std::shared_ptr< PandaFramework >  framework,
PointerTo< WindowFramework >  window 
)
virtualinherited

◆ isRendering3DScene()

virtual bool vpPanda3DBaseRenderer::isRendering3DScene ( ) const
inlinevirtualinherited

Returns true if this renderer process 3D data and its scene root can be interacted with.

This value could be false, if for instance it is redefined in a subclass that performs postprocessing on a texture.

Reimplemented in vpPanda3DPostProcessFilter.

Definition at line 114 of file vpPanda3DBaseRenderer.h.

Referenced by vpPanda3DBaseRenderer::enableSharedDepthBuffer(), vpPanda3DRendererSet::getCameraPose(), and vpPanda3DRendererSet::getNodePose().

◆ isShowingSpeculars()

bool vpPanda3DRGBRenderer::isShowingSpeculars ( ) const
inline

Definition at line 100 of file vpPanda3DRGBRenderer.h.

◆ loadObject()

NodePath vpPanda3DBaseRenderer::loadObject ( const std::string &  nodeName,
const std::string &  modelPath 
)
inherited

Load a 3D object. To load an .obj file, Panda3D must be compiled with assimp support.

Once loaded, the object will not be visible, it should be added to the scene.

Parameters
nodeNamethe name that will be used when inserting the node in the scene graph
modelPathPath to the model file
Returns
NodePath The NodePath containing the 3D model, which can now be added to the scene graph.

Definition at line 274 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::m_framework, and vpPanda3DBaseRenderer::m_window.

◆ makeFragmentShader()

std::string vpPanda3DRGBRenderer::makeFragmentShader ( bool  hasTexture,
bool  specular 
)
protectedvirtual

Definition at line 169 of file vpPanda3DRGBRenderer.cpp.

Referenced by addNodeToScene().

◆ printStructure()

void vpPanda3DBaseRenderer::printStructure ( )
inherited

Definition at line 330 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::m_renderRoot.

◆ renderFrame()

void vpPanda3DBaseRenderer::renderFrame ( )
virtualinherited

◆ setAbortOnPandaError()

void vpPanda3DBaseRenderer::setAbortOnPandaError ( bool  abort)
inherited

Set the behaviour when a Panda3D assertion fails. If abort is true, the program will stop. Otherwise, an error will be displayed in the console.

Parameters
abortwhether to abort (true) or display a message when an assertion fails.

Definition at line 302 of file vpPanda3DBaseRenderer.cpp.

◆ setBackgroundImage()

void vpPanda3DRGBRenderer::setBackgroundImage ( const vpImage< vpRGBa > &  background)

◆ setCameraPose()

void vpPanda3DBaseRenderer::setCameraPose ( const vpHomogeneousMatrix wTc)
virtualinherited

Set the camera's pose. The pose is specified using the ViSP convention (Y-down right handed).

Parameters
wTcthe new pose of the camera, in world frame

Reimplemented in vpPanda3DRendererSet.

Definition at line 142 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::m_camera, vpPanda3DBaseRenderer::m_cameraPath, vpException::notInitialized, and vpPanda3DBaseRenderer::setNodePose().

◆ setLightableScene()

void vpPanda3DLightableScene::setLightableScene ( NodePath &  scene)
inlineprotectedinherited

Definition at line 266 of file vpPanda3DLight.h.

Referenced by setupScene().

◆ setName()

void vpPanda3DBaseRenderer::setName ( const std::string &  name)
inlineinherited

Definition at line 94 of file vpPanda3DBaseRenderer.h.

◆ setNodePose() [1/2]

void vpPanda3DBaseRenderer::setNodePose ( const std::string &  name,
const vpHomogeneousMatrix wTo 
)
virtualinherited

Set the pose of a node. This node can be any Panda object (light, mesh, camera). The pose is specified using the ViSP convention (Y-down right handed).

Parameters
nameNode path to search for, from the render root. This is the object that will be modified See https://docs.panda3d.org/1.10/python/programming/scene-graph/searching-scene-graph
wToPose of the object in the world frame
Exceptions
ifthe corresponding node cannot be found.

Reimplemented in vpPanda3DRendererSet.

Definition at line 158 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::m_renderRoot.

Referenced by vpPanda3DBaseRenderer::addNodeToScene(), addNodeToScene(), and vpPanda3DBaseRenderer::setCameraPose().

◆ setNodePose() [2/2]

void vpPanda3DBaseRenderer::setNodePose ( NodePath &  object,
const vpHomogeneousMatrix wTo 
)
virtualinherited

Set the pose of a node. The pose is specified using the ViSP convention (Y-down right handed). This node can be any Panda object (light, mesh, camera).

Parameters
objectThe object for which to set the pose
wToPose of the object in the world frame

Reimplemented in vpPanda3DRendererSet.

Definition at line 164 of file vpPanda3DBaseRenderer.cpp.

References vpHomogeneousMatrix::getRotationMatrix(), vpHomogeneousMatrix::getTranslationVector(), vpPanda3DBaseRenderer::VISP_T_PANDA, vpQuaternionVector::w(), vpQuaternionVector::x(), vpQuaternionVector::y(), and vpQuaternionVector::z().

◆ setRenderOrder()

void vpPanda3DBaseRenderer::setRenderOrder ( int  order)
inlineinherited

Definition at line 125 of file vpPanda3DBaseRenderer.h.

◆ setRenderParameters()

void vpPanda3DBaseRenderer::setRenderParameters ( const vpPanda3DRenderParameters params)
virtualinherited

Set new rendering parameters. If the scene has already been initialized, the renderer camera is updated.

Parameters
paramsthe new rendering parameters

Reimplemented in vpPanda3DRendererSet, and vpPanda3DPostProcessFilter.

Definition at line 116 of file vpPanda3DBaseRenderer.cpp.

References vpException::fatalError, vpPanda3DRenderParameters::getImageHeight(), vpPanda3DRenderParameters::getImageWidth(), vpPanda3DBaseRenderer::m_buffers, vpPanda3DBaseRenderer::m_camera, vpPanda3DBaseRenderer::m_renderParameters, and vpPanda3DRenderParameters::setupPandaCamera().

◆ setupCamera()

void vpPanda3DBaseRenderer::setupCamera ( )
protectedvirtualinherited

◆ setupRenderTarget()

void vpPanda3DRGBRenderer::setupRenderTarget ( )
protectedvirtual

◆ setupScene()

void vpPanda3DRGBRenderer::setupScene ( )
protectedvirtual

Initialize the scene for this specific renderer.

Creates a root scene for this node and applies shaders. that will be used for rendering

Reimplemented from vpPanda3DBaseRenderer.

Definition at line 282 of file vpPanda3DRGBRenderer.cpp.

References vpPanda3DBaseRenderer::m_renderRoot, vpPanda3DLightableScene::setLightableScene(), and vpPanda3DBaseRenderer::setupScene().

◆ setVerticalSyncEnabled()

void vpPanda3DBaseRenderer::setVerticalSyncEnabled ( bool  useVsync)
inherited

set whether vertical sync is enabled. When vertical sync is enabled, render speed will be limited by the display's refresh rate

Parameters
useVsyncWhether to use vsync or not

Definition at line 293 of file vpPanda3DBaseRenderer.cpp.

◆ vispPointToPanda()

vpColVector vpPanda3DBaseRenderer::vispPointToPanda ( const vpColVector point)
staticinherited

Definition at line 318 of file vpPanda3DBaseRenderer.cpp.

References vpPanda3DBaseRenderer::PANDA_T_VISP.

◆ vispVectorToPanda()

vpColVector vpPanda3DBaseRenderer::vispVectorToPanda ( const vpColVector vec)
staticinherited

Member Data Documentation

◆ m_buffers

std::vector<GraphicsOutput *> vpPanda3DBaseRenderer::m_buffers
protectedinherited

◆ m_camera

PointerTo<Camera> vpPanda3DBaseRenderer::m_camera
protectedinherited

◆ m_cameraPath

◆ m_framework

std::shared_ptr<PandaFramework> vpPanda3DBaseRenderer::m_framework
protectedinherited

◆ m_name

std::string vpPanda3DBaseRenderer::m_name
protectedinherited

◆ m_renderOrder

int vpPanda3DBaseRenderer::m_renderOrder
protectedinherited

◆ m_renderParameters

◆ m_renderRoot

◆ m_window

◆ PANDA_T_VISP

const vpHomogeneousMatrix vpPanda3DBaseRenderer::PANDA_T_VISP
staticprotectedinherited

Homogeneous transformation matrix to convert from the Panda coordinate system (right-handed Z-up) to the ViSP coordinate system (right-handed Y-Down)

Definition at line 268 of file vpPanda3DBaseRenderer.h.

Referenced by vpPanda3DBaseRenderer::computeNearAndFarPlanesFromNode(), vpPanda3DBaseRenderer::getNodePose(), vpPanda3DBaseRenderer::vispPointToPanda(), and vpPanda3DBaseRenderer::vispVectorToPanda().

◆ VISP_T_PANDA

BEGIN_VISP_NAMESPACE const vpHomogeneousMatrix vpPanda3DBaseRenderer::VISP_T_PANDA
staticprotectedinherited

Definition at line 267 of file vpPanda3DBaseRenderer.h.

Referenced by vpPanda3DBaseRenderer::setNodePose().