2010-05-12

boost 編譯筆記

1.編譯bjam
利用Visual Studio Command Prompt開啟DOS視窗,將目錄 cd 到 C:\boost_1_34_1\tools\jam\src下,執行build.bat,然後會在C:\boost_1_34_1\tools\jam\src\bin.ntx86\產生bjam.exe,將bjam.exe複製到c:\boost_1_34_1\下。

2.修改user-config.jam
(C:\boost_1_34_1\tools\build\v2\user-config.jam) 的MSVC configuration,以 vc9 為例

msvc (default version
# -------------------
# MSVC configuration.
# -------------------
# Configure
, searched for in standard locations and PATH).
# using msvc ;
# Configure specific msvc version (searched for in standard locations and PATH).
# using msvc : 8.0 ;
using msvc : 9.0 : : /wd4819 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /D_ITERATOR_DEBUGGING=0 ;

3.編譯boost
bjam --toolset=msvc-9.0 --build-type=complete install

2010-05-10

Media Foundation + ARToolkit + OpenGL

ARToolkit 裡面已經有DSVL影像擷取相關函式庫,此函式庫利用 DirectShow 來擷取影像,因此若要用 VC10 來編譯 DSVL,另外需要再安裝 Windows2003 SDK,這邊我用 Media Foundation 的 Video Capture 功能來取代 DSVL,Media Foundation 是設計來取代 DirectShow 的新一代技術。
Media Foundation 的 Video Capture 程式碼可以參考 MFCaptureD3D Sample,其 device.cpp 裡 DrawDevice::DrawFrame() 函數負責將擷取的影像轉換成 RGB32 (A8R8G8B8) 格式再用 DirectX 畫出,我們可以直接利用此函數轉換完成之後的 RGB32 影像來做影像辨識。
ARToolkit 的辨識功能函數 arDetectMarker() 讀取的影像格式為 (A8R8G8B8) 剛好與 DrawFrame() 函數裡轉換後的影像格式相同,因此直接將影像餵給 arDetectMarker() 即可得到辨識結果。 OpenGL 則要稍微做一點小變化來讀取 ARGB 格式影像:

圖片更新時(擷取到新的影像):
glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, 640, 480, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, m_pBuffer);

2010-05-03

解讀 3d warehouse collada 檔案

Collada 模型檔是以 xml 格式的方式儲存,可以用 Collada-DOM 或是 FCollada 之類的 library 來幫忙解讀, 這邊我是參考這個 viewer ( ColladaLoader ),從原始碼可以學到如何用 FCollada 來解讀 Collada 檔案(包含半透明物件的順序排列),然後以 OpenGL 呈現結果,但值得注意的是它並沒有解讀有關 FaceCulling 的資料,所以...

  1. 如果對全部的三角形 cull back face,那麼在有些角度下,模型會有殘缺不全的現象。
  2. 如果關閉 culling 功能,在某些情況下(lighting...),也會造成不正確的結果。
以 3d warehouse 的 Collada 檔案為例,可以從它檔案裡的 < double_sided >標籤來分辨是否要對這個面進行 culling,如此就可以正確解讀 3d warehouse 裡的 collada 檔案了!