123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 |
- // This file is part of OpenCV project.
- // It is subject to the license terms in the LICENSE file found in the top-level directory
- // of this distribution and at http://opencv.org/license.html.
- #ifndef _OPENCV_OVIS_H_
- #define _OPENCV_OVIS_H_
- #include <opencv2/core.hpp>
- /**
- @defgroup ovis OGRE 3D Visualiser
- ovis is a simplified rendering wrapper around [ogre3d](https://www.ogre3d.org/).
- The [Ogre terminology](https://ogrecave.github.io/ogre/api/latest/_the-_core-_objects.html) is used in the API
- and [Ogre Script](https://ogrecave.github.io/ogre/api/latest/_scripts.html) is assumed to be used for advanced customization.
- Besides the API you see here, there are several environment variables that control the behavior of ovis.
- They are documented in @ref createWindow.
- ## Loading geometry
- You can create geometry [on the fly](@ref createTriangleMesh) or by loading Ogre `.mesh` files.
- ### Blender
- For converting/ creating geometry [Blender](https://www.blender.org/) is recommended.
- - Blender 2.7x is better tested, but Blender 2.8x should work too
- - install [blender2ogre](https://github.com/OGRECave/blender2ogre) matching your Blender version
- - download the [Ogre MSVC SDK](https://www.ogre3d.org/download/sdk/sdk-ogre) which contains `OgreXMLConverter.exe` (in `bin/`) and set the path in the blender2ogre settings
- - get [ogre-meshviewer](https://github.com/OGRECave/ogre-meshviewer) to enable the preview function in blender2ogre as well as for verifying the exported files
- - in case the exported materials are not exactly how you want them, consult the [Ogre Manual](https://ogrecave.github.io/ogre/api/latest/_material-_scripts.html)
- ### Assimp
- When using Ogre 1.12.9 or later, enabling the Assimp plugin allows to load arbitrary geometry.
- Simply pass `bunny.obj` instead of `bunny.mesh` as `meshname` in @ref WindowScene::createEntity.
- You should still use ogre-meshviewer to verify that the geometry is converted correctly.
- */
- namespace cv {
- namespace ovis {
- //! @addtogroup ovis
- //! @{
- enum SceneSettings
- {
- /// the window will use a separate scene. The scene will be shared otherwise.
- SCENE_SEPARATE = 1,
- /// allow the user to control the camera.
- SCENE_INTERACTIVE = 2,
- /// draw coordinate system crosses for debugging
- SCENE_SHOW_CS_CROSS = 4,
- /// Apply anti-aliasing. The first window determines the setting for all windows.
- SCENE_AA = 8,
- /// Render off-screen without a window. Allows separate AA setting. Requires manual update via @ref WindowScene::update
- SCENE_OFFSCREEN = 16,
- /// Enable real-time shadows in the scene. All entities cast shadows by default. Control via @ref ENTITY_CAST_SHADOWS
- SCENE_SHADOWS = 32
- };
- enum MaterialProperty
- {
- MATERIAL_POINT_SIZE,
- MATERIAL_LINE_WIDTH,
- MATERIAL_OPACITY,
- MATERIAL_EMISSIVE,
- MATERIAL_DIFFUSE,
- MATERIAL_TEXTURE0,
- MATERIAL_TEXTURE = MATERIAL_TEXTURE0,
- MATERIAL_TEXTURE1,
- MATERIAL_TEXTURE2,
- MATERIAL_TEXTURE3,
- };
- enum EntityProperty
- {
- ENTITY_MATERIAL,
- ENTITY_SCALE,
- ENTITY_AABB_WORLD,
- ENTITY_ANIMBLEND_MODE,
- ENTITY_CAST_SHADOWS
- };
- /**
- * A 3D viewport and the associated scene
- */
- class CV_EXPORTS_W WindowScene {
- public:
- virtual ~WindowScene();
- /**
- * set window background to custom image/ color
- * @param image
- */
- CV_WRAP virtual void setBackground(InputArray image) = 0;
- /// @overload
- CV_WRAP_AS(setBackgroundColor) virtual void setBackground(const Scalar& color) = 0;
- /**
- * enable an ordered chain of full-screen post processing effects
- *
- * this way you can add distortion or SSAO effects.
- * The effects themselves must be defined inside Ogre .compositor scripts.
- * @param names compositor names that will be applied in order of appearance
- * @see addResourceLocation
- */
- CV_WRAP virtual void setCompositors(const std::vector<String>& names) = 0;
- /**
- * place an entity of a mesh in the scene
- *
- * the mesh needs to be created beforehand. Either programmatically
- * by e.g. @ref createPointCloudMesh or by placing the respective file in a resource location.
- * @param name entity name
- * @param meshname mesh name
- * @param tvec translation
- * @param rot @ref Rodrigues vector or 3x3 rotation matrix
- * @see addResourceLocation
- */
- CV_WRAP virtual void createEntity(const String& name, const String& meshname,
- InputArray tvec = noArray(), InputArray rot = noArray()) = 0;
- /**
- * remove an entity from the scene
- * @param name entity name
- */
- CV_WRAP virtual void removeEntity(const String& name) = 0;
- /**
- * set the property of an entity to the given value
- * @param name entity name
- * @param prop @ref EntityProperty
- * @param value the value
- * @param subEntityIdx index of the sub-entity (default: all)
- */
- CV_WRAP virtual void setEntityProperty(const String& name, int prop, const String& value,
- int subEntityIdx = -1) = 0;
- /// @overload
- CV_WRAP virtual void setEntityProperty(const String& name, int prop, const Scalar& value) = 0;
- /**
- * get the property of an entity
- * @param name entity name
- * @param prop @ref EntityProperty
- * @param value the value
- */
- CV_WRAP virtual void getEntityProperty(const String& name, int prop, OutputArray value) = 0;
- /**
- * convenience method to visualize a camera position
- *
- * @param name entity name
- * @param K intrinsic matrix
- * @param imsize image size
- * @param zFar far plane in camera coordinates
- * @param tvec translation
- * @param rot @ref Rodrigues vector or 3x3 rotation matrix
- * @param color line color
- * @return the extents of the Frustum at far plane, where the top left corner denotes the principal
- * point offset
- */
- CV_WRAP virtual Rect2d createCameraEntity(const String& name, InputArray K, const Size& imsize,
- float zFar, InputArray tvec = noArray(),
- InputArray rot = noArray(),
- const Scalar& color = Scalar::all(1)) = 0;
- /**
- * creates a point light in the scene
- * @param name entity name
- * @param tvec translation
- * @param rot @ref Rodrigues vector or 3x3 rotation matrix
- * @param diffuseColor
- * @param specularColor
- */
- CV_WRAP virtual void createLightEntity(const String& name, InputArray tvec = noArray(),
- InputArray rot = noArray(),
- const Scalar& diffuseColor = Scalar::all(1),
- const Scalar& specularColor = Scalar::all(1)) = 0;
- /**
- * update entity pose by transformation in the parent coordinate space. (pre-rotation)
- * @param name entity name
- * @param tvec translation
- * @param rot @ref Rodrigues vector or 3x3 rotation matrix
- */
- CV_WRAP virtual void updateEntityPose(const String& name, InputArray tvec = noArray(),
- InputArray rot = noArray()) = 0;
- /**
- * set entity pose in the world coordinate space.
- * @param name enitity name
- * @param tvec translation
- * @param rot @ref Rodrigues vector or 3x3 rotation matrix
- * @param invert use the inverse of the given pose
- */
- CV_WRAP virtual void setEntityPose(const String& name, InputArray tvec = noArray(),
- InputArray rot = noArray(), bool invert = false) = 0;
- /**
- * Retrieves the current pose of an entity
- * @param name entity name
- * @param R 3x3 rotation matrix
- * @param tvec translation vector
- * @param invert return the inverted pose
- */
- CV_WRAP virtual void getEntityPose(const String& name, OutputArray R = noArray(), OutputArray tvec = noArray(),
- bool invert = false) = 0;
- /**
- * get a list of available entity animations
- * @param name entity name
- * @param out the animation names
- */
- CV_WRAP virtual void getEntityAnimations(const String& name, std::vector<String>& out) = 0;
- /**
- * play entity animation
- * @param name entity name
- * @param animname animation name
- * @param loop enable or disable animation loop
- * @see getEntityAnimations
- */
- CV_WRAP virtual void playEntityAnimation(const String& name, const String& animname,
- bool loop = true) = 0;
- /**
- * stop entity animation
- * @param name enitity name
- * @param animname animation name
- */
- CV_WRAP virtual void stopEntityAnimation(const String& name, const String& animname) = 0;
- /**
- * read back the image generated by the last call to @ref waitKey
- */
- CV_WRAP virtual void getScreenshot(OutputArray frame) = 0;
- /**
- * read back the texture of an active compositor
- * @param compname name of the compositor
- * @param texname name of the texture inside the compositor
- * @param mrtIndex if texture is a MRT, specifies the attachment
- * @param out the texture contents
- */
- CV_WRAP virtual void getCompositorTexture(const String& compname, const String& texname,
- OutputArray out, int mrtIndex = 0) = 0;
- /**
- * get the depth for the current frame.
- *
- * return the per pixel distance to the camera in world units
- */
- CV_WRAP virtual void getDepth(OutputArray depth) = 0;
- /**
- * convenience method to force the "up" axis to stay fixed
- *
- * works with both programmatic changes and SCENE_INTERACTIVE
- * @param useFixed whether to enforce the fixed yaw axis
- * @param up the axis to be fixed
- */
- CV_WRAP virtual void fixCameraYawAxis(bool useFixed, InputArray up = noArray()) = 0;
- /**
- * Sets the current camera pose
- * @param tvec translation
- * @param rot @ref Rodrigues vector or 3x3 rotation matrix
- * @param invert use the inverse of the given pose
- */
- CV_WRAP virtual void setCameraPose(InputArray tvec = noArray(), InputArray rot = noArray(),
- bool invert = false) = 0;
- /**
- * convenience method to orient the camera to a specific entity
- * @param target entity name
- * @param offset offset from entity centre
- */
- CV_WRAP virtual void setCameraLookAt(const String& target, InputArray offset = noArray()) = 0;
- /**
- * convenience method to orient an entity to a specific entity.
- * If target is an empty string the entity looks at the given offset point
- * @param origin entity to make look at
- * @param target name of target entity
- * @param offset offset from entity centre
- */
- CV_WRAP virtual void setEntityLookAt(const String& origin, const String& target, InputArray offset = noArray()) = 0;
- /**
- * Retrieves the current camera pose
- * @param R 3x3 rotation matrix
- * @param tvec translation vector
- * @param invert return the inverted pose
- */
- CV_WRAP virtual void getCameraPose(OutputArray R = noArray(), OutputArray tvec = noArray(),
- bool invert = false) = 0;
- /**
- * set intrinsics of the camera
- *
- * @param K intrinsic matrix or noArray(). If noArray() is specified, imsize
- * is ignored and zNear/ zFar can be set separately.
- * @param imsize image size
- * @param zNear near clip distance or -1 to keep the current
- * @param zFar far clip distance or -1 to keep the current
- */
- CV_WRAP virtual void setCameraIntrinsics(InputArray K, const Size& imsize,
- float zNear = -1,
- float zFar = -1) = 0;
- /**
- * render this window, but do not swap buffers. Automatically called by @ref ovis::waitKey
- */
- CV_WRAP virtual void update() = 0;
- };
- /**
- * Add an additional resource location that is search for meshes, textures and materials
- *
- * must be called before the first createWindow. If give path does not exist, retries inside
- * Ogre Media Directory.
- * @param path folder or Zip archive.
- */
- CV_EXPORTS_W void addResourceLocation(const String& path);
- /**
- * create a new rendering window/ viewport
- * @param title window title
- * @param size size of the window
- * @param flags a combination of @ref SceneSettings
- *
- * Furthermore, the behavior is controlled by the following environment variables
- * - OPENCV_OVIS_VERBOSE_LOG: print all of OGRE log output
- * - OPENCV_OVIS_RENDERSYSTEM: the name of the OGRE RenderSystem to use
- * - OPENCV_OVIS_NOVSYNC: disable VSYNC for all windows
- */
- CV_EXPORTS_W Ptr<WindowScene> createWindow(const String& title, const Size& size,
- int flags = SCENE_INTERACTIVE | SCENE_AA);
- /**
- * update all windows and wait for keyboard event
- *
- * @param delay 0 is the special value that means "forever".
- * Any positive number returns after sync to blank (typically 16ms).
- * @return the code of the pressed key or -1 if no key was pressed
- */
- CV_EXPORTS_W int waitKey(int delay = 0);
- /**
- * set the property of a material to the given value
- * @param name material name
- * @param prop @ref MaterialProperty
- * @param value the value
- */
- CV_EXPORTS_W void setMaterialProperty(const String& name, int prop, const Scalar& value);
- /// @overload
- CV_EXPORTS_W void setMaterialProperty(const String& name, int prop, const String& value);
- /**
- * set the texture of a material to the given value
- * @param name material name
- * @param prop @ref MaterialProperty
- * @param value the texture data
- */
- CV_EXPORTS_AS(setMaterialTexture) void setMaterialProperty(const String& name, int prop, InputArray value);
- /**
- * set the shader property of a material to the given value
- * @param name material name
- * @param prop property name
- * @param value the value
- */
- CV_EXPORTS_W void setMaterialProperty(const String& name, const String& prop, const Scalar& value);
- /**
- * create a 2D plane, X right, Y down, Z up
- *
- * creates a material with the same name
- * @param name name of the mesh
- * @param size size in world units
- * @param image optional texture
- */
- CV_EXPORTS_W void createPlaneMesh(const String& name, const Size2f& size, InputArray image = noArray());
- /**
- * creates a point cloud mesh
- *
- * creates a material with the same name
- * @param name name of the mesh
- * @param vertices float vector of positions
- * @param colors uchar vector of colors
- */
- CV_EXPORTS_W void createPointCloudMesh(const String& name, InputArray vertices, InputArray colors = noArray());
- /**
- * creates a grid
- *
- * creates a material with the same name
- * @param name name of the mesh
- * @param size extents of the grid
- * @param segments number of segments per side
- */
- CV_EXPORTS_W void createGridMesh(const String& name, const Size2f& size, const Size& segments = Size(1, 1));
- /**
- * creates a triangle mesh from vertex-vertex or face-vertex representation
- *
- * creates a material with the same name
- * @param name name of the mesh
- * @param vertices float vector of positions
- * @param normals float vector of normals
- * @param indices int vector of indices
- */
- CV_EXPORTS_W void createTriangleMesh(const String& name, InputArray vertices, InputArray normals = noArray(), InputArray indices = noArray());
- /// @deprecated use setMaterialProperty
- CV_EXPORTS_W void updateTexture(const String& name, InputArray image);
- //! @}
- }
- }
- #endif
|