觀察者的設計,需要保證任意角度、任意位置能清晰看清物體。
設計思路: 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(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(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;
效果:
正面:
右面:後面:
左面:
整體效果還不錯,解決了不同角度觀察物體的問題。裡面的時間和緯度還可以仔細調節,效果會更好。
adapter中的觀察者模式
adapter中的觀察者模式 什麼是觀察者模式 觀察者模式所涉及的角色有 抽象主題 subject 角色 抽象主題角色把所有對觀察者物件的引用儲存在乙個聚集 比如arraylist物件 裡,每個主題都可以有任何數量的觀察者。抽象主題提供乙個介面,可以增加和刪除觀察者物件,抽象主題角色又叫做抽象被觀察...
js中的觀察者模式
如下實現乙個通用發布者 定義發布者物件.是定義乙個物件 var publisher subscribe function fn,type this.subscribers type push fn unsubscribe function fn,type publish function publi...
php中的觀察者模式
當乙個物件狀態發生改變後,會影響到其他幾個物件的改變,這時候可以用觀察者模式。像wordpress這樣的應用程式中,它容外部開發組開發外掛程式,比如使用者授權的部落格統計外掛程式 積分外掛程式,這時候可以應用觀察者模式,先註冊這些外掛程式,當使用者發布一篇博文後,就回自動通知相應的外掛程式更新。觀察...