Aplikacja 3D z fizyką( Irrlicht, Newton itd)

0

Witam od dłuższego czasu próbuję zacząć pisać coś ciekawszego niż zwykłe GUI w okienku. Poszukałem trochę w necie i najbardziej spodobał mi się silnik graficzny Irrlicht. Później stwierdziłem, że dobrze by było mieć też jakąś fizykę realistyczną z tego co znalazłem to Ode i Newton wydają mi się w porządku. Niestety tutaj zaczęły się schody, mam na myśli konfiguracje IDE, wgrywanie tych bibliotek, kompilacja ich itd itp. Dlatego zgłaszam się do was z ogromną prośbą a mianowicie czy jest ktoś kto mógł by w miarę jasno wytłumaczyć jakie kroki wykonać aby można było się zabrać za pisanie takiej aplikacji? Nie mam żadnych wymagań co do tego w jakim systemie, oraz jakie IDE, w sumie nie interesuje mnie też czy to będzie Newton czy Ode czy coś innego( dobrze by było po prostu aby były do tego jakieś tutoriale nie koniecznie polskie ).

Zdaję sobie sprawę że proszę o wiele ale może znajdzie się ktoś kto przeprowadzał niedawno takie operacje u siebie i pamieta co i jak.
Dodatkowo chciałbym prosić o wytłumaczenie co to jest naprzykład wrapper Irrlicht-Ode?
Pozdrawiam

2

Nie pomogę z tymi konkretnymi bibliotekami, ale generalnie zasada jest taka, jeśli to zrozumiesz co napiszę, będziesz mógł sobie podłączyć co zechcesz:
pobierając jakieś SDK, czy bibliotekę masz tam 2 rodzaje plików:
-pliki nagłówkowe *h. lub *.hpp (często w SDK folder nazywa się include)
-pliki *.lib (dla gcc *.a) (często w SDK folder nazywa się lib, mogą być wersje x64 i x86) + ewentalne pliki *.dll, które te lib reprezentują (często w SDK folder nazywa się bin)

Pobierając i wypakowując SDK/bibliotekę, aby używać jej w projekcie C++ musisz dodać w opcjach projektu folder, którym znajdują się te pliki, oddzielnie dodaje się foldery plików nagłówkowych, a oddzielnie foldery z plikami lib.
Np. w Visual C++ 2010, aby dodać folder plików nagłówkowych wybierasz: opcje projektu -> C/C++ -> General -> Additional Include Directories i tam dodajesz sobie folder ściągniętej biblioteki z jej plikami nagłókowymi (często nazywa się include(s))
Ten sam krok dla plików lib, w Visualu C++ 2010: opcje projektu -> Linker -> General -> Additional Library Directories i dodajesz folder z plikami *.lib ściągniętej biblioteki/SDK.

Tymi dwoma krokami, twój projekt powinien widzieć pliki danej biblioteki. Teraz możesz dołączać w kodzie pliki nagłówkowe danej biblioteki przez #include
#include <plik_biblioteki.hpp>
Tym się różni #include <xx> od #include "xx", że #include<xx.h> szuka plików w dodanych ścieżkach(co uczyniono), natomiast #include "xx.h" szuka plików tylko w folderze projektu, czyli w sumie tych twoich które sam tworzysz w twoim projekcie.

Niektóre prostsze biblioteki, składają się tylko z plików nagłówkowych (np. C++ STL), aczkolwiek coś większego, a już w szczególności SDK czy silniki, składają się jeszcze z plików lib + DLL(opcjonalnie). W plikach nagłówkowych (tych przez include) zawsze zawierają się tylko definicje, np. definicje typów, klas itp.

// plik nagłokowy
typedef int64 long long; // definicja typu

class { // definicja klasy
public:
 void foo(); // definicja metody
};

void foo(); // definicja funkcji

Jednak są to tylko definicje i w przypadku bibliotek z plikami LIB kod ich został już skompilowany przez autorów bibliotek/SDK i znajduje się on albo w całości w pliku *.lib, albo w pliku *.dll, a plik *.lib wtedy jest "łącznikiem", który mówi podczas kompilacji, gdzie co w tym pliku DLL jest.
Wracając do ustawiania projektu, jeśli dołączysz biblioteki nagłówkowe (kompilator będzie już znał definicje) wtedy już projekt powinien się kompilować, ale jeśli użyjesz jakiejś funkcji/metody z biblioteki, czyli zdefiniowanej w dołączonych plikach nagłówkowych - dostaniesz błąd na etapie linkowania jakiś taki:
error LNK2001: unresolved external symbol "void __cdecl foo(void)"
czyli w skrócie "nieznaleziony symbol", chodzi po prostu o to, że nigdzie nie ma kodu z tą funkcją/metodą, a to dlatego, że informacja o tym gdzie będzie ten kod jest właśnie w plikach *.lib.
Więc(wiem nie zaczyna się zdania od więc)... A więc, drugim etapem jest dodanie-"podlinkowanie" odpowiednich bibliotek lib, w których będzie kod tych metod/funkcji. Czasem cała biblioteka jest w jednym pliku LIB, czasem projekt jest porozbijany na więcej plików LIB. W każdym razie każda funkcja/metoda biblioteki będzie w jakimś pliku LIB. Żeby pozbyć się komunikatów o "unresolved external symbol", trzeba go dołączyć.
Generalnie można zrobić to na 2 sposoby: w kodzie (w każdy kompilator to obsługuje) lub w opcjach projektu, dodać dodatkowe pliki *.lib
W kodzie zwykle używa się do tego dyrektywy #pragma
np. w Visualu wygląda to tak (w różnych kompilatorach może być różnie):
#pragma comment(lib, "plik.lib") // oczywiście w opcjach musi być dodany folder (o czym było wcześniej) w którym ten plik będzie lub wpisać pełną ścieżkę (mało profesjonalne :>)
Dyrektywę można wstawić w kompletnie dowolnym miejscu w kodzie (chociaż wypada gdzieś na początku, nie?) i tak proces linkowania ma miejsce po właściwej kompilacji kodu.
Drugim sposobem jest dodanie pliku w opcjach projektu i znów w Visualu C++ 2010 wchodzisz: opcje projektu -> Linker -> Input -> Additional Dependencies i tam wpisujesz nazwy linkowanych bibliotek

OK includując pliki nagłówkowe i dołączając pliki LIB już prawie jesteśmy w domu, kompilacja projektu na tym etapie powinna zakończyć się sukcesem. Zostaje jeszcze jedna rzecz. W przypadku jeśli biblioteka jest w postaci pliku DLL, trzeba jeszcze zadbać, aby twoja aplikacja mogła ją znaleźć, w przeciwnym wypadku podczas uruchamiania twojego programu dostaniesz komunikat, że nie można odnaleźć danej biblioteki DLL. Aby twój program ją odnalazł są 2 sposoby:

  • (prawie zawsze preferowany) umieścić plik z biblioteką *.dll w folderze roboczym procesu, czyli zwykle w folderze w którym jest exec (acz nie zawsze). Wtedy system ją znajdzie i załaduje
  • (zwykle niezalecany) Drugi sposób to umieszczenie pliku *.dll w folderze systemowym (C:Windows czy C:Windows\system32 lub WOW64), tam także szuka DLLek.

To w sumie tyle, czasem w przypadku większych silników, itp. aby wszystko dobrze działało trzeba jeszcze porobić różnego rodzaju pliki konfiguracyjne, ale to już wynika z kodu i jego działania, który jest tej bibliotece. Ale to wszystko będzie już w dokumentacji danej biblioteki/SDK.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.