观察者的设计,需要保证任意角度、任意位置能清晰看清物体。
设计思路: 1 坐标原点上放置一个物体,设置一个DOF为Observer。
2 场景中放置一个物体hummer,其他默认创建即可。
3 观察者的配置:
pObserver_myObserver->addChannel( pChannel );
pObserver_myObserver->addAttachment( pEnv );
pObserver_myObserver->setScene( pScene );
pObserver_myObserver->setLookFrom(pObject_hummer );
4 配置观察者:
pDofObserve为场景中心的DOF,把pObjectObserver设置为pDofObserve的孩子。
这样,观察者的位置XYZ值就可以通过pObjectObserver来设置实现;
观察者的姿态HPR值就可以通过pDofObserve来设置实现。
//设置观察者
pObjectObserver=vpObject::find("hummer");
pObjectObserver->ref();
pObjectDesktop=vpObject::find("desktop");
pObjectDesktop->ref();
//场景中心,观察者旋转点
pDofObserver=static_cast
pDofObserver->ref();
pDofObserver->push_back_child(pObjectObserver);
//设置观察者的最初状态,参考右手定则。观察者位于Y轴负轴上,俯视Y轴正轴
pObjectObserver->setTranslate(0.0, -1.50 ,0.2,false);
pDofObserver->setRotate(-20.0,-25.0,0.0,false);
pChannel->setFOVSymmetric( 38 , -1.000000f );
5 旋转到不同位置的设置
单品物体放置于坐标原点,并不进行任何的移动操作。
本质是通过操作观察者来实现位置变化和姿态旋转。
观察者位于前后左右四个位置时,会产生不同的观察效果。
这里主要是通过环境对象pEnv来改变经纬度和时间,实现光照效果的切换,
从而在四个面都能准确清晰的看清物体。
case vpWindow::KEY_LEFT:
pDofObserver->setRotateH(-1,true);
//修改纬度
R=static_cast(abs(pDofObserver->getRotateH())) % 360 ;
if ( R<=135 || R>=225 )
pEnv->setReferencePosition(0, 70);
else
pEnv->setReferencePosition(0,-40);
//修改时间
R=static_cast(pDofObserver->getRotateH()) % 360 ;
if ( (R>=45 && R<=135) || (R<=-225 && R>=-315) )
pEnv->setTimeOfDay(9);
else
pEnv->setTimeOfDay(14);
break;
效果:
正面:
右面:
后面:
左面:
整体效果还不错,解决了不同角度观察物体的问题。里面的时间和纬度还可以仔细调节,效果会更好。