@@ -23,8 +23,7 @@ static const char* RENDERSYSTEM_NAME = "OpenGL 3+ Rendering Subsystem";
23
23
static std::vector<String> _extraResourceLocations;
24
24
25
25
// convert from OpenCV to Ogre coordinates:
26
- // rotation by 180° around x axis
27
- static Matrix3 toOGRE = Matrix3(1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , -1 );
26
+ static Quaternion toOGRE (Degree(180 ), Vector3::UNIT_X);
28
27
static Vector2 toOGRE_SS = Vector2(1 , -1 );
29
28
30
29
WindowScene::~WindowScene () {}
@@ -48,15 +47,12 @@ void _createTexture(const String& name, Mat image)
48
47
texMgr.loadImage (name, RESOURCEGROUP_NAME, im);
49
48
}
50
49
51
- static void _convertRT (InputArray rot, InputArray tvec, Quaternion& q, Vector3& t,
52
- bool invert = false , bool init = false )
50
+ static void _convertRT (InputArray rot, InputArray tvec, Quaternion& q, Vector3& t, bool invert = false )
53
51
{
54
52
CV_Assert (rot.empty () || rot.rows () == 3 || rot.size () == Size (3 , 3 ),
55
53
tvec.empty () || tvec.rows () == 3 );
56
54
57
- // make sure the entity is oriented by the OpenCV coordinate conventions
58
- // when initialised
59
- q = init ? Quaternion (toOGRE) : Quaternion::IDENTITY;
55
+ q = Quaternion::IDENTITY;
60
56
t = Vector3::ZERO;
61
57
62
58
if (!rot.empty ())
@@ -74,7 +70,7 @@ static void _convertRT(InputArray rot, InputArray tvec, Quaternion& q, Vector3&
74
70
75
71
Matrix3 R;
76
72
_R.copyTo (Mat_<Real>(3 , 3 , R[0 ]));
77
- q = Quaternion (toOGRE * R);
73
+ q = Quaternion (R);
78
74
79
75
if (invert)
80
76
{
@@ -85,7 +81,6 @@ static void _convertRT(InputArray rot, InputArray tvec, Quaternion& q, Vector3&
85
81
if (!tvec.empty ())
86
82
{
87
83
tvec.copyTo (Mat_<Real>(3 , 1 , t.ptr ()));
88
- t = toOGRE * t;
89
84
90
85
if (invert)
91
86
{
@@ -124,6 +119,10 @@ static SceneNode& _getSceneNode(SceneManager* sceneMgr, const String& name)
124
119
try
125
120
{
126
121
mo = sceneMgr->getMovableObject (name, " Camera" );
122
+
123
+ // with cameras we have an extra CS flip node
124
+ if (mo)
125
+ return *mo->getParentSceneNode ()->getParentSceneNode ();
127
126
}
128
127
catch (ItemIdentityException&)
129
128
{
@@ -281,12 +280,14 @@ class WindowSceneImpl : public WindowScene
281
280
cam->setNearClipDistance (0.5 );
282
281
cam->setAutoAspectRatio (true );
283
282
camNode = sceneMgr->getRootSceneNode ()->createChildSceneNode ();
283
+ camNode->setOrientation (toOGRE);
284
284
camNode->attachObject (cam);
285
285
286
286
if (flags & SCENE_INTERACTIVE)
287
287
{
288
288
camman.reset (new OgreBites::CameraMan (camNode));
289
289
camman->setStyle (OgreBites::CS_ORBIT);
290
+ camNode->setFixedYawAxis (true , Vector3::NEGATIVE_UNIT_Y);
290
291
}
291
292
292
293
if (!app->sceneMgr )
@@ -356,7 +357,7 @@ class WindowSceneImpl : public WindowScene
356
357
357
358
Quaternion q;
358
359
Vector3 t;
359
- _convertRT (rot, tvec, q, t, false , true );
360
+ _convertRT (rot, tvec, q, t);
360
361
SceneNode* node = sceneMgr->getRootSceneNode ()->createChildSceneNode (t, q);
361
362
node->attachObject (ent);
362
363
}
@@ -387,8 +388,10 @@ class WindowSceneImpl : public WindowScene
387
388
388
389
Quaternion q;
389
390
Vector3 t;
390
- _convertRT (rot, tvec, q, t, false , true );
391
+ _convertRT (rot, tvec, q, t);
391
392
SceneNode* node = sceneMgr->getRootSceneNode ()->createChildSceneNode (t, q);
393
+ node = node->createChildSceneNode ();
394
+ node->setOrientation (toOGRE); // camera mesh is oriented by OGRE conventions by default
392
395
node->attachObject (cam);
393
396
394
397
RealRect ext = cam->getFrustumExtents ();
@@ -410,7 +413,7 @@ class WindowSceneImpl : public WindowScene
410
413
411
414
Quaternion q;
412
415
Vector3 t;
413
- _convertRT (rot, tvec, q, t, false , true );
416
+ _convertRT (rot, tvec, q, t);
414
417
SceneNode* node = sceneMgr->getRootSceneNode ()->createChildSceneNode (t, q);
415
418
node->attachObject (light);
416
419
}
@@ -430,7 +433,7 @@ class WindowSceneImpl : public WindowScene
430
433
SceneNode& node = _getSceneNode (sceneMgr, name);
431
434
Quaternion q;
432
435
Vector3 t;
433
- _convertRT (rot, tvec, q, t, invert, true );
436
+ _convertRT (rot, tvec, q, t, invert);
434
437
node.setOrientation (q);
435
438
node.setPosition (t);
436
439
}
@@ -539,40 +542,33 @@ class WindowSceneImpl : public WindowScene
539
542
540
543
void fixCameraYawAxis (bool useFixed, InputArray _up)
541
544
{
542
- Vector3 up = Vector3::UNIT_Y ;
545
+ Vector3 up = Vector3::NEGATIVE_UNIT_Y ;
543
546
if (!_up.empty ())
544
547
{
545
548
_up.copyTo (Mat_<Real>(3 , 1 , up.ptr ()));
546
- up = toOGRE * up;
547
549
}
548
550
549
- Camera* cam = sceneMgr->getCamera (title);
550
- cam->getParentSceneNode ()->setFixedYawAxis (useFixed, up);
551
+ camNode->setFixedYawAxis (useFixed, up);
551
552
}
552
553
553
554
void setCameraPose (InputArray tvec, InputArray rot, bool invert)
554
555
{
555
- Camera* cam = sceneMgr->getCamera (title);
556
-
557
- SceneNode* node = cam->getParentSceneNode ();
558
556
Quaternion q;
559
557
Vector3 t;
560
- _convertRT (rot, tvec, q, t, invert, true );
558
+ _convertRT (rot, tvec, q, t, invert);
561
559
562
560
if (!rot.empty ())
563
- node ->setOrientation (q);
561
+ camNode ->setOrientation (q*toOGRE );
564
562
565
563
if (!tvec.empty ())
566
- node ->setPosition (t);
564
+ camNode ->setPosition (t);
567
565
}
568
566
569
567
void getCameraPose (OutputArray R, OutputArray tvec, bool invert)
570
568
{
571
- Camera* cam = sceneMgr->getCamera (title);
572
- SceneNode* node = cam->getParentSceneNode ();
573
-
574
569
Matrix3 _R;
575
- node->getOrientation ().ToRotationMatrix (_R);
570
+ // toOGRE.Inverse() == toOGRE
571
+ (camNode->getOrientation ()*toOGRE).ToRotationMatrix (_R);
576
572
577
573
if (invert)
578
574
{
@@ -581,20 +577,18 @@ class WindowSceneImpl : public WindowScene
581
577
582
578
if (tvec.needed ())
583
579
{
584
- Vector3 _tvec = node ->getPosition ();
580
+ Vector3 _tvec = camNode ->getPosition ();
585
581
586
582
if (invert)
587
583
{
588
584
_tvec = _R * -_tvec;
589
585
}
590
586
591
- _tvec = toOGRE.Transpose () * _tvec;
592
587
Mat_<Real>(3 , 1 , _tvec.ptr ()).copyTo (tvec);
593
588
}
594
589
595
590
if (R.needed ())
596
591
{
597
- _R = toOGRE.Transpose () * _R;
598
592
Mat_<Real>(3 , 3 , _R[0 ]).copyTo (R);
599
593
}
600
594
}
@@ -607,18 +601,16 @@ class WindowSceneImpl : public WindowScene
607
601
608
602
void setCameraLookAt (const String& target, InputArray offset)
609
603
{
610
- SceneNode* cam = sceneMgr->getCamera (title)->getParentSceneNode ();
611
604
SceneNode* tgt = sceneMgr->getEntity (target)->getParentSceneNode ();
612
605
613
606
Vector3 _offset = Vector3::ZERO;
614
607
615
608
if (!offset.empty ())
616
609
{
617
610
offset.copyTo (Mat_<Real>(3 , 1 , _offset.ptr ()));
618
- _offset = toOGRE * _offset;
619
611
}
620
612
621
- cam ->lookAt (tgt->_getDerivedPosition () + _offset, Ogre::Node::TS_WORLD);
613
+ camNode ->lookAt (tgt->_getDerivedPosition () + _offset, Ogre::Node::TS_WORLD);
622
614
}
623
615
};
624
616
0 commit comments