VP中單品展示時觀察者的設置

觀察者的設計,需要保證任意角度、任意位置能清晰看清物體。

設計思路: 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;

                   效果:

                         正面:

                              

右面:

      

後面:

       

左面:

      

         整體效果還不錯,解決了不同角度觀察物體的問題。裏面的時間和緯度還可以仔細調節,效果會更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章