OSG座標問題

2021-06-30 16:36:51 字數 2977 閱讀 5395

v->push_back( osg::vec3( -1.f, 0.f, -1.f ) );

v->push_back( osg::vec3( 1.f, 0.f, -1.f ) );

v->push_back( osg::vec3( 1.f, 0.f, 1.f ) );

v->push_back( osg::vec3( -1.f, 0.f, 1.f ) );

這是乙個快速入門上面第乙個例子的部分**,將其中的頂點座標取值和opengl中的相應頂點取值比較可以猜測osg的

座標系統是x向右,y向螢幕外,z向上,也就是說osg的座標系統與opengl中的y,z互換了,不知道是不是這樣的,我問一些網友說是這樣的,但是我始終找不到官方的資料說這座標問題,所以很疑惑。

今天看快速入門最後一章乙個例子時又產生了疑惑,**如下

osgviewer::viewer viewer;

viewer.setscenedata( osgdb::readnodefile( "cow.osg" ) );

viewer.getcamera()->setprojectionmatrixasperspective( 40., 1., 1., 100. );

// 建立矩陣,指定到視點的距離。

osg::matrix trans;

trans.maketranslate( 0., 0., -12. );

// 旋轉一定角度(弧度值)。

double angle( 0. );

while (!viewer.done())

這裡感到疑惑之一是trans.maketranslate( 0., 0., -12. );

為什麼這裡改變z的座標,那麼按照我上面的osg座標來說的話,這裡是將相機向下移動了12個單位吧,為什麼不是改變y的座標呢,難道視點不是指向y的嗎?

rot.makerotate( angle, osg::vec3( 1., 0., 0. ) );

這裡也是,當我改為rot.makerotate( angle, osg::vec3( 0.,1., 0. ) );時牛不是沿y旋轉而是沿z旋轉

所以我現在得出的結論是寫頂點座標時,osg的y,z座標和opengl相反,而寫矩陣時又和opengl一致,我想應該不至於這樣吧,但是一直找不到相關的資料,希望高手解惑!!!

首先,osg的座標系是這樣的:x向右,y向螢幕裡,z向上,因此它符合右手座標系;與opengl相比,它的座標系相當於繞x軸正向逆時針旋轉了90度。這一點在osgqsg中有敘述,您可以再仔細找一下。

至於您遇到的困惑,我想主要是您混淆了三維世界和觀察矩陣的概念~~如果您希望牛能夠向下移動12個單位,同時繞x軸旋轉的話,可以給它乙個matrixtransform的父節點,並且將變換矩陣傳遞給這個matrixtransform節點。

但是在您的程式中,rot*trans的矩陣連乘操作是針對場景的主攝像機,即:

viewer.getcamera()->setviewmatrix( rot * trans );

那麼也就是說,您修改的是攝像機的觀察矩陣:即,在攝像機座標系中,三維世界相對於攝像機的位置。

攝像機座標系是由setprojectionmatrixasperspective決定的,也就是說,您的攝像機採用透視投影的方式,因此它面向xy平面,視野夾角40度,原點與世界原點暫時是重合的。(此時如果直接執行程式,可以看到一片黑,因為攝像機完全在牛模型的體內)

然後,三維世界沿著z負方向移動了12個單元,此時您可以看見牛了。

之後,您選擇沿x方向旋轉三維世界(此處也就是旋轉牛),由於攝像機面對著xy平面(y向上),所以模型相當於橫著滾動。此時請不要再用世界座標系來理解您看到的景象了,因為有透視投影的關係,攝像機本身已經是面對xy平面的~~osg的世界座標系並沒有發生任何變化

y的方向是向裡的,這一點您可以做實驗來驗證。三維**系統的座標系和真實世界一樣,都是右手座標系。除此之外,請一定相信osg和opengl的矩陣運算方法之間沒有任何矛盾之處,這個座標系的偏差也不會對場景的運算產生任何影響。因此請不要單純地用y/z互換來解釋您看到的現象,最起碼來說,osg和opengl的座標系y/z軸是不能互換的,兩者相差了90度!

這裡關鍵的問題是setviewmatrix函式到底做了什麼:它的作用並非是讓攝像機運動!而是讓整個三維世界·按照攝像機座標系(而非絕對座標系)·實現運動

那麼,攝像機座標系是由誰來定義的呢?顯然它不應當與世界座標系重合。我的理解是視點的變換改變了攝像機座標系的旋轉姿態,就如同自然世界中的我們不改動相機三腳架位置,而僅僅是調整相機使其對準某個方向一樣。所謂的透視投影矩陣,其作用同樣是調整視點,對於osg來說,也就是改變攝像機座標系的旋向。

「可以通過旋轉和平移來改變函式gluperspective建立的視景體的朝向,如果不進行這些變換,視點將位於原點,視線指向z軸負方向」。

這也就是我為什麼說「攝像機座標系是由setprojectionmatrixasperspective決定的,它面向xy平面」的原因。

如果您能夠同意我對於攝像機座標系的詮釋。那麼後面的問題就迎刃而解了,請參閱我第一次回帖中的解釋。

不論是opengl還是osg,都採用是右手系,

opengl座標系,即z軸正向朝外;y軸正向朝上;x軸正向朝右.

osg座標系,即z軸正向朝上;y軸正向朝前;x軸正向朝右.

可以這麼來說,將opengl座標係沿x軸沿前下方旋轉90度,即osg的預設座標系.

這跟directx是不一樣的,directx採用左手座標系,即z軸正向朝里;y軸正向朝上;x軸正向朝右.

在viewer.getcamera()->setprojectionmatrixasperspective( 40., 1., 1., 100. );之前,

osg::vec3 veceye, veccenter, vecup;

採用viewer.getcamera()->getviewmatrixaslookat(veceye, veccenter, vecup);

可以看到:

veceye = ;

veccenter = ;

vecup = ;

由此可以看出在設定透視之前,鏡頭是對準xoy平面的。

osg場景座標

osg三維世界中,會使用到幾個不同的座標系統,下面會講解幾個常用概念,通過使用照相機拍照的過程進行模擬 這個過程就相當於我們拍照時調整被拍攝物體的位置和姿態以及調整相機的位置和姿態。物體的位置和姿態成為模型變換 相機的位置和姿態稱為視點變換,這兩種變換在一起統稱為模型視點變換。在拍攝乙個物體的時候,...

OSG座標系解釋????????

對於下面的 選自 osg海軍教程 第十課第一節 使用自定義矩陣來放置相機,但資料有更改 tankxform setposition osg vec3 0,60,8 相機位於坦克後方60個單元,上方7個單元。t.maketranslate 0,0,15 沿z平移 15 a r t 設r是繞y軸旋轉 2...

osg座標系理解

對於下面的 選自 osg海軍教程 第十課第一節 使用自定義矩陣來放置相機,但資料有更改 相機位於坦克後方60個單元,上方7個單元。tankxform setposition osg vec3 0,60,8 t.maketranslate 0,0,15 沿z平移 15 a r t 設r是繞y軸旋轉 2...