對於下面的**(選自《osg海軍教程》第十課第一節 使用自定義矩陣來放置相機,但資料有更改):
tankxform->setposition( osg::vec3(0,60,8) );
// 相機位於坦克後方60個單元,上方7個單元。
t.maketranslate(0, 0,15 );//
沿z平移+15
a= r * t;//
設r是繞y軸旋轉+20度的矩陣
c= osg::matrixf:: makerotate( -m_pi/2.0, 1, 0, 0 )//c
是繞x軸旋轉-90度
while( !viewer.done() )
在底層,最終全是opengl座標系(y向上)。設a的逆為a~,mv= a~* c,而最終顯示效果使用的是mv~=( a~* c)~=c~*a=c~*(r*t),即(繞x軸轉+90度*繞y軸轉+20度*沿z平移15),則新的視點位置v
』=v*mv~
,使用的是行向量,即從後往前對視點座標系進行變換,即將視點座標係先沿z平移15,再繞y軸轉+20度,最後繞x軸轉+90度。《這就像是opengl中分別通過gltranslatef、glrotatef對當前區域性座標系進行變換:v
』=t*r*v,
表明是先對區域性座標系平移(即t),再對區域性座標系旋轉(即r)。v
』=t*r*v
也可以想象成是單純的點v在世界座標系中的座標變化,要注意的是點v沒有區域性座標系,只有乙個固定的世界座標系,點v的每次變化都是以這個固定的世界座標係為參考
》。如圖:
上圖中,綠色的xyz座標軸是標準的opengl座標軸,先沿z平移15,再繞y軸轉+20度,變成黑色的xryrzr座標系,再繞x軸轉90度,變成最終的紅色,x』y
』z』座標系,此時視線(藍色的線)朝z
』軸負向。在底層始終是opengl座標系,但上層我們看到的效果是:在z
向上的座標系下,把視點移動到z=15處,看下方z=8、前方y=60的坦克。
特別注意:camera::setviewmatrix()
只改變視點座標系
(包括視點的座標),其他座標系不變,仍是opengl座標系。而且setviewmatrix
(mv)
最終顯示的是mv的逆矩陣得到的效果,所以一定要注意。可以這樣:
setviewmatrix
(inverse(a)*
繞x軸旋轉-90度
),這樣可以把a看作是matrixmanipulator的z向上的座標系(即z向上,y向里,視線朝y軸正向)。且可看作是在z向上的座標系下(
視線為y軸正向,即垂直xz平面朝里),把視點按a變換,且此時,而且外面的一些變換也可以看作是z向上的座標系,如tankxform->setposition( osg::vec3(0,60,8) );此時相當於是在z軸正向上移動了8,即往上移動了8,且在y軸上移動了60,即朝內移動60。
記住:上面的只是看作(想像)z向上的座標系,實質仍是opengl座標系
,可只用opengl座標系來看,以免出錯。
總結:(1)對setviewmatrix(a~),可以這樣分析:視點v和幾何體座標點p都在opengl座標下,且對視點進行a(連同視點的區域性opengl座標系)變換,然後看點p在a的視線上的位置。
(2)viewer.getcamera()->setviewmatrix(osg::matrixf::inverse(osg::matrix::rotate(osg::pi/2.0, 1, 0, 0 ) *r * t ));則可以把視點v和幾何體座標點p都放在osg座標下,且對視點r * t變換。
osg座標系理解
對於下面的 選自 osg海軍教程 第十課第一節 使用自定義矩陣來放置相機,但資料有更改 相機位於坦克後方60個單元,上方7個單元。tankxform setposition osg vec3 0,60,8 t.maketranslate 0,0,15 沿z平移 15 a r t 設r是繞y軸旋轉 2...
osg 相機座標系
先看這個例子 include include include include int main int argc,char argv return 0 1 程式執行結果 將相機設定到世界座標系 0,0,12 的位置,向下看牛。同時,牛繞著x軸自傳。2 解說 相機座標系,和opengl的相機座標系一致...
大地座標系 地理座標系 投影座標系
大地座標系 是大地測量中以參考橢球面為基準面建立起來的座標系。地面點的位置用 大地經度 大地緯度和大地高度 表示。大地座標系的確立包括選擇乙個橢球 對橢球進行定位和確定大地起算資料。乙個形狀 大小和定位 定向都已確定的地球橢球叫參考橢球。參考橢球一旦確定,則標誌著大地座標系已經建立。大地座標系是一種...