OpenSceneGraph: build from source dan Hello World



Pendahuluan


OpenSceneGraph (selanjutnya disebut sebagai OSG) adalah kerangka kerja lintas-platform terbuka yang ditulis dalam C ++ dan mewakili mesin grafis yang menyediakan programmer dengan antarmuka objek untuk OpenGL. Di negara kami, mesin ini tidak terlalu populer, bahkan di Habré saya hanya melihat satu publikasi yang kurang lebih baik tentangnya . OSG banyak digunakan di luar negeri di mana, misalnya, itu adalah dasar untuk simulator penerbangan FlightGear gratis, ada implementasi terbuka dari permainan Morrowind, yang disebut OpenMW, pengembangan yang juga ditransfer ke OSG dari mesin Ogre . Dokumentasi berbahasa Rusia di atasnya sangat kecil, dan di antara dokumentasi berbahasa Inggris, hanya serangkaian buku dari pengembang yang dapat dicatat: OpenSceneGraph 3.0. Panduan Pemula dan OpenSceneGraph 3. Cookbook .

Kendati demikian, mesinnya cukup menarik karena alasan berikut:

  1. Implementasi lintas platform terbuka di C ++.
  2. Arsitektur modular.
  3. Ekstensibilitas melalui sistem plugin bawaan.
  4. Kemungkinan pemrosesan multithreaded data grafik dan alat bawaan untuk implementasinya
  5. Manajemen memori dinamis melalui mekanisme penunjuk cerdas

Saya pikir itu akan menarik bagi pembaca Habr untuk berkenalan dengan proyek ini secara lebih rinci. Pengisian ulang basis pengetahuan OSG berbahasa Rusia tidak akan berlebihan. Semua materi yang akan saya terbitkan tentang topik ini didasarkan pada buku OpenSceneGraph 3.0. Panduan Pemula , tetapi bukan terjemahannya, melainkan revisi kreatif dari materi yang disajikan di sana. Jika Anda tertarik dengan topik ini, saya minta potongan

Satu-satunya cara pasti untuk mendapatkan versi terbaru OSG pada mesin Anda adalah dengan membangun perpustakaan dari sumbernya. Penginstal biner yang ada untuk Windows berfokus pada kompiler MS Visual C ++. Bagi saya, untuk proyek saya perlu menggunakan kompiler GCC, atau lebih tepatnya versi MinGW32, yang termasuk dalam penyediaan alat pengembangan kerangka Qt. Jadi kita membutuhkan:

  1. Kerangka kerja Qt yang diinstal dan dikonfigurasi dengan kompiler MinGW32 versi 5.3 dan QtCreator IDE
  2. Git Client untuk Windows
  3. Utilitas Cmake untuk Windows

Pembaca diharapkan terbiasa dengan IDE QtCreator dan sistem build qmake yang digunakan dalam proyek Qt. Selain itu, diasumsikan bahwa pembaca mengetahui dasar-dasar penggunaan sistem kontrol versi Git dan pada prinsipnya tidak memiliki keterampilan pemrograman nol.

1. Mendapatkan Sumber OpenSceneGraph


Kami membuat direktori pada hard drive kami di mana kami akan membangun OSG, misalnya, di sepanjang jalur D: \ OSG



Kami akan pergi ke direktori ini dan mendapatkan sumber dari repositori OSG resmi di Github

D:\OSG> git clone https://github.com/openscenegraph/OpenSceneGraph.git 

Lamanya proses pengunduhan tergantung pada seberapa lebar saluran akses Internet Anda. Cepat atau lambat, kami akan menerima salinan lokal dari repositori OSG.

Setelah mengunduh sumber, buat direktori build-win32-debug terdekat



Dalam katalog ini kita akan membangun kit debugging OSG. Tapi sebelumnya

2. Konfigurasikan cmake


Agar cmake berfungsi dengan benar, kita perlu mengedit file install-path-cmake \ share \ cmake-3.13 \ Modul \ CMakeMinGWFindMake.cmake . Secara default, tampilannya seperti ini

 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. find_program(CMAKE_MAKE_PROGRAM mingw32-make.exe PATHS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MinGW;InstallLocation]/bin" c:/MinGW/bin /MinGW/bin "[HKEY_CURRENT_USER\\Software\\CodeBlocks;Path]/MinGW/bin" ) find_program(CMAKE_SH sh.exe ) if(CMAKE_SH) message(FATAL_ERROR "sh.exe was found in your PATH, here:\n${CMAKE_SH}\nFor MinGW make to work correctly sh.exe must NOT be in your path.\nRun cmake from a shell that does not have sh.exe in your PATH.\nIf you want to use a UNIX shell, then use MSYS Makefiles.\n") set(CMAKE_MAKE_PROGRAM NOTFOUND) endif() mark_as_advanced(CMAKE_MAKE_PROGRAM CMAKE_SH) 

Kami berkomentar beberapa baris di dalamnya, sehingga utilitas tidak mencoba mencari shell Unix di sistem kami, dan jika tidak menemukannya, itu berakhir dengan kesalahan

 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. find_program(CMAKE_MAKE_PROGRAM mingw32-make.exe PATHS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MinGW;InstallLocation]/bin" c:/MinGW/bin /MinGW/bin "[HKEY_CURRENT_USER\\Software\\CodeBlocks;Path]/MinGW/bin" ) #find_program(CMAKE_SH sh.exe ) #if(CMAKE_SH) # message(FATAL_ERROR "sh.exe was found in your PATH, here:\n${CMAKE_SH}\nFor MinGW make to work correctly sh.exe must NOT be in your path.\nRun cmake from a shell that does not have sh.exe in your PATH.\nIf you want to use a UNIX shell, then use MSYS Makefiles.\n") # set(CMAKE_MAKE_PROGRAM NOTFOUND) #endif() mark_as_advanced(CMAKE_MAKE_PROGRAM CMAKE_SH) 

3. Perakitan dan pemasangan versi debug dan lepaskan mesin


Sekarang jalankan cmd shell, shortcut yang terletak di Start-> Program-> Qt-> Qt 5.11.2-> Qt 5.11.2 untuk Desktop (MinGW 5.3.0 32bit)



Sesi baris perintah yang sedang berjalan mengatur seluruh lingkungan yang diperlukan agar alat build mingw32 berfungsi. Pergi ke direktori sumber OSG

 C:\Qt\Qt5.11.2\5.11.2\mingw53_32>D: D:\> cd OSG\build-win32-debug 

Berikan perintah

 D:\OSG\build-win32-debug>cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=E:\Apps\OSG -DCMAKE_BUILD_TYPE=DEBUG ../OpenSceneGraph 

Mari kita menganalisis makna parameter secara lebih rinci:

  • -G "MinGW Makefiles" - menunjukkan bahwa perlu membuat Makefile untuk utilitas mingw32-make
  • -DCMAKE_INSTALL_PREFIX = E: \ Apps \ OSG - tetapkan jalur di mana OSG akan diinstal
  • -DCMAKE_BUILD_TYPE = DEBUG - menunjukkan bahwa versi debug mesin harus dibuat.

Eksekusi perintah memeriksa kesiapan lingkungan untuk perakitan, menghasilkan skrip build dan knalpot berikutnya

Buat knalpot saat mengkonfigurasi OSG build
 -- The C compiler identification is GNU 5.3.0 -- The CXX compiler identification is GNU 5.3.0 -- Check for working C compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/gcc.exe -- Check for working C compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/gcc.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/g++.exe -- Check for working CXX compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/g++.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - found -- Found Threads: TRUE -- Found OpenGL: opengl32 -- Could NOT find EGL (missing: EGL_INCLUDE_DIR) -- Checking windows version... -- Performing Test GL_HEADER_HAS_GLINT64 -- Performing Test GL_HEADER_HAS_GLINT64 - Failed -- Performing Test GL_HEADER_HAS_GLUINT64 -- Performing Test GL_HEADER_HAS_GLUINT64 - Failed -- 32 bit architecture detected -- Could NOT find Freetype (missing: FREETYPE_LIBRARY FREETYPE_INCLUDE_DIRS) -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) -- Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR JPEG_LIBRARIES) -- Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find GDAL (missing: GDAL_LIBRARY GDAL_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR) -- Trying to find DCMTK expecting DCMTKConfig.cmake -- Trying to find DCMTK expecting DCMTKConfig.cmake - failed -- Trying to find DCMTK relying on FindDCMTK.cmake -- Please set DCMTK_DIR and re-run configure (missing: DCMTK_config_INCLUDE_DIR DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmimage_INCLUDE_DIR DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmjpeg_INCLUDE_DIR DCMTK_dcmjpls_INCLUDE_DIR DCMTK_dcmnet_INCLUDE_DIR DCMTK_dcmpstat_INCLUDE_DIR DCMTK_dcmqrdb_INCLUDE_DIR DCMTK_dcmsign_INCLUDE_DIR DCMTK_dcmsr_INCLUDE_DIR DCMTK_dcmtls_INCLUDE_DIR DCMTK_ofstd_INCLUDE_DIR DCMTK_oflog_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find GStreamer (missing: GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES GSTREAMER_VERSION GSTREAMER_BASE_INCLUDE_DIRS GSTREAMER_BASE_LIBRARIES GSTREAMER_APP_INCLUDE_DIRS GSTREAMER_APP_LIBRARIES GSTREAMER_PBUTILS_INCLUDE_DIRS GSTREAMER_PBUTILS_LIBRARIES) (found version "") -- Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR) -- Could NOT find SDL (missing: SDL_LIBRARY SDL_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) -- Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR) -- g++ version 5.3.0 -- Performing Test _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS -- Performing Test _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS - Success -- Performing Test _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS -- Performing Test _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS - Failed -- Performing Test _OPENTHREADS_ATOMIC_USE_SUN -- Performing Test _OPENTHREADS_ATOMIC_USE_SUN - Failed -- Performing Test _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED -- Performing Test _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED - Success -- Performing Test _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC -- Performing Test _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC - Failed -- Configuring done -- Generating done -- Build files have been written to: D:/OSG/build-win32-debug configure (hilang: DCMTK_config_INCLUDE_DIR DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmimage_INCLUDE_DIR DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmjpeg_INCLUDE_DIR DCMTK_dcmjpls_INCLUDE_DIR DCMTK_dcmnet_INCLUDE_DIR DCMTK_dcmpstat_INCLUDE_DIR DCMTK_dcmqrdb_INCLUDE_DIR DCMTK_dcmsign_INCLUDE_DIR DCMTK_dcmsr_INCLUDE_DIR DCMTK_dcmtls_INCLUDE_DIR DCMTK_ofstd_INCLUDE_DIR DCMTK_oflog_INCLUDE_DIR) -- The C compiler identification is GNU 5.3.0 -- The CXX compiler identification is GNU 5.3.0 -- Check for working C compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/gcc.exe -- Check for working C compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/gcc.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/g++.exe -- Check for working CXX compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/g++.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - found -- Found Threads: TRUE -- Found OpenGL: opengl32 -- Could NOT find EGL (missing: EGL_INCLUDE_DIR) -- Checking windows version... -- Performing Test GL_HEADER_HAS_GLINT64 -- Performing Test GL_HEADER_HAS_GLINT64 - Failed -- Performing Test GL_HEADER_HAS_GLUINT64 -- Performing Test GL_HEADER_HAS_GLUINT64 - Failed -- 32 bit architecture detected -- Could NOT find Freetype (missing: FREETYPE_LIBRARY FREETYPE_INCLUDE_DIRS) -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) -- Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR JPEG_LIBRARIES) -- Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find GDAL (missing: GDAL_LIBRARY GDAL_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR) -- Trying to find DCMTK expecting DCMTKConfig.cmake -- Trying to find DCMTK expecting DCMTKConfig.cmake - failed -- Trying to find DCMTK relying on FindDCMTK.cmake -- Please set DCMTK_DIR and re-run configure (missing: DCMTK_config_INCLUDE_DIR DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmimage_INCLUDE_DIR DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmjpeg_INCLUDE_DIR DCMTK_dcmjpls_INCLUDE_DIR DCMTK_dcmnet_INCLUDE_DIR DCMTK_dcmpstat_INCLUDE_DIR DCMTK_dcmqrdb_INCLUDE_DIR DCMTK_dcmsign_INCLUDE_DIR DCMTK_dcmsr_INCLUDE_DIR DCMTK_dcmtls_INCLUDE_DIR DCMTK_ofstd_INCLUDE_DIR DCMTK_oflog_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find GStreamer (missing: GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES GSTREAMER_VERSION GSTREAMER_BASE_INCLUDE_DIRS GSTREAMER_BASE_LIBRARIES GSTREAMER_APP_INCLUDE_DIRS GSTREAMER_APP_LIBRARIES GSTREAMER_PBUTILS_INCLUDE_DIRS GSTREAMER_PBUTILS_LIBRARIES) (found version "") -- Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR) -- Could NOT find SDL (missing: SDL_LIBRARY SDL_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) -- Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR) -- g++ version 5.3.0 -- Performing Test _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS -- Performing Test _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS - Success -- Performing Test _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS -- Performing Test _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS - Failed -- Performing Test _OPENTHREADS_ATOMIC_USE_SUN -- Performing Test _OPENTHREADS_ATOMIC_USE_SUN - Failed -- Performing Test _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED -- Performing Test _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED - Success -- Performing Test _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC -- Performing Test _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC - Failed -- Configuring done -- Generating done -- Build files have been written to: D:/OSG/build-win32-debug GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES GSTREAMER_VERSION GSTREAMER_BASE_INCLUDE_DIRS GSTREAMER_BASE_LIBRARIES GSTREAMER_APP_INCLUDE_DIRS GSTREAMER_APP_LIBRARIES GSTREAMER_PBUTILS_INCLUDE_DIRS GSTREAMER_PBUTILS_LIBRARIES) (versi ditemukan "") -- The C compiler identification is GNU 5.3.0 -- The CXX compiler identification is GNU 5.3.0 -- Check for working C compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/gcc.exe -- Check for working C compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/gcc.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/g++.exe -- Check for working CXX compiler: C:/Qt/Qt5.11.2/Tools/mingw530_32/bin/g++.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - found -- Found Threads: TRUE -- Found OpenGL: opengl32 -- Could NOT find EGL (missing: EGL_INCLUDE_DIR) -- Checking windows version... -- Performing Test GL_HEADER_HAS_GLINT64 -- Performing Test GL_HEADER_HAS_GLINT64 - Failed -- Performing Test GL_HEADER_HAS_GLUINT64 -- Performing Test GL_HEADER_HAS_GLUINT64 - Failed -- 32 bit architecture detected -- Could NOT find Freetype (missing: FREETYPE_LIBRARY FREETYPE_INCLUDE_DIRS) -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) -- Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR JPEG_LIBRARIES) -- Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find GDAL (missing: GDAL_LIBRARY GDAL_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR) -- Trying to find DCMTK expecting DCMTKConfig.cmake -- Trying to find DCMTK expecting DCMTKConfig.cmake - failed -- Trying to find DCMTK relying on FindDCMTK.cmake -- Please set DCMTK_DIR and re-run configure (missing: DCMTK_config_INCLUDE_DIR DCMTK_dcmdata_INCLUDE_DIR DCMTK_dcmimage_INCLUDE_DIR DCMTK_dcmimgle_INCLUDE_DIR DCMTK_dcmjpeg_INCLUDE_DIR DCMTK_dcmjpls_INCLUDE_DIR DCMTK_dcmnet_INCLUDE_DIR DCMTK_dcmpstat_INCLUDE_DIR DCMTK_dcmqrdb_INCLUDE_DIR DCMTK_dcmsign_INCLUDE_DIR DCMTK_dcmsr_INCLUDE_DIR DCMTK_dcmtls_INCLUDE_DIR DCMTK_ofstd_INCLUDE_DIR DCMTK_oflog_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find GStreamer (missing: GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES GSTREAMER_VERSION GSTREAMER_BASE_INCLUDE_DIRS GSTREAMER_BASE_LIBRARIES GSTREAMER_APP_INCLUDE_DIRS GSTREAMER_APP_LIBRARIES GSTREAMER_PBUTILS_INCLUDE_DIRS GSTREAMER_PBUTILS_LIBRARIES) (found version "") -- Could NOT find SDL2 (missing: SDL2_LIBRARY SDL2_INCLUDE_DIR) -- Could NOT find SDL (missing: SDL_LIBRARY SDL_INCLUDE_DIR) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR) -- Could NOT find ZLIB (missing: ZLIB_INCLUDE_DIR) -- Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) -- Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR) -- g++ version 5.3.0 -- Performing Test _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS -- Performing Test _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS - Success -- Performing Test _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS -- Performing Test _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS - Failed -- Performing Test _OPENTHREADS_ATOMIC_USE_SUN -- Performing Test _OPENTHREADS_ATOMIC_USE_SUN - Failed -- Performing Test _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED -- Performing Test _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED - Success -- Performing Test _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC -- Performing Test _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC - Failed -- Configuring done -- Generating done -- Build files have been written to: D:/OSG/build-win32-debug 



memberi tahu kami bahwa Anda dapat mulai merakit. Berikan perintah

 D:\OSG\build-win32-debug>mingw32-make -j9 

Anda dapat, seperti dalam contoh saya, tentukan jumlah utas perakitan jika Anda memiliki prosesor multi-inti (-j switch). Proses pembuatan akan dimulai, memakan waktu sekitar delapan menit di komputer saya



Di akhir pertemuan, instal perpustakaan

 D:\OSG\build-win32-debug> mingw32-make install 

setelah menjalankan perintah, kami menemukan pustaka terinstal di jalur yang sebelumnya kami atur



Sekarang mari kita membangun versi rilis mesin dengan membuat direktori build lain

 D:\OSG\build-win32-debug>cd .. D:\OSG> mkdir build-win32-release D:\OSG>cd build-win32-release D:\OSG\build-win32-release> cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=E:\Apps\OSG ../OpenSceneGraph D:\OSG\build-win32-release> mingw32-make -j9 D:\OSG\build-win32-release> mingw32-make install 

4. Mengatur variabel lingkungan


Lokasi pustaka OSG setelah instalasi dapat berupa apa saja - ditentukan oleh keinginan pengguna tertentu dan kemampuannya untuk menempatkan file di komputer. Pada saat yang sama, ketika menyiapkan proyek tertentu yang menggunakan data, perpustakaan memerlukan penyatuan tertentu, abstrak dari lokasi spesifik perpustakaan.

Mari kita buat beberapa variabel lingkungan sistem yang menunjukkan jalur ke pustaka, file header dan plugin OSG. Dalam contoh saya, akan terlihat seperti ini



Kita perlu membuat variabel yang namanya dilingkari merah di tangkapan layar. Setelah membuat variabel, agar terlihat oleh alat pengembangan, khususnya, QtCreator harus setidaknya masuk ke sistem (logout dan login sebagai pengguna saat ini) atau, mungkin, reboot sistem (ini adalah Windows!)

Setelah itu, prosedur untuk menginstal OSG di komputer kita dapat dianggap lengkap.

5. Menulis Hello World ke QtCreator


Kami akan mulai berkenalan dengan mesin grafis OpenSceneGraph dengan contoh sederhana, seperti biasa dalam pemrograman dengan "Halo dunia!"

Sebelum menulis kode apa pun, kami akan mengonfigurasi proyek kami untuk sistem build qmake, yang akan kami gunakan di seluruh rangkaian artikel. Di tempat sistem file yang menarik minat kami, buat struktur direktori berikut

 OSG-lessons/ |-data/ |-OSG-lessons/ | |-hello/ |-include/ |-src/ 

Di direktori halo, buat file hello.pro dengan konten berikut

Teks lengkap hello.pro
 TEMPLATE = app TARGET = hello DESTDIR = ../../bin win32 { OSG_LIB_DIRECTORY = $$(OSG_BIN_PATH) OSG_INCLUDE_DIRECTORY = $$(OSG_INCLUDE_PATH) CONFIG(debug, debug|release) { TARGET = $$join(TARGET,,,_d) LIBS += -L$$OSG_LIB_DIRECTORY -losgd LIBS += -L$$OSG_LIB_DIRECTORY -losgViewerd LIBS += -L$$OSG_LIB_DIRECTORY -losgDBd LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreadsd } else { LIBS += -L$$OSG_LIB_DIRECTORY -losg LIBS += -L$$OSG_LIB_DIRECTORY -losgViewer LIBS += -L$$OSG_LIB_DIRECTORY -losgDB LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreads } INCLUDEPATH += $$OSG_INCLUDE_DIRECTORY } unix { CONFIG(debug, debug|release) { TARGET = $$join(TARGET,,,_d) LIBS += -losgd LIBS += -losgViewerd LIBS += -losgDBd LIBS += -lOpenThreadsd } else { LIBS += -losg LIBS += -losgViewer LIBS += -losgDB LIBS += -lOpenThreads } } INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) SOURCES += $$files(./src/*.cpp) 

Kami akan menganalisis surat-surat ini secara lebih rinci.

 TEMPLATE = app TARGET = hello DESTDIR = ../../bin 


Variabel menentukan templat proyek (aplikasi - aplikasi), nama file yang dapat dieksekusi (halo) dan direktori tempat file yang dapat dieksekusi ditempatkan setelah perakitan.

 win32 { OSG_LIB_DIRECTORY = $$(OSG_BIN_PATH) OSG_INCLUDE_DIRECTORY = $$(OSG_INCLUDE_PATH) CONFIG(debug, debug|release) { TARGET = $$join(TARGET,,,_d) LIBS += -L$$OSG_LIB_DIRECTORY -losgd LIBS += -L$$OSG_LIB_DIRECTORY -losgViewerd LIBS += -L$$OSG_LIB_DIRECTORY -losgDBd LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreadsd } else { LIBS += -L$$OSG_LIB_DIRECTORY -losg LIBS += -L$$OSG_LIB_DIRECTORY -losgViewer LIBS += -L$$OSG_LIB_DIRECTORY -losgDB LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreads } INCLUDEPATH += $$OSG_INCLUDE_DIRECTORY } 

Bergantung pada OS tempat proyek dirakit, kami mendefinisikan variabel yang menunjukkan path ke direktori library dan file header OSG. Di sinilah variabel lingkungan OSG_BIN_PATH dan OSG_INCLUDE_PATH berguna - sekarang tidak masalah di mana pustaka OSG diinstal. Siapa pun yang ingin bekerja dengan proyek ini di komputer mereka hanya akan menulis variabel lingkungan yang sesuai dalam sistem mereka tanpa mengedit skrip pembuatan.

 CONFIG(debug, debug|release) { TARGET = $$join(TARGET,,,_d) LIBS += -L$$OSG_LIB_DIRECTORY -losgd LIBS += -L$$OSG_LIB_DIRECTORY -losgViewerd LIBS += -L$$OSG_LIB_DIRECTORY -losgDBd LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreadsd } else { LIBS += -L$$OSG_LIB_DIRECTORY -losg LIBS += -L$$OSG_LIB_DIRECTORY -losgViewer LIBS += -L$$OSG_LIB_DIRECTORY -losgDB LIBS += -L$$OSG_LIB_DIRECTORY -lOpenThreads } 

Menulis skrip untuk membangun OS yang mirip unix

 unix { CONFIG(debug, debug|release) { TARGET = $$join(TARGET,,,_d) LIBS += -losgd LIBS += -losgViewerd LIBS += -losgDBd LIBS += -lOpenThreadsd } else { LIBS += -losg LIBS += -losgViewer LIBS += -losgDB LIBS += -lOpenThreads } } 

Di sini kita mengkonfigurasi nama file yang dapat dieksekusi dan menentukan pustaka yang harus dikompilasi dengan program kami untuk berbagai opsi build: baik debug dan rilis. Pustaka debug OSG memiliki akhiran "d" setelah nama file. Kami akan menambahkan akhiran "_d" ke file proyek yang dapat dieksekusi untuk membedakan opsi debug dari versi rilis.

 INCLUDEPATH += $$OSG_INCLUDE_DIRECTORY INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) SOURCES += $$files(./src/*.cpp) 

Dan akhirnya, kami menentukan jalur pencarian untuk file header dan file yang termasuk dalam pohon proyek. Buat file main.h kosong di direktori include /, dan file main.cpp di direktori src /. Kami membuka proyek ini di QtCreator dan mengkonfigurasinya seperti yang ditunjukkan pada tangkapan layar



Setelah membuka proyek, kita akan melihat gambar berikut



Kami akan menulis kode seperti itu di file main.h

 #ifndef MAIN_H #define MAIN_H #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

Selanjutnya, kami mengimplementasikan tubuh utama program dalam file main.cpp

 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("../data/cessna.osg"); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); return viewer.run(); } 

File model pesawat harus disalin ke data / direktori. File ini, dan juga apa yang akan digunakan dalam seri artikel ini, dapat diunduh dari repositori OpenSceneGraph-Data

Setelah mengkompilasi dan menjalankan, kita mendapatkan sesuatu seperti ini



Dua baris pertama dari kode kita

 (void) argc; (void) argv; 

tandai parameter input fungsi utama () sebagai tidak digunakan untuk menghindari peringatan kompiler. Selanjutnya, simpul akar adegan dibuat, yang merupakan model pesawat dimuat dari file cessna.osg

 osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("../data/cessna.osg"); 

Kemudian sebuah instance dari kelas osgViewer :: Viewer dibuat - yang disebut "viewer" - sebuah objek yang mengontrol tampilan adegan di layar. Data pemandangan diteruskan ke pemirsa

 viewer.setSceneData(root.get()); 

dan siklus rendering adegan dimulai

 return viewer.run(); 

Kode paling sederhana ini sudah mengandung sejumlah konsep dasar yang digunakan dalam OSG. Tetapi berbicara tentang mereka akan berjalan sedikit kemudian.

Kesimpulan


Kode sumber lengkap untuk contoh-contoh yang dijelaskan selanjutnya dapat diperoleh di sini . Saya berharap publikasi ini menarik minat pembaca, untuk dilanjutkan ...

Source: https://habr.com/ru/post/id429816/


All Articles