我需要在我的C++應用程序中使用OPENGL庫顯示3D圖像(它是一顆心)。我有一些2D切割的心臟圖像。首先,我將這些圖像導入到我的項目中。但我不知道下一步該怎麼做。C++將2D位圖轉換爲3D使用C++和OPENGL庫
這些都是我的圖片
我需要在我的C++應用程序中使用OPENGL庫顯示3D圖像(它是一顆心)。我有一些2D切割的心臟圖像。首先,我將這些圖像導入到我的項目中。但我不知道下一步該怎麼做。C++將2D位圖轉換爲3D使用C++和OPENGL庫
這些都是我的圖片
首先要明白,這是其中對OpenGL的新手最重要的一條是:OpenGL剛纔只繪製點,線,三角形和而已。這不是一個神奇的圖形庫。這樣做的缺點是需要一些努力才能獲得結果。好處是,你只受到你的創造力的限制。
現在在你的情況下,你有什麼是斷層圖像(切片圖像)的外觀,它是超聲波圖像。這些圖像實質上是每個位置「密度」的表示並定義了體積數據。 OpenGL本身並不「知道」要做什麼。有一個3D圖像格式,但繪製三角形時,這些將通過這個「切片」。
但是(這是一個很重要的「但是」),你可以給OpenGL程序,稱爲「着色器」,告訴它在哪裏放置它繪製什麼和給它什麼顏色。而且在這個程序中,你可以實現一個音量raycaster,它可以把這種圖像堆棧變成一個很好的視圖。然而,描述如何從零開始實現這樣的射線使用者,將OpenGL的知識歸零到實際的圖片僅僅是在StackOverflow的範圍之外;它只是爲了廣泛。有幾個關於混合質量和結果的教程(一些開源代碼)
給你一個想法:我維護的volume raycaster庫包含大約2500行代碼,以涵蓋各種OpenGL版本配置文件和GPU功能(大多數着色器代碼生成與目標配置文件匹配)。如果將自己限制在一組特定的OpenGL上,它可能需要大約1000行代碼。
非常感謝你的迴應darewolf。我仍然希望我可以使用OpenGl。我還發現了一個簡短的教程,使用該Lib http://www.icare3d.org/codes-and-projects/codes/opengl_geometry_shader_marching_cubes.html ...我會試着去理解它,但是肯定會有其他問題。 –
@AnhNguyen:Marching Cube(或Marching Tetraedra)是一種從密度圖像中提取表面的方法。從經驗中我可以告訴你,對於像你在那裏的圖像來說,這是一種很少產生良好圖像的方法。相反,你應該實現一個直接的體積渲染器(卷光柵器);由此產生的圖像更加美觀,並且在面對類似於您的輸入數據時具有更高的逼真度。下面是一個很好的網頁,介紹如何使用GLSL(OpenGL着色器語言)來實現它:http://www.cabiatl.com/mricro/raycast/ – datenwolf
沒有任何深度信息,你就不能將2D圖像變成3D圖像,因爲你錯過了關鍵的第三維。你可以做的最多的是創建一個簡單的立方體與圖像作爲紋理。 –
感謝您的評論。我在圖片中找到區域的邊界(邊緣檢測),將座標放入矢量(X和Y)中,然後爲不同Z軸上的每張圖片繪製GL_points。我創建了一個圖像的骨架,但它不是一個3d對象。 –
接下來,我將它們堆疊....我不認爲我的算法是正確的 –