A new C++ toolkit has been added to MeshViz: MeshViz Interface.
MeshViz Interface is an API useful for extracting and visualizing features from meshes used for scientific and engineering visualization, for example finite element analysis (FEA) and computer aided engineering (CAE). This toolkit is provided as a replacement for the old 3DdataMaster component of MeshViz. It provides the same basic mesh representation features as 3DdataMaster, but removes most of the limitations of the older API.
MeshViz Interface is designed to support any type of mesh without requiring copying the mesh into an intermediate representation. This is done by defining abstract interfaces that must be implemented in the user's application classes. Thus MeshViz Interface can deal with whatever type of mesh you may have, whether 2D or 3D, cartesian, triangular, hexahedral, polyhedral, quadratic, structured, or indexed. Any number of scalar and vector sets can be analyzed on each mesh using any type of internal representation (float, double, char, bytes, etc) or even implicit data computed on the fly.
MeshViz Interface contains two separate parts: Mesh Extraction and Data Mapping:
- Mesh Extraction creates a mesh of lower dimension from a higher dimension one.
For instance, when extracting a surface mesh (2D) representing an isosurface of a volume mesh (3D).
- Data Mapping creates a graphical representation of an extracted mesh using advanced rendering techniques.
The existing MeshViz toolkit, consisting of 3DdataMaster and GraphMaster, remains unchanged (and language independent). A new product called MeshViz XLM has been defined (for C++ only) that contains both MeshViz and the new MeshViz Interface. You will need a MeshVizXLM license string in order to use MeshViz Interface.
Please see the newly updated Chapter 19 in the Open Inventor User's Guide for more information about MeshViz Interface.
No new features were added. See the fixed bugs section.
Classes PbIndexedMesh2D, PbTriangleMesh2D and PbQuadrangleMesh2D, now use much less memory. Connectivity information is no longer built when the class is instantiated. Rather it is built and stored only when necessary, for instance when streamlines are computed. As a consequence, MeshViz 7.1 (and higher) is able to manage 2D meshes about 3.5 times larger than the previous release.
Moreover a new field, useOverallNormal has been added to PoMeshFilled, to disable normal generation when rendering a flat 2D unstructured mesh, enabling this will speedup and decrease memory usage when using orientable 2D meshes.
No new features were added. See the fixed bugs section.
No new features were added. See the fixed bugs section.
No new features were added. See the fixed bugs section.
Classes PbIndexedMesh3D, PbHexahedronMesh3D, and PbTetrahedronMesh3D now use much less memory. Connectivity information is no longer built when the class is instantiated. Rather it is built and stored only when necessary, for instance when streamlines are computed. As a consequence, MeshViz 5.0.3 (and higher) is able to manage meshes about 3.5 times larger than the previous release.
NOTE: For large meshes, don't forget to set argument is_data_duplicate to FALSE in the constructor. See PbMesh for details.
As a consequence, note also that the getGeometry method (with argument const int **&index) of PbHexahedronMesh3D and PbTetrahedronMesh3D classes is deprecated (the index arg always returned as NULL).
PoMeshSkin, PoMeshCrossSection, PoMeshLevelSurf, PoMeshCrossContour, PoMeshSkeleton, PoMeshProbePoint, PoBaseStreamLine (and derived classes), as well as PoMesh3DVecCrossSection, now use the cell filter (PoCellFilter) inherited from the scene graph. Previously the cell filter was only taken into account by PoMeshSkin.
Class PoMeshSkin has been significantly optimized for gridded mesh when using a cell filter. Depending on the number of cells accepted by the filter, building the skin may be up to 10 times faster.
The 3D mesh representation classes (PoMeshSkin, PoMeshCrossSection, PoMeshLevelSurf,...) have been significantly optimized with regard to property changes. When a property is changed, the parts of the representation affected by the property are rebuilt, but the other parts are not.
This means, for instance:
- If the current color map in the scene graph is changed, only the colors of the representation are recomputed.
- If the data set used to map color is changed, only the colors of the representation are recomputed.
- If the coordinates of the mesh are changed, only the coordinates of the representation are recomputed.
For example, the topology of an isosurface is not rebuilt (the nodes' indices are kept) but the nodes' coordinates of the surface are recomputed.This property change optimization now makes it practical to generate geometric animation of a mesh. Efficient displacement/distortion animations can be generated even on large meshes.
A new field, creaseAngle, has been added to PoMesh in order to allow you to conveniently modify the internal crease angle used by the representation. To improve performance in the default case, the default creaseAngle is now 0. This default value can be changed by setting an environment variable as follows:
SoPreferences::setFloat("OIV_3DDATA_CREASE_ANGLE", myCreaseAngle);Note that MeshViz 5.0 used a default creaseAngle = 0.8.
The new environment variable OIV_3DDATA_USE_TRIANGLE_STRIP_SET is used to choose either a triangle strip set (TRUE) or an indexed face set (FALSE) to draw any isosurface. This variable is used by the class PoMeshLevelSurf and PoMeshCrossSection (if cross section method is ISOSURFACE).
Prior to Open Inventor 5.0.5, only indexed face sets were used in this context. Now triangle strip sets are used by default. This change was made because triangle strip sets are faster and in order the simplify the code internally.
A new field, lowerUpperBoxes, was added to PoLinearValueLegend and PoNonLinearValueLegend3. It allows you to specify if you want to display lower and upper boxes of the legend filled respectively with the color associated with values below the minimum value and values above the maximum.
The MeshView demo classes have been updated to show off some of the new MeshViz features.
- An interactive cell filter connected to a HandleBoxDragger has been added to the MeshViewer demonstration classes. This shows how the cell filter can be used. Here the cell filter is used to define a geometric region of interest.
- An automatic mesh animation option has been added to the demo programs that generate 3D meshes.
DataViz has been renamed MeshViz. The name change, which was prompted by the prior use of the name by another software company, gives us the opportunity to emphasize one of the technologically most interesting parts of DataViz -- its 2D and 3D meshing capabilities.
From a programming perspective, you will see the following differences:
- The directory containing the header files is now named MeshViz (used to be named DataViz).
- The SoDataViz class (used for initialization) is now named SoMeshViz.
- The libraries and DLLs (Windows) and shared objects (UNIX, Linux) now use the MeshViz name.
You should be able to make a global (case-sensitive) change of DataViz to MeshViz throughout your source code (including C++ projects and makefiles) and be ready to go. (Make a complete backup of your code first. Better safe than sorry!)
A set of compatibility headers will be provided so that existing programs will continue to compile, link, and run without change. But this will not be true in the Open Inventor 6.0 release, so we recommend making these minor changes now.
NOTE: Backward compatibility for 3D-MasterSuite applications is no longer supported.
MeshViz now allows data sets to be assigned directly to the cells of a mesh rather than at the vertices of the mesh. This is valuable, for example, for simulation codes that compute a single value for the contents of each cell.
The following classes were affected by this change:
- PbMesh
- New enum: DataBinding, values = PER_CELL, PER_NODE
- New methods: addValuesSet, addValuesSet, getValuesBinding
- PoMesh
- New field: valuesIndexForCellFilter
- PoSFMesh
- New method: addValuesSet
- PoMeshProperty
- New enum: DataBinding, values = PER_CELL, PER_NODE
- New method: addValuesSet
- PoCellFilter - (abstract) NEW
- PoIntervalCellFilter - NEW
PoIntervalCellFilter allows you to "filter" cells based on their value. You specify a range of values and whether you want to accept cells whose values are inside the range or outside the range.
You can define custom cell filters by subclassing from PoCellFilter. In your code you would implement a cellFilter method to accept or reject a cell based on its value and/or its index.
Probes have been optimized.
PoMesh3DVecCrossSection
The new class PoMesh3DVecCrossSection draws a field of vectors on a cross-section of a 3D mesh. A 3D vector is drawn at each point where the 3D mesh grid intersects the cross-section.
The class PoMesh3DVecGridCrossSection is now derived from PoMesh3DVecCrossSection; when its grid spacing is null, it behaves like PoMesh3DVecCrossSection.
DataViz is now thread safe and pipe safe. This means that you can use it in a program with multiple render threads, e.g., with the MPViewer.
DataViz previously used Open Inventor to automatically generate normals for all DataViz shapes. Now DataViz supplies the normals in cases where it can do so more efficiently based on its knowledge of the specific shapes involved. This can, in some cases, significantly reduce the time required to generate the scene graph.
- PoMeshFilled (2D mesh) automatically provides only one normal now if the mesh is a PbParalCartesian2D or PbRegularCartesian2D mesh. Previously Open Inventor computed one normal per face of the 2D mesh.
This can reduce the time to build a 500x500 PoMeshFilled by a factor of 75 and the time to build a 100x100 PoMeshFilled by a factor of 26.
- PoMeshSide (4 Z-sides of a 2D mesh such as PbParalCartesian2D or PbRegularCartesian2D) automatically provides an array of normals to Open Inventor.
For example, if the PoMeshSide mesh size is 500x500 or 5000x5000, the scene graph build time is divided respectively by 1 or 2.
This optimization is useful only for very large meshes.
- PoMeshCrossSection (plane) automatically provides only one normal (the normal of the plane) to Open Inventor.
For example, if the iso-contouring values number of the PoMeshCrossSection mesh is 400 or 2000, scene graph build duration is respectively divided by 1.5 or 2. The mesh cross section have 9000 or 41000 points and 41000 or 200000 faces respectively.
- PoMeshSkin (skin of a 3D mesh) now automatically provides only 6 normals (one per side) if the mesh is a PbParalCartesian3D or PbRegularCartesian3D mesh and if the mode is not color contouring.
For example, if the mesh size is 50x50 or 100x100 or 200x200, the scene graph build duration is reduced by a factor of 1 or 2 or 2.5 respectively.NOTE: The performance numbers quoted above were computed on NVidia Quadro4 or 3DLabs Oxygen GVX1 boards. Your results may differ.
Building a DataViz representation for large meshes was very time-consuming if the mesh contained undefined values. Now it's much faster.
The new outliningEnabled field of PoMiscTextAttr allows you to enable/disable the outlining of polygonal fonts (SoText3 and SoAnnoText3).
For small text, drawing the outline (default) can provide the best visual results. For large text, turning off the outline may provide better performance as well as better visual results.
Previously text was always outlined.
NOTE: Inventor files that contain this new field will not be readable by older versions of Open Inventor. See the Compatibility topic for more details.
The PoMesh::coloringType field now supports a new mode, PoMesh::COLOR_TEXTURE_CONTOURING. Like the mode PoMesh::COLOR_CONTOURING, this mode enables the display of contours. However, it does so using 1D textures, which is more efficient, thus signficantly reducing geometry size and computation time.
Although very fast, this mode is not appropriate for use in all situations e.g., for wireframe representations or when cells or shapes containing undefined values need to be discarded. See the PoMesh help topic for details.
There are now two new 3D data classes: PbPyramidCell and PbWedgeCell. These classes are useful for doing interpolation inside 3D cells of type wedge (prism) or pyramid.
These new classes fix bug #38: streamlines, probe, and vector representations on a gridded cross section crashed when applied on a mesh that contained cells of type wedge or pyramid.
The node index number drawn by PoCellIndices is now prefixed by the letter "n" and the relative node index in the cell. For instance, previously, if the third node index of a cell was 3218, the string "3128" was displayed near this node's position. Now the string "n3 = 3128" is displayed. This improvement allows you to check node ordering in a cell.
The MeshViewer demo tool classes have been dramatically improved. They can be used to build a standalone application (like MeshViewerMain) in order to visualize the mesh described in an .iv file. Starting from the simple definition of a mesh (geometry and node data values), MeshViewer can automatically show any type of representation of this mesh. MeshViewer can be considered to be a SceneViewer specialized for mesh visualization.
In addition, the MeshViewer classes now use the new Open Inventor DialogViz classes for the user-interface component. This provides an attractive and portable user-interface for mesh visualization.
The new GrapherDemo program allows you to specify a 2D parametric curve equation and display it. The axes are dynamically adjusted to the current range of values.
Example: $OIVHOME/src/DataViz/Demos/graph/grapherDemo*
3D-MasterSuite, which was comprised of GraphMaster, 3DdataMaster, PlotMaster, and DialogMaster, has been organized into two new modules: DataViz (containing GraphMaster and 3DdataMaster) and HardCopy (PlotMaster). DialogMaster is now supplied as a standard part of Open Inventor. Please read the Compatibility document for more details.
3DdataMaster
- New algorithm for mesh with fault lines (PbMesh2D::getFaultMesh()) which takes into account undefined values (see PbDefinedValue for managing "defined" and "undefined" values) and supports a new extrapolation method.
- An FAQ is now available to answer some basic technical questions and explain frequently misunderstood topics, features, and concepts.
PlotMaster
- The SoVectorizeGDIAction is now supported with NuTCRACKER.
GraphMaster
- New types of high level charting representation classes (14 new classes) derived from PoChart. For example, PoTube, PoBar, PoRibbon, PoScatter,...
- New types of property classes (15 new classes) used by the new charting representations. For example, PoProfile, PoMesh1DHints, PoMesh1DFilter,...
- New method setVRML2Mode() of PoBase configures 3DMS to generate scene graphs that will provide the best possible quality when converted to VRML2 format.
- Extension of the classes PoMiscTextAttr and PbMiscTextAttr to manage 3D text strings with a profile.
3DdataMaster
- Extension of values-set of meshes with the ability to add string value-set through the method addStringsSet() of PbMesh and all PoMeshProperty nodes.
- Ability to name the values-set of meshes with an extra parameter. This applies to the PbMesh methods that add values-sets and all PoMeshProperty nodes.
- New 1D meshes used for charting representations (PbRegularMesh1D, PbIrregularMesh1D, PoRegularMesh1D, PoIrregularMesh1D).
- All 2D meshes support the treatment of fault lines with the method getFaultMesh() of PbMesh2D.
- New constructor for the class PbRegularCartesianGrid2D in order to refine a given mesh.
- In PoTriangleMesh2D class, new method setGeometry() to access the Voronoi algorithm.
PlotMaster
- Supports printing of patterns (SoPattern) for PostScript and CGM output.
- New painter's algorithm mode (HLHSR_PAINTER_SURFACE_REMOVAL).
Utilities
- New action (PoToVRML2Action) to generate VRML2-style scene graph from an Inventor scene graph with MasterSuite nodes.
This version contains many bug fixes (see Bugs fixed for more details).
PlotMaster
- New IVF-based demonstration program (GDIPrintPreview) that shows how to use the SoVectorizeGDIAction class to generate a print preview and printed output.
GraphMaster
- Uses new type of text (SoAnnoText3) which combines advantages of SoText3 (expressed in the current units) and SoText2 (better quality).
- New types of property nodes (PoDomain, PoDataMapping, PoMiscTextAttr, PoIsovaluesList, PoNumericDisplayFormat).
- New field (coordinateType) in PoLabelField class to express coordinates in the domain.
- New field (maxValueSize) in PoLinearValueLegend and PoNonLinearValueLegend3 class to control size of value text strings.
- Order of values for automatic legends can be reversed.
- New methods in PbDataMapping class and its derived classes to manage transparency mapping.
3DdataMaster
- New property mesh nodes (PoMeshProperty).
- New 2D regular grid mesh (PbRegularCartesianGrid2D).
- New 3D regular grid mesh (PbRegularCartesianGrid3D).
- New cell classes (PbCell).
- In PbMesh and its derived classes, new geometric methods (i.e., getVolume()), and new topologic methods (i.e., getAdjacentCellsIndByNode())
- Elimination of mesh parts associated with "undefined values". See setting transparencies in PbDataMapping class or PoDataMapping node.
- Representation of a vector field by streamlines (PoBaseStreamLine).
- Representation of a vector field on a cross section of a volume mesh (PoMesh3DVecGridCrossSection).
- Coloration of level surface with a second set of scalar values (PoMeshLevelSurf).
- Representation of cell of a mesh (PoCellShape).
- Point probe in a mesh (PoMeshProbePoint).
PlotMaster
- GDI vector output (SoVectorizeGDIAction) (available only with Windows NT and 95).
- Supports multi-printing per page.
- Supports printing of images (SoImage), markers (SoMarkerSet), and annotation text (SoAnnotText3).
- Hidden line removal algorithm.
- Improvement of painter's algorithm.
DialogMaster
- New methods to manage limits of sliders. See PoXtSliderData::setFixedLimits().
Utilities
- New class to manage array of int values (PbArrayOfInt).
- New class to manage array of long values (PbArrayOfLong).
GraphMaster
- 2D and 3D pie charts classes (PoPieChart2D and PoPieChart3D).
- Set of axes class where axes are defined on a parallelepiped relative to the view (PoAutoCubeAxis).
- New methods for the classes PbDomain and PoBase.
- domainTransform catalog kit part has changed. The part which was previously an SoTransform is now an SoMatrixTransform.
3DdataMaster
- Vector field classes on 2D and 3D meshes (PoMesh2DVec and PoMesh3DVec).
- Voronoi 2D (new method setGeometry for the class PbTriangleMesh2D).
- Cross-contour class on 3D mesh (PoMeshCrossContour).
- Skeleton class on 3D mesh (PoMeshSkeleton).
- Optimizations for cross sections on 3D mesh (PoMeshCrossSection).
- getBoundingBox method on 2D and 3D mesh.
PlotMaster
- Takes into account lighting.
- Simple painter's algorithm to manage HLHSR (Hidden Line/Hidden Surface Removal).
- Takes into account multi-viewing.
Utilities
- A set of classes allows the user to manage multi-viewing. (PoBaseView, PoView, and PoSceneView).