<a id="e3d-3d-viewer"></a>

# 3D Viewer

The class [`E3DViewer`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html) is an interactive 3D viewer for point clouds, ZMaps, meshes and basic shapes (lines, planes, boxes and spheres).

* It features multiple sources display, color ramps, 3D point picking and text label display.
* It is compatible with Windows and Linux and can be integrated to Win32, MFC and QT frameworks.

<a id="e3d-viewer-creating"></a>

## Creating a 3D Viewer

* The general constructor of a 3D viewer is:<br />
  \\\\
  `E3DViewer(EUIAPI uiApi, int orgX, int orgY, int width, int height, void* parent)`
* The way to use it depends on the Operating System and the User Interface API.

<a id="e3d-viewer-windows"></a>

### Windows Only

* To create a 3D viewer stand-alone window:
  * Use `E3DViewer(EUIAP.EUIAPI_Win32, orgX, orgY, width, height)`
* To create a 3D viewer as a part of another window in an MFC application:
  * Use `E3DViewer(EUIAP.EUIAPI_Win32, orgX, orgY, width, height, handle to the parent window)`
  * See the MsVc or MsVcs Easy3DViewer sample.

<a id="e3d-viewer-windows-linux"></a>

### Windows and Linux

* To create a 3D viewer in a Qt application:
  * Use `E3DViewer(EUIAP.EUIAPI_Qt, orgX, orgY, width, height)`
  * You must instance the class inside a `QOpenGLWidget` object.
  * See the Easy3DViewer Qt sample.

<a id="e3d-viewer-render-sources"></a>

## Managing the Render Sources

* A render source is a displayed entity. It can be an [`EPointCloud`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1EPointCloud.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1EPointCloud.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EPointCloud.html), an [`EZMap`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1EZMap.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1EZMap.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EZMap.html), an [`EMesh`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1EMesh.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1EMesh.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EMesh.html), an [`E3DBox`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DBox.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DBox.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DBox.html), an [`E3DLine`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DLine.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DLine.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DLine.html), an [`E3DPlane`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DPlane.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DPlane.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DPlane.html) or and [`E3DSphere`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DSphere.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DSphere.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DSphere.html). You can display one or several render sources simultaneously in the 3D viewer.

![image](assets/images/easy3d/3d_viewer_01.webp)
* To manage the list of render sources, use the methods:
  * [`E3DViewer::AddRenderSource`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a8a336c409f9bc6d5752a3e59bd706c80) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a8be473b938e1de79f4068edd072857e9) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#aa902c33206269635ba03701562676e5a) to add another render source to the current list. The render source has a name for further reference.
  * [`E3DViewer::SetRenderSource`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a231fac76c5ea925eaab0e79d9a84869b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a97d536608afdea3adcce1b9867edc5a9) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a53e89297b69e1ab1c6f6a5c6dabfaec1) to change the content of the render source.
  * [`E3DViewer::RemoveRenderSource`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a05510fc91330123d81c9dc501919ad80) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a4e864525849f47b7b05ef41ae57ff031) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ac99031b2357cd059ff46b941a2a4837b) to remove a render source from the current list.
* The render sources API exposes several display attributes:
  * Visibility (controlled by [`E3DViewer::ShowRenderSource`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#af32987b77e4b327a5910e064d4339dc1) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a7aa04ac5a00007a6234b588e07408beb) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#abe93086e3df9dba9567388bce72d8d12)/ [`E3DViewer::HideRenderSource`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#ae56c23059dda1cf4a38ccf2963a61288) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ab859548be33f6c7576c1a539d9461c9d) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae1e3071507be694d6bee42a2e8fa5c92))
  * Color mode ([`E3DViewer::SetRenderSourceColorMode`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a2f643814ba4762f14b2872979836f50e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a076f81691aa3c973ff7b37a0af86d345) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#aa0c11ef150d260264a659c0fd9de1501)): choose between constant color (the only option for basic shapes), color ramp or point cloud color attributes.
  * Color ([`E3DViewer::SetRenderSourceConstantColor`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a30cbe9bd91fd6464398ebc4e0911b735) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a2933fcbd56cb67cb30fd53e736f67a96) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a257011b4a2438f4430200ac510455d93)) for render sources with constant color.
  * Opacity ([`E3DViewer::SetRenderSourceOpacity`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a4fe0966832a37e65e0e842ce16fec0a1) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a3703fe1c2d5bce06c2cdab594d856b22) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#af65c93a13f45cdfc251a09af511f22b4))
  * Point size ([`E3DViewer::SetRenderSourcePointSize`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#af22449d15e31a0dd0b7ca3ff6869431a) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ae81bc6b715388e386ce6750dc5538150) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a1a7d51712e00e3e5f0157fcdf0343a89)): applies to point clouds and ZMaps only.
  * Wire frame ([`E3DViewer::SetRenderSourceWireFrame`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a77833ce808189b6d998dfb02a3f77e6e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ac7c5c3a5947eb58cc80a8459a896de48) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a73a48692bfd75a339f925ffe47ab4316)): applies to meshes, boxes and planes.

![Point cloud displayed with constant color.](assets/images/easy3d/3d_viewer_02.webp)![Point cloud displayed using a color ramp.](assets/images/easy3d/3d_viewer_03.webp)![Point cloud displayed using color attributes.](assets/images/easy3d/3d_viewer_04.webp)![image](assets/images/easy3d/3d_viewer_05.webp)

<a id="e3d-viewer-shading"></a>

## Shading

[`E3DViewer`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html) can shade rendering sources using a custom version of the Eye Dome Lighting (EDL) technique.

* Use [`E3DViewer::SetEnableEDLShading`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a0a90428e2448a73159a88ce0260c8d1e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#abafd7e9b27b0146f6e184522255bb728) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a76e5fd26181998cfc282f94b7c286e8f) to enable the shading.
* Use [`E3DViewer::SetEDLShadingFactor`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a9cbe661bfab653a1a188888402bb9790) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a5cd279937976b968e4dc4315e8c3b317) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#aa8ecc4d5717fc5b7f47f1bdbe988bb1f) to adjust the shading between 0 and 1:
  * 0 means no shading.
  * 1 means strong shading.

EDL is a post processing technique. It impacts all opaque render sources all together. With EDL, pixels that are closer to the camera occlude neighbor pixels that are further away from the camera.

![Mesh with EDL disabled.](assets/images/easy3d/3d_viewer_18.webp)![Mesh with EDL enabled.](assets/images/easy3d/3d_viewer_19.webp)

<a id="e3d-viewer-color-ramp"></a>

## Using a Color Ramp

* When the color mode of a render source is [`ESourceColorMode_Ramp`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#adb04cec631392aa7ddf9207b2365cae0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a75b8c4025c420d62cf15cd50913cc41b) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1ESourceColorMode.html), the color of each point is calculated from the position or the attribute of the point.
* Use [`E3DViewer::SetColorRampMode`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a11a8a622d755d384629a61e9ab5c35e9) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a7540985b2a56c272dc6574f5162414a0) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a15168974d90f8c9500d82cf7acad7c06) to choose the color ramp:
  * [`EColorRampMode_HueFromX`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) and its `Y` and `Z` counterparts compute the colors from respectively X/Y/Z point coordinates ([`EColorRampMode_HueFromZ`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) is the default color ramp mode).
  * [`EColorRampMode_RGBCube`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) computes the colors by mixing X,Y,Z point coordinates.
  * [`EColorRampMode_HueFromIntensity`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) computes the colors from the intensity attribute of the point.
  * [`EColorRampMode_HueFromNormal`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) computes the colors from the normal attribute of the point.
  * [`EColorRampMode_HueFromConfidence`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) computes the colors from the confidence attribute of the point.
  * [`EColorRampMode_HueFromDistance`](../../../doxygen_cpp/namespaceeVision_1_1Easy3D.html#a11bda20fa614942e1addb939c4975ca9) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision_1_1Easy3D.html#a442dd0ea0bd7272144425cc1c1b45842) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1EColorRampMode.html) computes the colors from the distance attribute of the point.

![Point cloud with color map mode `Hue from X`.](assets/images/easy3d/3d_viewer_06.webp)![Point cloud with color map mode `Hue from Y`.](assets/images/easy3d/3d_viewer_07.webp)![Point cloud with color map mode `Hue from Z`.](assets/images/easy3d/3d_viewer_08.webp)![Point cloud with color map mode `RGB cube`.](assets/images/easy3d/3d_viewer_09.webp)
* When a color ramp is defined, you can display a legend at the right side of the window (default position). To control the color ramp legend aspect, use the methods [`E3DViewer::ShowColorRampLegend`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#af425e62406bac292c089fe4a5e82e083) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a7a289313b4996581ac50f8800f38ace1) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#aa81667d29e5f2262714151e9abedb4da), [`E3DViewer::HideColorRampLegend`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a4a4c5d165b5cf4e3c1d97e96006b536b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a53e6601b4b50c36aec938affc7f864c7) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a144bd1cebe5288a37563081f87af88db), [`E3DViewer::SetColorRampGraduationColor`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#ae6c54735d33e1266f9bc1c4c821d55c7) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a3e7644f7dd501ed91260f16c3fcd35b8) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a04441e143fb155b59c0eedc76fc05bbe) and [`E3DViewer::SetColorRampLocation`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a74688e27fc5d962bb954a64f6782e0ca) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#abc69e1b502b4fbb45ad8f440dcae2d21) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a6752232bb9eb62ef50e20fa47f541cf4).
* When the “Smart color ramp” is enabled with the method [`E3DViewer::SetEnableSmartColorRamp`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a7efac30f37fcc3aa22c3adf7707154d0) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a880811347b06a8b8f38868caefdd0422) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a6998f2fdddff136b340c9f63ff3fd5e0), an outlier filtering processing is applied to remove the noise and spread the colors on the main part of the object. The outliers are then displayed with constant red or blue colors.

To keep the same color ramp bounds instead of adaptive ones, use [`E3DViewer::SetFixColorRampBounds`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#aaf7e29f26b9a86c42ac66dd18397d898) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aa91be73d927d10743a2082e9650f86d6) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a799be1d9ae486ae7f477e11d9f417ad4).

![image](assets/images/easy3d/3d_viewer_10.webp)

<a id="e3d-viewer-interactive-controls"></a>

## Interactive Controls

On Windows, the interactive controls are built in the class [`E3DViewer`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html).

* The following interactions are possible:

| Interaction                               | Control                                |
|-------------------------------------------|----------------------------------------|
| Rotate the view                           | left-click + mouse move                |
| Translate the view                        | right-click + mouse move               |
| Change the view distance                  | mouse wheel                            |
| Reset the view                            | **r**                                  |
| View along the positive / negative X axis | **x** / **Shift+x**                    |
| View along the positive / negative Y axis | **y** / **Shift+y**                    |
| View along the positive / negative Z axis | **z** / **Shift+z**                    |
| Show / hide the axis                      | **a**                                  |
| Enable / disable the wireframe mode       | **w**                                  |
| Increase / decrease the point size        | plus sign (**+**) / minus sign (**-**) |
* Use the following methods to implement custom view controls:
  * [`E3DViewer::LockRotationInitialPosition`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a803a7f06618c726e84b67f1d8410e5ef) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#acd68ff96b22e9b0fbf985f971f0b9562) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae19e76190a3edc687faa320d7e45a630), [`E3DViewer::UpdateRotationPosition`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a4ee68605012f07b6a5816d2a54cce85f) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a99f6534dfbb7389a0f2ff96b95aedefd) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a971b15209a01bd5f7fb4862c4a20c7a4) and [`E3DViewer::LockRotationFinalPosition`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#ad4af54f91da3306d47286e93aa20e8e9) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a51dd91155103f1efcf20b6d9301da500) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a94bfdfce140c70f8f18ab10cbb1af7fd) correspond to the sequence click-drag-release to change the viewpoint by rotation.
  * [`E3DViewer::LockTranslationInitialPosition`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a5d7e83cab07c2496c7bbbee1922dff7c) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a7298d837530ef074b04af0c5e1367f74) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a27394e553c6a63aa94512737a5e3efc6), [`E3DViewer::UpdateTranslationPosition`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a8f483c49ad1b8d1e45e24caef34311a3) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a7566d8aa65bbc712a698fc9ba586db8d) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae57e8883def1912026075c18b80a595c) and [`E3DViewer::LockTranslationFinalPosition`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a42d18f2f760886387ae17d1736aec63f) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a4fa708bc276751f2287675762f1b88a5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ab827646321c1639110f0823849b74ed4) correspond to the sequence click-drag-release to change the viewpoint by translation.
  * [`E3DViewer::UpdateViewDistance`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#af5a3c3594b74488b3fc6381ecdb07261) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aa5b0cb24e4c5fcfb0bc3d34207ce85a6) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a975c2190aa21c19da84611230ce5c490) changes the view distance, usually controlled by the mouse wheel.
  * [`E3DViewer::ResetView`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#ab51df5667d4857b042759521204399fe) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ac029e1051adbf3d4f4c07558ed4fc763) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a4be12a146e6126f190768410d67e08d7) restores the default viewpoint.
* You can also directly configure the view position with the methods:
  * [`E3DViewer::SetViewTarget`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#adbac38c72fdbde904c041134373b4694) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ad6415205f00e7b6a67ceec0f7807e6d4) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae190075a771c8a2dd01da77493cb9de5) (by default, it is the center of the object).
  * [`E3DViewer::SetViewAngle`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a1a2ec7b80497675e3e7a60686c0bac48) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ae6cfc6bb93d45e8296cbe0cae0e4e9d9) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#acba4ba57dff52c3b371990354295562a) to choose the orientation of the view.
  * [`E3DViewer::SetViewDistance`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a934fcb93e8874d94ff581e004d34e5b4) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a5afbec33a6b58a30db395af75b3152e0) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ad1640967dc9c4798250c6f465f4ea2ef) to choose the distance to the view target.

#### SEE ALSO
Sample program: [Qt Easy3DViewer](../../../resources/sample_programs/3d_processing/easy3dviewer.html.md).

<a id="e3d-viewer-view-parameters"></a>

## View Parameters

You can customize the 3D view and:

* Change the field of view with [`E3DViewer::SetFieldOfView`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a56308740ca4f695aee8b74a32a525794) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a3b6ee6e3877d09cd5158a4909354edc4) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#aa5b5b71686b5e05f7daebd417652dc5c).
* Switch between the perspective and the orthographic view with [`E3DViewer::SetProjectionType`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a0bd9a63ccca38563b2e5d20b1c5e6b48) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a55177cf7f6ba83f371e927aa77d55e9f) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#acd181ededa2a162be050ab229265f3a6).
* Enable or disable the display of the X, Y and Z axis with [`E3DViewer::SetRenderAxis`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#ac0e0772a9ad8a850f0d9e8748f87c6aa) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aafe7f3743b4b8b382b9633911ccce45d) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a6765b3aa2861cfc2d2c778ebf7563e1a).
* Switch the axis origin between the world origin and the object center with [`E3DViewer::SetAxisOrigin`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#acd10b7527f812e5e05df5c84118718e6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ac10636ecc0d4207b55dd8ac138cdbb8c) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a840ddb2d428b1313b448e7505dded04a).
* Enable or disable the display of a grid with [`E3DViewer::SetRenderGrid`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a946345b26cda067e972ea98ff69ce731) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a3cabcfc9e43c6f674f298237cf862545) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a650b7d0692bb65bc061adaa354aa8ff5).
* Activate an auto rotate animation with [`E3DViewer::SetAutoRotate`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#ae963257dc327148fe21d5939b3848f66) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a58ff22912cb814b65b00935241cdcdfc) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a3abbc01527a3beb14b4f9bfcc095ea06).
* Use a decimation level (remove some points to speed up the rendering) with [`E3DViewer::SetRenderDecimationLevel`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a3ecb682e93ee9b12e11cb864f6a9a260) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ad97038612e4144c3163303abb807e8dd) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae29a76ffc15f2dd5d32d21b6169de105).

![Point cloud displayed with no axis.](assets/images/easy3d/3d_viewer_11.webp)![Point cloud with a world-centered axis.](assets/images/easy3d/3d_viewer_12.webp)![Point cloud displayed with a bounding-box axis.](assets/images/easy3d/3d_viewer_13.webp)![Point cloud with an axis and a grid.](assets/images/easy3d/3d_viewer_14.webp)

<a id="e3d-viewer-picking"></a>

## Picking a 3D Point

* Picking a point means detecting the point closest to the given coordinates in a [`E3DViewer`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html) window. You can then display the detected 3D point, with attributes, as a text label.

![image](assets/images/easy3d/3d_viewer_15.webp)
* The distance threshold used to select a picked point is defined by [`E3DViewer::SetPickingDistanceThreshold`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a3efd7efc2f8b7aa0b38ae6b7d3f15510) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aa708d520ae9ba8af95ba547c30002dc4) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#aac5c30a2dd42171258ee5554d0dc66c4). There is no picked point if the point cloud distance to the picked position is greater than this threshold.
* On the Win32 interface framework, the built-in control for the picking is **Ctrl + mouse button**.
  * To control the picking, use the methods [`E3DViewer::Pick3DPoint`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#aa550e26d61ba096f82782b4200da6c0e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a1fd8c35b7795fd06bb3808dfdea7b757) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a17066ac065b2e52fd09c4eeb9de8fe17), [`E3DViewer::GetLastPickedPoint`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a2860deff7f4418f73dae2031b42e3a2d) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a1e4a81580ec58162b32844f3d0946ada) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a3d9e2cc0ac42d0ba65898ea66d6ad3ec) and [`E3DViewer::ResetPicking`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a4e6b55f21ca9b314e7ddebff26982473) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a2c8cba3adcdf1cbae2e6f5a13aa29925) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae0663572508ddc3bba8462bd68f98e7c).
  * To configure the [`E3DViewer`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html) to call a specified function when you pick a point, use the method [`E3DViewer::SetPickedPointCallBack`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#aa5915e65ee59aafdbec8518e6d330eeb) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a948c732d5e21de887e03fda16e3079c2) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a9a626417c1570187b860ec981816b932).
* To configure the display of the picking label, use [`E3DViewer::SetPickingDisplay`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a0d65d9b6e414e7f3d0d5788b11b3f337) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ab5276d5731b4ef7dc1a1365695f5638a) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a4f6aee2ffe03286565fa47d9b94d77d4), [`E3DViewer::SetPickingLabelSize`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a03fb28257c87ccbefa7dbbee0a66371e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a900f7def80112ba843d9a02233375309) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae2b24ec282dd93ac2397d21ba79aa3a8), [`E3DViewer::SetPickingLabelColor`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a0b53d112a97325039ac51383ac4cd7c1) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ac03cf302baf434cf0379e80db19cfa6c) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ae7547cdb2efc92758d67ed29ab724fca) and [`E3DViewer::SetPickingLabelFixed`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#aec1b991d13f25a362f4f3784593bb149) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a81c85f041eea6aa7128f2e85b40c4a7a) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a3deee3856e56eef2a0a15d9646c4065f).

<a id="e3d-viewer-text-labels"></a>

## Text Labels and 3D Objects

* You can add custom text labels and 3D objects to the current view of the 3D viewer.

![image](assets/images/easy3d/3d_viewer_16.webp)
* To control the text label display, use:
  * [`E3DViewer::AddTextLabel`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a034b87518718a9bc3ccb1e45aaef7ace) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a8e24a1b9b9fb0495db1a98bf3c69aed2) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a5bc44a84a0c325c5046f656eee00038a) to add a text label with or without a 3D anchor. [`E3DViewer::AddTextLabel`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a034b87518718a9bc3ccb1e45aaef7ace) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a8e24a1b9b9fb0495db1a98bf3c69aed2) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a5bc44a84a0c325c5046f656eee00038a) returns an ID used for further reference.
  * [`E3DViewer::EditTextLabel`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#aa17a7aae02f7e3e3c5ff0a60cad54502) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a4d2d7d1cd2527b61fdc5729bcce6b908) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a35a5475fea6e80ebddaf08da66dd89f9) to change the position, color, size or text of a label.
  * [`E3DViewer::GetTextLabel`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#acab0c93042e781f6c60653aeabf6f337) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#ab04426612d883a1257db9926afe20cd5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a8fccbf31655186dbfb623f1f9452e95c) to get the attributes of a label.
  * [`E3DViewer::RemoveTextLabel`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a29f01a7f5efcc1d2350ad3193311bd54) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#abe6c8318de9db07d94f26e672dbe266f) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a52c6a9028a1062fae064e81192b18ae3) to remove a label.
  * [`E3DViewer::ClearTextLabels`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a00d0b972bee5b73c7b69b73eaf6feadf) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a7a0415c7bc0536f7806800119ce117b2) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a2e9026a417130207e52891fbe36126b2) to remove all labels.
* The class [`E3DViewer`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html) can also display [`E3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DObject.html) over a point cloud, a ZMap or a mesh. Use the tools **Easy3DObject** and **Easy3DMatch** to create the [`E3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DObject.html).
* Use the methods [`E3DViewer::Register3DObjects`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#aae4ec666d1be3c19b9e572a9cb7400e2) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a25111dd790387a1c010bde6b65c38810) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ab5e73b328b8e4e7c5311682f30c9577c), [`E3DViewer::Add3DObjects`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a20053eda752a57e3174404b8b14c56bd) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aa2a199ea91fc3c6fac934d61d9e5f06d) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a4d6892d98828144088703c394f696094) and [`E3DViewer::RemoveCurrent3DObjects`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#adc012a5d1cea66ae9c7c9febd8a63425) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aefa6cbe0d5d4ab63b10871c2c7616687) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#acffec334b0734cb9efec6198928bfa5e) to manage the list of [`E3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DObject.html) that you want to display.

An [`E3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DObject.html) contains several features (center point, bounding box, base plane…). Use the methods [`E3DViewer::ShowFeatureFor3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a573b8ac0dbb22527ee0c762edf72609b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a6649583fc46eeb89124ee6fcc4cf037a) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#ac1efc839b42cf71a84ece6d482760a1b) / [`E3DViewer::HideFeatureFor3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a36cb2c3f483d14465495e173aad0ff3c) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aa0f932f887cd62031127e3d402d8eacb) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a1e3ad7a13944e3b605cdd0d7201d06a3) and [`E3DViewer::ShowFeatureForAll3DObjects`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a0dd8d6f97496c7fc3e22bb6e59df24b5) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#a1c6676d6c68dfca5186cdaf97f05a03f) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a6be7d6a75b91e1dd93c15d21a6fb4bb8) / [`E3DViewer::HideFeatureForAll3DObjects`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DViewer.html#a17e215dcef38d1bc207c34539a939444) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DViewer.html#aafc4f1bb3a7ed52b621df5b81d436817) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DViewer.html#a1553b64729a47c7645d80c057e798413) to select the displayed features.

See the `Easy3DObjectExtract` MSCV sample as an example for the display of [`E3DObject`](../../../doxygen_cpp/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1Easy3D_1_1E3DObject.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1Easy3D_1_1E3DObject.html).

![image](assets/images/easy3d/3d_viewer_17.webp)
