Skip to content

Sixième exemple : ajout d'objets plus complexes

Comme pour l'exemple précédent, nous allons repartir de l'exemple 2. Le but de cet exemple est de montrer comment ajouter un modèle 3D plus complexe, que ce soit fait via un logiciel de modélisation 3D ou en utilisant un modèle déjà existant.

Dans notre cas, nous avons juste utilisé un modèle par défaut de Blender que l'on a texturé (il existe de nombreuses ressources en ligne pour apprendre ce logiciel si la curiosité vous y pousse, tel que ce tutoriel). ex6_blender.png

Pour commencer, nous allons ajouter à notre classe raylibRender un attribut pour le modèle 3D que nous allons charger :

// ...
class raylibRender : public SupportADessin {
    // ...
private:
    // ...
    Model myModel;
};

Puis pour pouvoir utiliser ce modèle, nous devons le charger dans le constructeur de raylibRender (et l'enlever dans le destructeur) :

raylibRender::raylibRender() {
    // ...
    myModel = LoadModel(TextFormat("%sresources/monkey.glb", GetApplicationDirectory()));
    SetTargetFPS(60);
}

raylibRender::~raylibRender() {
    UnloadModel(myModel);
    CloseWindow();
}

Pour voir le modèle de face au lieu de coté, vous pouvez changer la position de départ de la caméra :

     camera.position = { 0.0f, 2.0f, 5.0f };
au lieu de
     camera.position = { 5.0f, 5.0f, 5.0f };

Si vous souhaitez tourner le modèle lui-même, utiliser :

 myModel.transform = MatrixRotateXYZ({DEG2RAD * AngleX, DEG2RAD * AngleY, DEG2RAD * AngleZ});
(avec Angle? les angles que vous voulez, en degrés).

Le fichier monkey.glb est à télécharger ici et à mettre dans le sous-dossier SixiemeExemple :

SixiemeExemple/
├── CMakeLists.txt
├── general
│   ├── CMakeLists.txt
│   ├── contenu.h
│   ├── dessinable.h
│   └── support_a_dessin.h
├── monkey.glb
└── raylib
    ├── CMakeLists.txt
    ├── main_raylib.cpp
    ├── raylib_render.cpp
    └── raylib_render.h

Le chemin resources/monkey.glb est a paramétrer dans le CMakeLists.txt de SixiemeExemple/raylib :

# SixiemeExemple/raylib/CMakeLists.txt

add_library(RayRender6 raylib_render.h raylib_render.cpp)
target_compile_options(RayRender6 PRIVATE ${PROJECT_WARNING_FLAGS}
  -Wno-unused-parameter)
target_link_libraries(RayRender6 raylib Dessin6)
file(COPY ${PROJECT_SOURCE_DIR}/SixiemeExemple/monkey.glb DESTINATION ${CMAKE_BINARY_DIR}/bin/resources)

add_executable(exemple6 main_raylib.cpp)
target_compile_options(exemple6 PRIVATE ${PROJECT_WARNING_FLAGS})
target_link_libraries(exemple6 RayRender6)

Cette ligne supplémentaire permet de copier le modèle 3D dans le dossier désiré (${CMAKE_BINARY_DIR}/bin/resources) afin qu'il soit accessible au programme exécutable final.

Pour dessiner le modèle 3D, il suffit d'utiliser la méthode DrawModel() de raylib, qui prend en paramètre le modèle à dessiner, sa position, sa taille et sa couleur en cas d'absence de texture :

void raylibRender::dessine(Contenu const& a_dessiner) {
    constexpr Vector3 position({ 0.0f, 1.0f, 0.0f });
    DrawModel(myModel, position, 1.0f, WHITE);
}

On trouvera ici les différents types de modèles supportés par raylib.

Et on obtient directement (notons qu'il y a le même problème d'éclairage qu'avec le cube, ce qui fait paraitre le modèle très plat !) :

ex6_img.png