diff --git a/modules/ovis/include/opencv2/ovis.hpp b/modules/ovis/include/opencv2/ovis.hpp index 9b39b1936..c022541a1 100644 --- a/modules/ovis/include/opencv2/ovis.hpp +++ b/modules/ovis/include/opencv2/ovis.hpp @@ -165,6 +165,16 @@ public: 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 @@ -236,6 +246,15 @@ public: */ 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 diff --git a/modules/ovis/src/ovis.cpp b/modules/ovis/src/ovis.cpp index eb194f059..761daf799 100644 --- a/modules/ovis/src/ovis.cpp +++ b/modules/ovis/src/ovis.cpp @@ -578,6 +578,36 @@ public: node.setPosition(t); } + void getEntityPose(const String& name ,OutputArray R, OutputArray tvec, bool invert) CV_OVERRIDE + { + SceneNode* node = sceneMgr->getEntity(name)->getParentSceneNode(); + Matrix3 _R; + // toOGRE.Inverse() == toOGRE + (node->getOrientation()*toOGRE).ToRotationMatrix(_R); + + if (invert) + { + _R = _R.Transpose(); + } + + if (tvec.needed()) + { + Vector3 _tvec = node->getPosition(); + + if (invert) + { + _tvec = _R * -_tvec; + } + + Mat_(3, 1, _tvec.ptr()).copyTo(tvec); + } + + if (R.needed()) + { + Mat_(3, 3, _R[0]).copyTo(R); + } + } + void getEntityAnimations(const String& name, std::vector& out) CV_OVERRIDE { SceneNode& node = _getSceneNode(sceneMgr, name); @@ -659,7 +689,7 @@ public: Entity* ent = dynamic_cast(node.getAttachedObject(name)); CV_Assert(ent && "invalid entity"); - ent->getSkeleton()->setBlendMode(static_cast(value[0])); + ent->getSkeleton()->setBlendMode(static_cast(int(value[0]))); break; } default: @@ -847,6 +877,26 @@ public: camNode->lookAt(tgt->_getDerivedPosition() + _offset, Ogre::Node::TS_WORLD); } + + void setEntityLookAt(const String& origin, const String& target, InputArray offset) CV_OVERRIDE + { + SceneNode* orig = sceneMgr->getEntity(origin)->getParentSceneNode(); + + Vector3 _offset = Vector3::ZERO; + + if (!offset.empty()) + { + offset.copyTo(Mat_(3, 1, _offset.ptr())); + } + + if(target.compare("") != 0){ + SceneNode* tgt = sceneMgr->getEntity(target)->getParentSceneNode(); + orig->lookAt(tgt->_getDerivedPosition() + _offset, Ogre::Node::TS_WORLD, Ogre::Vector3::UNIT_Z); + }else{ + orig->lookAt(_offset, Ogre::Node::TS_WORLD, Ogre::Vector3::UNIT_Z); + } + } + }; CV_EXPORTS_W void addResourceLocation(const String& path)