觀察者的設計,需要保證任意角度、任意位置能清晰看清物體。
設計思路: 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<vsDOF *>(pObjectDesktop->find_named("Observer"));
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<int>(abs(pDofObserver->getRotateH())) % 360 ;
if ( R<=135 || R>=225 )
pEnv->setReferencePosition(0, 70);
else
pEnv->setReferencePosition(0,-40);
//修改時間
R=static_cast<int>(pDofObserver->getRotateH()) % 360 ;
if ( (R>=45 && R<=135) || (R<=-225 && R>=-315) )
pEnv->setTimeOfDay(9);
else
pEnv->setTimeOfDay(14);
break;
效果:
正面:
右面:
後面:
左面:
整體效果還不錯,解決了不同角度觀察物體的問題。裏面的時間和緯度還可以仔細調節,效果會更好。