常見問題解答

作者: osgChina 發布于2018-10-16 11:14:24 分類 : 支持

關于OSG更多常見問題解答可以在下面找到

問題

1.  一般 

  1. 我不知道OpenSceneGraph是什么,你能給我一個短...

  2. OpenSceneGraph支持哪些平臺?

  3. OpenSceneGraph支持什么渲染器(OpenGL,DirectX,...)?

  4. 在哪里可以獲得更多的信息OpenSceneGraph?

  5. 什么背景知識是必需的/有用的,如果我想使用...

  6. OpenSceneGraph和OpenSG有什么區別?

2. 文檔 

  1. 有沒有關于OSG的書籍?

  2. 有教程嗎?

  3. .osg文件格式的參考手冊在哪里?

3. 網站

  1. 如何編輯網站頁面?

  2. 如何添加新的網站頁面?

4. 建筑/安裝

  1. 有二進制發行版嗎?

  2. 我不使用MS Visual Studio,OpenSceneGraph支持其他...

  3. 幫幫我!VisualStudio將不會加載OSG項目文件

  4. 一切都編譯,但有鏈接問題或當我運行...

5. 功能/特性

  1. OpenSceneGraph的相機類在哪里?

  2. 如何在OSG中渲染地形?

  3. 我不能得到GLUT工作或GLUT不提供功能X

  4. 是否支持骨骼動畫?

  5. OpenSceneGraph支持哪些文件格式?

  6. OpenSceneGraph有本機文件格式嗎?

  7. 有OSG可以讀取我的樣本文件嗎?

  8. 我可以直接在OSG中使用OpenGL命令嗎?

  9. 是否有可能在2D中渲染一個場景?

  10. 在場景中如何移動模型?

  11. Qt和其他GUI框架有適配器可用在contribs。是...

  12. 如何在.osg文件中插入注釋?或者我如何注釋掉...

6. 開發  - 一般

  1. 什么是這些ref_ptr <>我在代碼中看到的東西?

  2. 為什么OSG頭文件沒有.h或.hpp擴展名?

  3. 我可以做什么,使我的編輯器將OSG標頭識別為C ++文件?

  4. 如何增加我的程序的詳細程度以進行調試?

  5. 我可以獲得CVS或Subversion訪問,以便我可以保持最新的...

  6. 我不喜歡使用C ++,是否有其他語言的封裝容器...

  7. 我如何貢獻OpenSceneGraph?

  8. 開發 - 特定于Windows

  9. 當我嘗試將一個節點保存到文件時,OSG崩潰。我使用Windows。OR?...

  10. 我得到了許多警告沿著...的行...警告C4541:...

  11. 如何在.NET控件中嵌入OSG查看器?

8. 問題 

  1. 怎么來的山在懸掛滑翔機演示是完全白色沒有...

  2. 為什么OSG似乎忽略我的近/遠剪裁平面?

  3. 如果我讓OpenSceneGraph計算我的近和遠剪輯平面,如何...

  4. 我試圖在Mac OS / X下運行OpenSceneGraph示例程序,但沒有...

  5. 嘿,這個粒子系統很酷,但看起來很奇怪,當我把它放在...

  6. 我有一個問題使用PrimitiveSet來表示單個點...

  7. 當我在一個應用縮放因子...

  8. 我可以在現有渲染器中使用OSG嗎?

  9. 我從osg :: Drawable派生一個類,但它的drawImplementation()...

  10. 如何獲取加載的Node或3D模型的BoundingBox?

  11. 當使用多個查看器和/或多個渲染窗口時,我很奇怪...

  12. 我有兩個或更多的視圖共享一個場景圖,但我想限制什么...

  13. 上一個問題 - 是的,但....它沒有工作!

  14. 如何捕獲screengrab?

  15. 為什么我的幀速率下降,當點精靈到一個FBO / pbuffer?

  16. 為什么我的幾何渲染不透明,而我有透明的顏色和/或...

  17. 我寫了一個包含粒子系統的場景到.ive文件,但有些...

9. 舊版本的OpenSceneGraph 

  1. 在編譯期間我得到關于Producer / *的錯誤:沒有這樣的文件或目錄...

  2. 我可以使用OSG沒有生產者,和/或已經創建的MFC或...

  3. 如何在運行時更改生產者圖標?

10. 數學,矩陣,向量,四元數 

  1. 在...中的矩陣,向量和四元數類型的乘法順序是什么?

  2. 我有另一個問題沒有回答這里... 

 


一般

我不知道什么是OpenSceneGraph,你可以給我一個簡短的描述嗎?

它是一個C ++程序員的3D圖形庫。場景 庫允許你使用圖形數據結構代表一個場景中的對象,它允許你將共享一些共同屬性的對象組織在一起,這樣你就可以在一個地方為整個組設置通用屬性。而且OpenSceneGraph可用于自動管理一些像細節層次的事情,繪制那些必要的細節,而不繪制沒有必要的,這樣就不會拖慢圖形硬件繪制場景的速度。

OpenSceneGraph支持哪些平臺?

Microsoft Windows(2000,XP,Vista),GNU / Linux和MacOS / X是目前支持最好的系統。 而對Solaris,IRIX,...這些系統并不支持。

OpenSceneGraph支持哪些渲染引擎(如OpenGL,DirectX等)?

OpenSceneGraph只支持通過OpenGL渲染。事實上,很多在庫中的類都僅僅是OpenGL的面向對象版本。

我在哪里可以得到更多的關于OpenSceneGraph的信息?

試試這些:

  •  看看官方主頁http://www.openscenegraph.org/(此FAQ位于那里)

  •  加入郵件列表,特別是“OSG用戶”。請參見郵件列表獲取更多信息。

  •  通過引用計數進行內存管理。請參閱下面的相關問題,在“開發-常規”

  •  使用設計模式,如遍歷器模式(Visitor和觀察者模式(Observer

  •  默認情況下,OpenSceneGraph自動管理裁剪平面,充分利用Z緩沖的精度。這意味著,任何企圖手動設置遠近裁剪面的都將失敗,因為該值將被覆蓋。

  •  默認情況下,OpenSceneGraph使用小特征剔除,這意味著當一個對象當前視圖中非常小時(約幾個像素),它會被裁剪

  •  在OSG矩陣使用左乘向量,如V'= V * M1 * M2。這是最明顯的與計算機圖形學的教科書描述不同的點

  •  OpenSceneGraph 提供對很多3D和圖像文件格式的讀取支持,但是OpenSG支持少得多

  •  OpenSceneGraph 發展更加積極(至少,通過OpenSG的發行數量來看),并可能有更活躍的用戶社區

  •  OpenSG多線程場景圖的操作支持的更好,這是原始設計目標之一

  •  OpenSG有更好的集群渲染支持,雖然使用OpenSceneGraph自己建立也并不困難

  •  VisualStudio:OSG源碼包含了一個OSG / PlatformSpecifics / Windows目錄中的文件

  •  VIm:可以在每個頭文件的開頭識別模式字符串“ - * - c ++ - * - ”。啟動vim。鍵入“:set runtimepath”以查看vim在哪里尋找腳本。您可以在任何這些目錄中創建文件(例如,Linux上的?/ .vim)。創建目錄,如果它不存在,并在該目錄中創建一個名為scripts.vim的文件。這里是該文件的內容:

  •  

  •  Emacs:應該立即識別模式字符串。

  •  Nedit:可以告訴將文件視為C ++基于它們在include目錄中的位置

  •  Dev-C ++:在工具/編輯器選項/一般有一個選項“使用語法高亮”。在下面的框中添加;; 。最后一行看起來是這樣c; cpp; h; hpp ;; 。這將使所有文件中的語法高亮無擴展名。

什么背景知識是必需的/有用的,如果我想用 OpenSceneGraph工作?

由于OSG是用C ++寫的,你需要能使用該語言編程。

看OSG的一種方法是把它當作OpenGL的一個面向對象的封裝。這其實是一種過于簡單的觀點,因為OSG做了很多不僅僅是發送你的OpenGL命令。但是,確實有必要學習OpenGL的工作原理,以便更好的使用OpenSceneGraph使用OSG時,任何你之前知道的OpenGL知識是有價值的。很多人從剛剛開始接觸OpenSceneGraph時遇到的問題際上是有關OpenGL的基本問題。

還有一些新人感興趣的關于OSG其他主題包括:

對于那些已經熟悉(實時)3D渲染,但不了解OSG的小伙伴,某些功能變成常見的陷阱:

OpenSceneGraph和OpenSG有什么區別

他們是不同的場景圖形庫,雖然OpenSG也似乎在他們的代碼中使用“OSG”前綴,這可能是有些混亂的根源。兩者目標和功能上的區別

OpenSG網站提供了兩者之間的比較:http://opensg.vrsource.org/trac/wiki/OSGComparison

文檔

有可用的關于OSG的書籍嗎?

http://www.osgbooks.com 

這些書都在不斷修訂之中,以跟上OSG的變化。購買書籍幫助資助這方面的努力。更多OSG的書籍,不僅僅是修訂,計劃在未來推出

是否有教程可用?

是的,看這里 

哪里有關于.osg文件格式的參考手冊?

還沒有場景描述語言的文檔(目前沒有)。 可以參考OSG的源代碼(UseTheSourceLuke!? ),特別是在源分布在src / osgPlugins / OSG目錄下的文件。

對于任何有OpenGL和OSG類知識的任何人,.osg格式應該很容易理解。

網站

我怎么能編輯網站的頁面?

本網站需要登錄(見 錄)。請注意,某些頁面只能由管理員進行編輯,包括主頁,項目新聞和下載部分的所有頁面。

我如何添加一個新的網站頁面?

可以首先創建一篇新的文章就可以添加新的一頁了。這可以使用遞交文章 菜單鍵完成。你應該遵循作者指導

 

構建 /安裝

是否有二進制分發可用?

是的,但僅適用于Windows。對于Linux,你需要自己構建OSG或檢查你的Linux發行版是否有OSG包。在Mac OS / X,你需要自己構建OSG。

我沒有 使用微軟的Visual StudioOpenSceneGraph是否支持其他編譯器,如mingw32?

在Cygwin和Mingw的發行版中有一個版本,但是它主要由OSG用戶郵件列表中用戶支持。

幫幫我!VisualStudio無法加載OSG項目文件

如果輸出信息為"This makefile was not generated by Developer Studio",是因為.DSP文件因為某種原因被保存為Unix風格的結尾。您可以通過多種方法解決此問題。建議包括:使用寫字板打開和保存.DSP,使用cygwin的工具unix2dos,或者使用Winzip日常壓縮包(檢查在選項 - >配置 - >其他“TAR文件智能CR / LF轉換”之后)。

編譯 完成后出現連接問題或當我運行我的OSG應用程序時出現崩潰

在Linux上,嘗試“make clean”,然后選擇“make”。在Windows上做清除并構建操作。此問題有時是因為API的改變或一個項目設置引起/庫已被更改。做清除并重新編譯即可解決問題。

鏈接錯誤也常常是因為在Visual Studio中省略庫造成的。轉到項目- >設置,在鏈接選項卡檢查下每一個要使用的.dll文件,以及在“對象/庫模塊”下對應的.lib文件。為了鏈接到內核調試庫,osgd.dll,osgd.lib需要被加入。這些庫的搜索路徑是在工具- >選項- >目錄。

在Linux上,你可能需要添加一個到/etc/ld.so.conf.d/的入口,并運行ldconfig命令,或者設置LD_LIBRARY_PATH包含您安裝OSG庫的位置。

 

功能/特性

OpenSceneGraph的攝像機類在哪里

核心OpenSceneGraph的庫提供一個osg::Camera類,它提供各種在場景中捕獲圖片的控制,作為觀察器的一部分或作為場景視圖的一部分做紋理渲染效果,如陰影,反射等。osg::Camera定義在OpenSceneGraph /include/osg/Camera。

我如何OSG渲染地形?

OSG現在具有osgTerrain NodeKit用于渲染地形,并且多線程分頁系統可以被單獨使用,或者結合使用用于渲染大地形數據庫。同伴項目VirtualPlanetBuilder可用于構建大規模縮放分頁數據庫,包括字節縮放整個地球地理空間數據庫,并直接輸出OpenSceneGraph的原生的二進制格式。

如果你想使用連續細節級別的方法見Demeter (http://www.terrainengine.com/ )和虛擬地形項目(http://www.vterrain.org/)中詳細的開源方法。

我不能讓GLUT工作或GLUT沒有提供特征量。

你還是使用wxWidgets(http://www.wxwidgets.org/ )或者Simple Direct Media Layer(http://www.libsdl.org/)更好。兩者都是開源并提供OpenGL渲染平臺,使OSG可以很好的工作。

是否有骨骼動畫支持?

查看osgCal它集成了Cal3D與OSG,看這里http://osgcal.sourceforge.net/

OpenSceneGraph 支持哪些文件格式?

文件的輸入輸出是通過源代碼src / osgPlugins目錄下的插件支持。查看Support/UserGuides/Plugins 中的可用的插件,以及他們的支持的文件格式和讀/寫功能。

請注意,某些插件的依賴的外部庫需要安裝!剛剛開始使用OSG時一個很常見的問題是,為什么一些插件(比如用于讀取JPEG圖像的插件)不可用。大多數時候,缺少的插件是因為在OSG的構建過程中缺少依賴信息造成的。CMake構建工具需要知道插件的依賴頭文件和庫的路徑,如libjpeg,libtiff,GDAL等。特別是在Windows上,在文件系統中沒有庫的標準路徑。

一些其他的文件格式可以被Virtual Terrain Project(http://www.vterrain.org/ )支持。

 OpenSceneGraph 是否具有 本機文件格式?

OpenSceneGraph  -3.0開始,我們有基于通用序列化程序的可擴展和支持向前/向后兼容性的新的本機文件格式,.osgt ascii文本文件格式,.osgx xml格式和.osgb二進制格式。新格式的可擴展性使最終用戶應用程序能夠為自己的類添加序列化包裝器,從而能夠根據自己的應用需要擴展格式。

OpenSceneGraph  -3.0之前有兩個本地文件格式,.osg ASCII文件和.ive二進制文件。.osg格式具有可擴展性和靈活性,但速度較慢,而且沒有.ive二進制格式緊湊。但后者由于不向前兼容并且不可擴展,所以僅適用于最終用戶應用程序不需擴展的場景圖形。

有OSG可以讀取的樣本文件 供我搗鼓嗎?

是的,有一個示例數據集。實際上,OSG發行版中包含的一些示例取決于它們是否安裝。請參閱Downloads/SampleDatasets .

我可以直接在OSG使用OpenGL命令了嗎?

是的。參見源碼中包括的osgteapot示例。

是否可以渲染2D場景?

可以一下examples/osghud/osghud.cpp。這個例子創建了一個用于查看3D場景的子圖形,另一個圖形與osg :: Projection&osg :: MatrixTransform節點一起設置用于在3D圖像上繪制2D場景的正交視圖。

在場景中如何移動模型?

將相關的節點添加到osg :: Transform(作為子節點)。這允許您通過更改變換矩陣來移動您的場景模型。看看osgreflect示例,它使用了osg :: MatrixTransform?以創建模型的鏡像。

Qt 和其他GUI圖形框架都有貢獻可用的適配器,Gnome/GTK+是否也有提供?

看看OSGEdit源代碼(http://www.sf.net/projects/osgedit)。它包含一個GTK事件適配器(在OSGEdit應用程序源代碼中實現的一個C ++類,它將事件從GTK +適配到osgGA通用事件框架)。

我要如何 .osg 文件中插入注釋?或者在 .osg文件中的注釋一塊內容?

由于允許擴展的.osg解析器的性質,可以通過簡單地這樣做在.osg文件中插入注釋:

Comment {
        This file is proprietary and you shoudn't be reading it.
        Please close your editor now!
        -Microsoft}

你也可以用它來注釋掉文件的部分:

Comment {
        TexGen {
                UniqueID TexGen_4
                DataVariance? STATIC
                mode SPHERE_MAP=]
        }
}

開發  - 常規

在代碼中隨處可見的ref_ptr<> 是什么鬼?

OSG使用引用計數作為其基本內存管理策略。 場景圖中的所有節點類(osg :: Node的子類)和許多其他類也是從osg :: Referenced派生的,它保存一個引用計數(一個整數)。直接使用指向osg :: ref_ptr <>實例的指針現在如何更新osg :: Referenced實例的引用計數,取決于有多少個osg :: ref_ptr <>實例保存了osg :: Referenced實例。實例將長期保持活動,因為其引用計數的更改不會使計數變為零,這意味著至少有一個osg :: ref_ptr <>仍指向實例。只有當最后一個osg :: ref_ptr <>被刪除時,引用計數將達到零,并且實例將被刪除。

使用OSG :: ref_ptr <>的基本用法

osg::ref_ptr<osg::Group> group = new osg::Group();
// The osg::ref_ptr instance will manage the pointer to the osg::Group

代替

osg::Group* group = new osg::Group();

有關使用ref_ptr及其詳細信息的詳細概述,請參閱http://andesengineering.com/OSG_ProducerArticles/RefPointers/RefPointers.html

為什么OSG頭文件沒有.h或.hpp擴展名?

簡短的回答是,這是標準C ++的命名頭。有關更多信息,請參閱osg-users郵件列表上的這些帖子:

http://thread.gmane.org/gmane.comp.graphics.openscenegraph.user/26136

http://osgcvs.no-ip.com/osgarchiver/archives/July2003/0575.html

我可以做什么,使我的編輯器將OSG標頭識別為C ++文件?

方法取決于您的編輯器和平臺:

if getline(1) =~ '-*-c++-*-'
set filetype=cpp
endif

如何提高調試信息的詳細程度?

您可以使用OSG_NOTIFY_LEVEL環境變量來指定一定級別的調試信息。這里是級別,從低到高(取自include / osg / Notify):

ALWAYS
FATAL
WARN
NOTICE
INFO
DEBUG_INFO
DEBUG_FP

默認級別為NOTICE。例如將OSG_NOTIFY_LEVEL設置為INFO將生成更多輸出。

我可以獲得CVS或Subversion訪問,以便我可以隨時更新最新的開發源?

是。OSG源可通過Subversion獲得。請參閱有關如何設置SVN訪問OpenSceneGraph的開發版本的文檔。

我不喜歡使用C ++。有沒有包裝器可用于其他語言,如Lua?

是的,請參閱 Community/LanguageWrappers。注意,這些包裝器都不是官方發行的一部分,因此由外部各方維護。它們在成熟度上也不同。

我如何向OpenSceneGraph貢獻自己的力量?

將更改作為整個文件以及更改的說明發送到osg提交郵件列表。不要在電子郵件發送差異或復制和粘貼摘錄,這些將被簡單地廢除,因為它們對于審查和合并太不可靠。有關所有詳細信息,請參閱MailingLists / SubmissionsProtocol

或者,您可以在本網站的社區部分下發布更改或提交。這尤其適用于完整的新功能,如NodeKits和插件。上傳你的東西到網站后,通知osg用戶或osg提交的您的條目列表。

開發 - 特定于Windows

當我嘗試將模型節點保存到文件時,OSG 發生崩潰。我用的Windows,VisualStudio(2003/.NET7) 下 STL 也無法正常工作。

這是Microsoft的STL實現的一個已知問題。目前的解決方案是使用STLport(http://www.stlport.org/),并確保您有最新的service pack。如果問題仍然存在,請確保清理原始的OpenSceneGraph構建并從頭開始重新編譯。下一個版本的VC ++(.NET,版本7)有一個固定的STL實現,所以你不需要STLport

我得到了很多這樣的警告信息... Warning C4541:  ‘dynamic_cast’ used on polymorphic type ‘class osg::Object’ with /GR-

您需要啟用運行時類型標識。對于VisualStudio,您可以將/ GR放在項目選項中。或者在開發環境中找到此選項,單擊項目菜單上的設置。然后單擊C / C ++選項卡,并在類別框中單擊C ++語言。有一個復選框的“啟用RTTI”。

如何在.NET控件中嵌入OSG查看器?

 

osgViewer::Viewer* viewer = new osgViewer::Viewer();
HWND hwnd = (HWND)control->Handle.ToPointer();
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
traits->inheritedWindowData = new osgViewer::GraphicsWindowWin32::WindowData( hwnd );
traits->setInheritedWindowPixelFormat = true;
traits->doubleBuffer = true;
traits->windowDecoration = true;
traits->sharedContext = NULL;
traits->supportsResize = true;
RECT rect;
::GetWindowRect( hwnd, &rect );
traits->x = 0;
traits->y = 0;
traits->width = rect.right - rect.left;
traits->height = rect.bottom - rect.top;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext( traits.get() );
viewer->getCamera()->setGraphicsContext( gc.get() );
viewer->getCamera()->setViewport( new osg::Viewport( 0, 0, traits->width, traits->height ) );
viewer->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f);

 

問題

為什么在滑翔機演示 Demo中山完全是白色的,沒有陰影?或者是我的紋理對象不顯示紋理。

有兩種可能的原因:

  1. 無法找到或未編譯讀取必要的圖像文件格式的插件。對于hang glider演示,這是.rgb文件格式(osgdb_rgb)。在這種情況下,你需要編譯rgb插件。

  2. 程序找不到它需要的數據文件(紋理)。確保您已下載演示數據文件歸檔并解壓縮它們。確保INSTALL文件中的環境變量設置正確,因為它們告訴查看器在哪里找到數據。在寫這篇文章時,他們是OSGHOME,OSGDATA和OSG_FILE_PATH。要在Windows中設置環境變量,請轉到控制面板 - > 系統-> 高級->環境變量。

為什么OSG似乎忽略我設置的近/遠剪裁平面?

當使用osgViewer :: Viewer(或osgUtil :: SceneView)時,基于當前的視點和可視場景重新計算近和遠剪裁平面。這是通過設計來優化深度緩沖器的近/遠距離,否則如果near和far被設置為不合理的小或大的值,這可能導致“z-fighting”現象

您可以通過調用以下方式覆蓋此行為: 

viewe.getCamera()>setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR)

有關此功能的詳細示例,請查看osgthirdpersonview示例(在版本2.4中添加)。它顯示包含正常場景的一個窗口和顯示在第一窗口中使用的相機和剪切平面的第二窗口。通過操作第一個窗口中的視圖,您可以看到第二個窗口中的剪切平面。

如果讓OpenSceneGraph計算我的遠近剪裁平面,如何獲得計算值?

這個信息可以通過cull訪問者獲得(類osgUtil :: CullVisitor?)。

當使用osgUtil :: SceneView?,像這樣  

sceneView->getCullVisitor()->getCalculatedNearPlane();
sceneView->getCullVisitor()->getCalculatedFarPlane();

當使用osgViewer :: Viewer你可以得到它的osg :: Camera(這是一個子類osg CullVisitor? 

viewer->getCamera()

我試圖在Mac OS / X下運行 OpenSceneGraph示例程序,但沒有窗口出現!我該怎么辦

您需要在啟動程序之前設置以下環境變量:

  •  tcsh: 

 

setenv DYLD_BIND_AT_LAUNCH 1

 

  •  bash: 

 

export DYLD_BIND_AT_LAUNCH=1

如果在OSX下運行OSG程序時遇到dyld“無法打開庫”錯誤,您可能還需要將DYLD_LIBRARY_PATH環境變量設置為指向OSG庫和/或插件。

嘿,這個粒子系統很酷,但是當我把它放在我的場景中看起來很奇怪。這是怎么回事?

你可能是旋轉粒子系統和粒子發射器。粒子系統上面的tranform應該匹配你的世界的(絕對)坐標系,或者“包含”粒子的參考系(例如飛機或汽車)。要轉換這個參考框架內的粒子系統,你應該只轉換發射器,而不是粒子系統drawables。如果在“fountain.osg”上面應用變換,實際上對發射器和粒子系統應用平移/旋轉 ; 要獲得正確的行為,您應該遍歷場景圖形,并避免將變換應用于包含ParticleSystem可繪制對象的任何地圖。(答案Marco Jez

有一個圖,描述和源代碼在這里:http : //faculty.nps.edu/jasullivan/osgTutorials/osgParticleHelper.htm

我有一個問題使用PrimitiveSet來表示單個點 我的幾何似乎消失,因為它變得非常遙遠。這是怎么回事

默認情況下,OSG使用小特征剔除來剔出占用小于預定屏幕大小的對象。這對于具有許多細節的模型是有價值的特征,當從遠處觀察時,這些細節對模型的視覺質量沒有貢獻。你可以通過改變觀察者osg :: Camera上的cullingMode來完全禁用小功能剔除: 

osg::CullStack::CullingMode cullingMode = viewer.getCamera()->getCullingMode();
cullingMode &= ~(osg::CullStack::SMALL_FEATURE_CULLING);
viewer.getCamera()->setCullingMode( cullingMode );

您還可以控制用于剔除小特征的屏幕空間大小 

viewer.getCamera()->setSmallFeatureCullingPixelSize( minimumSize );

當我在 osg :: MatrixTransform中應用一個縮放因子時,我的模型顯示被洗掉或變暗。這是怎么回事?

模型的法線可能與其頂點一起縮放。要保持法線歸一化,請在適當的狀態集上設置OpenGL屬性GL_RESCALE_NORMALS:

stateSet->setMode( GL_RESCALE_NORMAL, osg::StateAttribute::ON );

我可以在現有渲染器中使用OSG嗎?

需要一些工作,但完全可以在預先存在的渲染系統中使用OSG。

首先,你應該知道的中心對象是osgViewer :: Viewer和osgViewer :: GraphicsWindowEmbedded。這兩個類將管理OSG特定的顯示任務。osgviewerSDL和osgviewerGLUT示例說明了如何使用Viewer和GraphicsWindowEmbedded?

這兩個對象的設置將如下所示: 

viewer.getCamera()->setComputeNearFarMode( osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR );
viewer.setSceneData( rootNode );

注意,只需將rootNode替換為OSG模型的實際根節點即可。

注意:對setComputeNearFarMode的調用非常重要。如果不這樣做,OSG將在渲染其對象時使用不同的近和遠平面,并且它們在深度緩沖區中將具有與場景的其余部分不同的值。這可能導致非常奇怪的效果。

如果要使用與渲染器其余部分正在使用的照明不同的照明,則可能需要調用: 

viewer.setLightingMode( osg::View::SKY_LIGHT );

要么 

viewer.setLightingMode( osg::View::HEADLIGHT );

這基本上是為了安裝。

現在你只需要調用!Viewer用于渲染,這需要一些額外的工作。

首先,建議在調用其他OpenGL代碼之前調用glPushAttribs(GL_ALL_ATTRIB_BITS)和glPushMatrix為每個模型視圖,投影和紋理矩陣,然后調用相應的彈出窗口,并對OSG執行相同的操作。這防止OSG和您的其他OpenGL代碼相互干擾。例如: 

glPushAttrib=]( GL_ALL_ATTRIB_BITS );
glMatrixMode=](GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
your code here...
glMatrixMode(GL_TEXTURE);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();

下一個重要的事情是使用!Viewer是你需要告訴它關于您現有的視口和投影和modelview矩陣。這樣做的代碼如下所示: 

GLint viewParams[4];
glGetIntegerv( GL_VIEWPORT, viewParams );
viewer.getCamera()->setViewport(viewParams[0], viewParams[1], viewParams[2], viewParams[3]);
GLdouble glMat[16];
glGetDoublev( GL_PROJECTION_MATRIX, glMat );
viewer.setProjectionMatrix( osg::Matrix(glMat) );
glGetDoublev( GL_MODELVIEW_MATRIX, glMat );
viewer.setViewMatrix( osg::Matrix(glMat) );

最后,您需要對!Viewer對象進行實際調用: 

viewer.frame();

如果你做到這一切,你應該能夠在你現有的渲染系統中成功使用OSG,從而獲得OSG的許多優點,而不必削減現有的系統。

我從osg :: Drawable派生一個類,但它的drawImplementation()方法只被調用一次。

嘗試禁用此類的顯示列表。 

drawable->setUseDisplayList( false );

否則,將創建一次顯示列表,下次繪制drawable被調用,而不調用您的drawImplementation。

如何獲取加載的Node或3D模型的BoundingBox?

獲取一個軸對齊osg :: BoundingBox為一個圖 

 osg::ComputeBoundsVisitor  cbv;
 osg::BoundingBox           &bb(cbv.getBoundingBox());
 pNode->accept(cbv);
// access as bb._min.x(), etc

出于性能方面的OSG所有內部節點存儲OSG :: BoundingSphere,以及可繪制的葉節點存儲OSG ::BoundingBox

如果你想使用一個節點的BoundingBox,你可以通過做一些事情將BoundingSphere轉換為BoundingBox: 

 BoundingBox bb;
 bb.expandBy(node->getBound());

當使用多個查看器和/或多個渲染窗口時,我得到奇怪的結果,我的紋理不能正確顯示。

注意,對于基于osgViewer的查看器是原生支持多個渲染窗口,所以應該沒有問題發生,但是,如果用戶使用自己定義的例如低級別的osgUtil :: SceneView?問題可能出現,其余條目適用于此類型的使用。

每個渲染窗口都有自己的OpenGL上下文,它與所有其他上下文分開。由于OSG不知道如何設置您的窗口環境,因此您需要確保每個osg :: State對象都綁定到一個唯一的OpenGL上下文。要做到這一點,你應該:

  1. 對于每個窗口,獲取相關的對象

  2. 對于每個SceneView對象,獲取關聯的

  3. 在每個狀態上調用State :: setContextID(),傳遞一個唯一的數字來標識該上下文。

使用SceneView?代碼 

// this will automatically create the osg::State amoung other operations
 sceneview0->setDefaults();
// now set the ID to 0 (this is the default, just set here for clarity
 sceneview0->getState()->setContextID(0);
 sceneview1->setDefaults();
 sceneview1->getState()->setContextID(1);

注意:上下文ID用作自動增長的向量中的索引,因此請避免設置大數字。從0開始計數,然后每次遞增1。

我有兩個或更多的視圖共享一個場景圖,但我想限制場景圖的一部分在一個或多個視圖中顯示,我怎么做?

視圖中繪制的內容取決于Cull Traversal的結果。每個視圖將有一個獨特的osgViewer :: View和每個osgViewer :: Viewer將有一個唯一的剔除遍歷掩碼。您可以在每個視圖(或sceneView的cullSettings)上設置遍歷掩碼,它將對每個視圖遍歷的節點應用(按位AND)在每個節點上,那么,你可以設置一個CullMask對應于您希望在顯示子圖的視圖

像這樣 

lefView->setCullMask( 0x1);
  rightView->setCullMask( 0x2 );
  leftNode->setNodeMask(0x1);
  rightNode->setNodeMask(0x2);

上一個問題 - 是的,但....它沒有工作!

(維基編輯注意:參考osgProducer :: Viewer)

當使用osgProducer :: Viewer時,方便功能被設置為允許為OsgCameraGroup中的所有攝像機和SceneHandler(包括SceneView)全局設置屬性。這包括CullVisitors的遍歷掩碼,默認情況下它們都將設置為0xFFFFFFFF。在將遍歷掩碼設置為唯一的[= CullVisitors?=],你需要使它們免受全局設置的干擾(CullSettings應用于CullVisitors在遍歷): 

    osgProducer::Viewer::SceneHandlerList shl = viewer.getSceneHandlerList();
    osgProducer::Viewer::SceneHandlerList::iterator p;
    unsigned int n = 0;
    for( p = shl.begin(); p != shl.end(); p++ )
    {
        int inheritanceMask = (*p)->getSceneView()->getInheritanceMask();
        inheritanceMask &= ~(osg::CullSettings::CULL_MASK);
        (*p)->getSceneView()->setInheritanceMask( inheritanceMask );
        (*p)->getSceneView()->setCullMask( 1<<(n));
        n++;
    }

如何捕獲屏幕快照

對于當前的OSG,看看osgscreencapture示例程序。實質上,你只需要附加一個相機后繪制回調。這里有一個非常簡單的例子: 

struct CaptureCB : public osg::Camera::DrawCallback
{
    CaptureCB( int w, int h )
      : w_( w ), h_( h )
    {}
    virtual void operator()( osg::RenderInfo& ri ) const
    {
        std::string fName( "screen.png" ) );
        osg::ref_ptr<osg::Image> image = new osg::Image;
        image->readPixels( 0, 0, w_, h_, GL_RGBA, GL_UNSIGNED_BYTE );
        osgDB::writeImageFile( *image, fName );
    }
    int w_, h_;
};

為什么我的幀速率下降,當 渲染點到一個FBO / pbuffer?

短回答:將PointSprite屬性的坐標原點模式更改為LOWER_LEFT: 

osg::PointSprite *ps = new osg::PointSprite;
ps->setCoordOriginMode(osg::PointSprite::LOWER_LEFT);

長答案:閱讀nVidia OpenGL 2.0支持文檔中的Point Sprites部分。它規定如下:

在渲染到像素緩沖區(通常稱為pbuffer)或幀緩沖區對象(通常稱為FBO)時,將GL_POINT_SPRITE_COORD_ORIGIN狀態設置為GL_LOWER_LEFT設置,以進行完全硬件加速渲染。使用GL_UPPER_LEFT與pbuffer和FBO渲染將強制點在CPU上轉換。

為什么我的幾何渲染不透明,而我有透明的顏色和/或材料附加到它?

您需要通過在幾何體的狀態集(或父節點的狀態集)上設置GL_BLEND模式來激活OpenGL混合。 

stateSet->setMode( GL_BLEND, osg::StateAttribute::ON );

或者在.osg文件中: 

file geom.osg
  Geometry {
    [...]
    StateSet {
      GL_BLEND ON
    }
    PrimitiveSets 1
    {
    [..]

我寫了一個場景包含一個粒子系統 .ive文件,但一些節點/ drawables似乎丟失

(維基編輯注意:這是否仍然有效2.4?)

.ive文件中當前不支持osgParticle nodekit中的一些節點和drawables。作為解決方法,您可以保存到.osg文件。

舊版本的 OpenSceneGraph

在編譯期間我得到關于Producer / *的錯誤:沒有這樣的文件或目錄。為什么? - 發生與日常builds和0.9.4-2官方。

首先構建并安裝OpenProducer

我可以在沒有Producer的情況下使用OSG,和/或已經創建的MFC或WxWindow窗口?

即使您正在創建自己的窗口,也可以使用帶或不帶Producer的OSG。有關在通用窗口環境中使用OSG的示例,請參閱osgsimple示例。OSG本身是窗口系統不可知的,所以設置窗口和OpenGL圖形上下文將取決于你的應用程序。osgsimple使用Producer,但是以一種方式為您提供使用您自己的窗口系統的骨架。

或者,您也可以在自己的窗口環境中使用Producer,方法是將每個Camera的RenderSurface設置為您創建的窗口。像這樣 

osgProducer::Viewer viewer;
viewer.getCamera(0)->getRenderSurface()->setWindow( myWindow );

變量“myWindow”是X11窗口或win32 HWND。

有關更多詳細信息,請參閱http://osgcvs.no-ip.org/osgarchiver/archives/November2004/1019.html

如何在運行時更改Producer圖標?

在Microsoft Windows和Visual Studio 7.x中:

首先向您的解決方案添加一個圖標(項目/添加資源/圖標)。

viewer-> realize()之后執行以下操作: 

Producer::Window wnd = viewer->getCamera(0)->getRenderSurface()->getWindow();
HICON h1 = LoadIcon(GetModuleHandle(0), "YOUR_ICON");
DWORD dw = SetClassLongPtr(wnd, GCL_HICON, (LONG_PTR)h1);

字符串“YOUR_ICON”應引用資源文件(.rc)中的圖標名稱。

數學,矩陣,向量,四元數

(維基編輯注意:也描述了Z-up約定)

OSG中的矩陣,向量和四元數類是什么乘法順序?

OSG使用后乘法順序。例如,如果要創建一個首先在所有軸上縮放50%的矩陣,然后圍繞X軸旋轉90度,最后在X方向上平移2個單位,您將使用 

osg::Matrix M = osg::Matrix::scale(0.5, 0.5, 0.5) 
                * osg::Matrix::rotate(osg::inDegrees(90), osg::X_AXIS) 
                * osg::Matrix::translate(2, 0, 0));
// Use matrix M with, for example, an osg::MatrixTransform to transform its child nodes
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform(M);

要改變一個頂點v用矩陣M可以使用v * M

注意角度以弧度傳遞。您可以使用以下之一將度數轉換為弧度 

osg::inDegrees(angle_in_degrees);
osg::DegreesToRadians(angle_in_degrees);

從弧度到度的轉換可以使用osg :: inRadians()osg :: RadiansToDegrees()

我有其他的問題在這里沒有回答...

檢查矩陣和四元數常見問題,請訪問http://www.j3d.org/matrix_faq/


? 千炮捕鱼联网版赢话费