Cours d’apprentissage sur le Framework Python Soya3D


Télécharger Cours d’apprentissage sur le Framework Python Soya3D

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Cours d’apprentissage sur le Framework Python Soya3D

1.2 Qu'est-ce que Soya 3D?

1.3 Histoire

Le Soya actuel a été écrit à l'origine par Jiba et Blam. Jiba est l'homme qui a écrit sept moteurs 3D:

  1. un moteur 3D («Vertige 3D») en Visual Basic + Direct X
  2. un moteur 3D dans Visual Basic + OpenGL (X direct était trop horrible)
  3. un deuxième moteur 3D dans Visual Basic + OpenGL (réécriture du précédent)
  4. un moteur 3D («Opale.Soya») en Java + OpenGL (mon dernier moteur était trop gros pour être compilé avec VB!)
  5. un moteur 3D («Opale.Soya 2») en Java + OpenGL (réécriture du précédent avec mon frère Blam)
  6. un moteur 3D ("Soya" <0.7) en Python + C + OpenGL (Python était maintenant plus attrayant pour moi que Java, toujours aidé par Blam pour la partie C)
  7. un moteur 3D ("Soya"> = 0,7) en Python + Pyrex + OpenGL (je n'étais pas à l'aise avec C et Blam avait disparu)

Le moteur dans Visual Basic n’a jamais été publié (je n’ai pas accès à Internet pour le moment!). Le moteur Java a été publié et peut toujours être trouvé sur le Web; en particulier, ils ont été utilisés à Arkanae. Ils ne sont plus maintenus.

Après avoir tenté une prise de contrôle agressive sur Soya, Arc Riley a lancé le projet dans PySoy le 6 juin 2006.

Arc est toujours propriétaire du nom de domaine soya3d.org et l'utilise comme paramètre fictif pour la propagation d'allégations fausses et diffamatoires.

Arc me considérait (= Jiba) comme un «mauvais leader» pour le projet. Après avoir écrit le moteur Soya 3D et plusieurs jeux (dont Arkanae, Slune, Balazar et Balazar Brothers), je me considère comme un grand leader et les orientations techniques que j'ai choisies sont justes. Je ne prétends pas être un bon manager, cependant ;-)

Vous pouvez trouver plus d'informations historiques sur http://home.gna.org/oomadness/en/soya/history.html.

1.4 Les objectifs du projet Soya et l'esprit Soya

Voici l'esprit que Soya suit (ou devrait suivre ;-)):

  • L’objectif n ° 1 de Soya est de permettre de développer le plus rapidement possible des jeux 3D et d’autres applications 3D.

(Justification: Soya cible les développeurs «amateurs», qui codent pendant leur temps libre limité! De plus, un développement rapide permet de gagner un temps précieux qui peut être réinvesti dans l'amélioration de votre code ou dans le test de votre application. meilleur gameplay)

  • L’objectif n ° 2 de Soya est d’être aussi facile à apprendre que possible, en particulier pour les personnes n’ayant aucune formation en 3D (Justification: le soja n’est pas un jouet; être facile à apprendre n’est que l’objectif n ° 2, car tout débutant sera un jour, ne plus être un débutant)
  • Malgré sa simplicité, Soya ne sacrifie jamais performance et rapidité (Justification: la rapidité est importante pour les jeux 3D!)
  • L’API de Soya ne correspond pas nécessairement à la réalité mathématique, informatique ou technique de la 3D, par exemple. Soya API ne nécessite pas l'utilisation de matrices

(Justification: les mathématiques ne sont pas la manière naturelle de représenter un objet 3D. Le soja devrait pouvoir être utilisé sans un arrière-plan mathématique important. Cependant, Soya fournit des matrices, principalement à des fins de débogage)

  • Soya dépend beaucoup des installations et des modules Python, par exemple: l'enregistrement du modèle 3D s'effectue par la sérialisation d'objet.

En conséquence, Soya n'évoluera pas vers un moteur 3D multilingue et restera centré sur Python (Justification: les modules Python facilitent le développement de Soya, mais également l'utilisation de Soya, car ils sont déjà bien connus des développeurs Python)

  • Le soja a beaucoup de dépendances

(Justification: tout bon système d'exploitation a aujourd'hui un ensemble d'outils système)

  • Soya assume toujours par défaut le cas d'utilisation le plus courant

(Raison: cela entraîne un gain de temps substantiel)

  • Soya est un moteur 3D «atypique» et s'appuie sur un certain nombre de choix controversés et discutables. cependant, la plupart de ces choix sont délibérés

(Justification: Soya doit être considéré comme un "projet de recherche" visant à "une nouvelle façon de réaliser la 3D". L'objectif n'est pas de satisfaire quiconque, mais d'être le moteur 3D idéal pour quelques personnes. Python fait de même.)

1.5 Documentation disponible

1.5.1 Docstrings

Environ la moitié des objets et fonctions Soya ont des docstrings. Vous pouvez utiliser pydoc pour les lire ou simplement taper, par exemple. “Help (soya.Body)” dans un interpréteur Python.

1.5.2 Tutoriels

Le pack de tutoriels Soya comprend de nombreux tutoriels, démonstrations et exemples.

1.5.3 À propos de ce doc

Le guide complet (encore intégré) de Soya 3D, également appelé «le yet-in», est en cours de rédaction.

Chapitre 2 Les bases du soja

2.1 Initialisation du soja

L'initialisation de Soya se fait en trois étapes, correspondant à ces trois lignes: import soja soya.path.append ("/ votre / données / chemin") soya.init ("Mon application 3D", son = 1)

  1. Module d'importation. Soya possède plusieurs sous-packages Python, mais la plupart des éléments de base se trouvent directement dans le module soya.
  2. Définition du chemin de données. Le répertoire de données (/ votre / data / chemin ci-dessus) est appelé <data> / dans cette documentation; il devrait contenir plusieurs sous-répertoires (voir la section 3).

Astuce: si vos données sont dans le répertoire «data» situé dans le même répertoire que votre script, une astuce courante pour un script Python est la suivante:



soya.path.append (os.path.join (os.path.dirname (sys.argv [0]), "data")) et pour le module Python:

soya.path.append (os.path.basename (__ fichier__, "données"))

  1. Création et affichage de l’affichage 3D. soya.init peut prendre les arguments suivants (tous étant optionnels):

titre est le titre de la fenêtre (mode fenêtré uniquement, par défaut «Soya 3D»). width, height les dimensions de l'écran 3D (640, 480 par défaut).

fullscreen a la valeur true pour le mode plein écran et false pour le mode fenêtré (la valeur par défaut est false).

redimensionnable est vrai pour une fenêtre redimensionnable (mode fenêtré uniquement, la valeur par défaut est true). create surface est vrai pour créer une surface OpenGL via SDL, et false pour utiliser l’opération OpenGL actuellement active (dans ce cas, il vous incombe d’initialiser OpenGL, par exemple avec PyGame, voir section 13.2; sa valeur par défaut est true), le son est true pour initialiser la prise en charge du son 3D (false par défaut pour la compatibilité descendante). Il existe d'autres arguments liés au son, qui sont discutés dans la section 7.3.

Vous pouvez utiliser la vidéo soya.set (largeur, hauteur, plein écran, redimensionnable) pour modifier certains de ces paramètres après l’initialisation.

Le reste de cette documentation suppose que vous avez correctement initialisé Soya. Vous pouvez également supposer que vous avez importé certains modules communs (os, sys, ...), et bien, vous êtes probablement assez intelligent pour comprendre cela ;-).

2.2 Cours de base

Le schéma UML de la figure 2.1 montre les classes de base de Soya:

MainLoop est chargé de la gestion et de la régulation du temps (voir section 2.7).

CoordSyst est la classe de base pour tous les objets 3D. Il définit un système de coordonnées, c’est-à-dire qu’il a une position, une orientation et une taille en 3D.

La lumière est une lumière.

Figure 2.1: Classes de base de Soya (schéma UML)

La caméra est «l'œil» à partir duquel la scène 3D est visionnée. Il agit également comme «oreille» pour le son 3D.

Le modèle (parfois appelé "Mesh" dans d'autres moteurs 3D) est un modèle 3D. Model est en fait une classe «abstraite» et Soya fournit plusieurs sous-classes de modèle (SimpleModel, AnimatedModel, ...). Les modèles sont créés soit en les exportant à partir de modélisateurs 3D (voir chapitre 5), soit en créant un monde, en plaçant Faces dans le monde, puis en "compilant" le monde en modèle (voir chapitre 10).

Matériau définit les attributs d’une surface, par ex. couleur ou texture.

L'image est une image 2D. Il est utilisé notamment pour les textures. Les images sont généralement créées à l'aide d'un programme de peinture 2D tel que The Gimp.

Corps (parfois appelé «entité» dans d'autres moteurs 3D ou «objet» dans Blender) affiche un modèle à une position 3D spécifique.

Le modèle ne peut pas être affiché sans les "personnifier"; cela permet d'afficher le même modèle à plusieurs endroits (par exemple deux maisons identiques dans une ville), en créant deux corps avec le même modèle.

World (parfois appelé «nœud» ou «groupe» dans d'autres moteurs 3D) agit comme un conteneur de regroupement. Un monde peut contenir d'autres CoordSyst imbriqués, y compris d'autres mondes. Lorsqu'un monde est déplacé, tous les CoordSysts qu'il contient sont également déplacés. En conséquence, le scénographe Soya est une structure arborescente, la racine étant un monde, généralement appelé "scène". World hérite également de Body et peut donc afficher un modèle.

La plupart des classes de soja les plus avancées en dérivent.

Astuce: certaines personnes trouvent étrange que World hérite de Body ... mais cela aura un sens dans la section 4.5, veuillez patienter ;-)

Histoire: Soya utilise depuis longtemps des noms «folkloriques». Ces noms sont toujours disponibles sous forme d'alias, pour des raisons de compatibilité ascendante (et archéologues :-). Ce sont: Idler pour MainLoop, Shape pour Model, Volume pour Body, Terrain pour Terrain (voir section 9.1).

2.3 Votre première scène 3D avec Soya

Nous allons créer une scène 3D de base qui affiche simplement un modèle. Premièrement, nous devons créer la racine de l’arbre, un monde que nous appelons «scène» (les mondes sans parent sont habituellement appelés «scènes»). Ensuite, nous chargeons le modèle et créons un corps qui l'affiche.

Ensuite, nous créons une lumière et une caméra, et nous définissons la caméra comme widget racine, c’est-à-dire que l’objet rendu par Soya (voir le chapitre

11). Enfin, nous créons le MainLoop et commençons à boucler. L'arbre de la scène est le suivant:

Scène du monde

|

+ - Corps épée, affichant l'épée Modèle

|

+ - lumière lumière

|

+ - caméra caméra

Et voici le code (voir tutoriel basic-1.py):

scène = soja.Monde ()

sword_model = soya.Model.get ("épée")

sword = soya.Body (scene, sword_model)

épée.x = 1.0

sword.rotate_y (90.0)

lumière = soja. lumière (scène)

light.set_xyz (0.5, 0.0, 2.0)

camera = soja.Camera (scène)

camera.z = 2.0



soya.set_root_widget (caméra)

soya.MainLoop (scène) .main_loop ()

Dans les sections suivantes, nous allons voir plus en détail les différents objets utilisés dans ce premier exemple.

2.4 Chargement d'images, de matériaux et de modèles

Les modèles ne sont généralement pas créés mais chargés à partir d'un fichier (si vous souhaitez créer des modèles directement à partir de Soya, voir le chapitre 10). Pour charger un modèle, procédez comme suit: your_model = soya.Model.get ("your_model_filename") et Soya charge le fichier <data> / models / votre fichier filename.data. Les matériaux et les images utilisés par le modèle sont également chargés automatiquement à partir des répertoires <data> / materials / et <data> / images /. Les fichiers d’image sont au format PNG ou JPEG, et

Les fichiers Material et Model sont des objets Python bruts et sérialisés, un format que seul Soya peut lire ou écrire.

Cependant, Soya peut importer des modèles Blender automatiquement. Si un fichier <data> / blender / votre nom de fichier modèle.blend existe et que le fichier modèle n'existe pas (ou est plus ancien), Soya charge les fichiers Blender et met en cache le modèle obtenu dans <data> / models / votre nom de fichier modèle. .da

Cette fonctionnalité est appelée "exportateurs automatiques"; pour plus de détails sur les exportateurs automatiques ou la gestion des données, voir le chapitre 3, et pour plus de détails sur l’utilisation de Blender avec Soya, voir le chapitre 5.

Si vous appelez plusieurs fois Model.get avec le même argument de nom de fichier, Soya ne charge pas le modèle deux fois mais renvoie le même objet (mis en cache). C'est bien puisque les modèles sont immuables.

2.5 Affichage de modèles avec des corps

Les modèles ne peuvent pas être directement affichés à l'écran; vous devez les mettre sur un corps. Vous pouvez créer un corps comme suit:

your_body = soya.Body (parent, modèle) où parent est le monde dans lequel le corps est ajouté et modèle est le modèle à afficher (les deux sont définis par défaut sur Aucune). Pour tous les constructeurs d'objets 3D (dérivés de CoordSyst), le premier argument est le monde parent. Il est possible de réparer un CoordSyst, et le monde parent actuel est accessible via l'attribut parent.

Le modèle affiché par un corps peut être obtenu ou défini via l'attribut de modèle:

your_body.model = soya.Model.get ("votre_second_model_filename")

Les corps permettent d'afficher plusieurs fois le même modèle. Par exemple, pour afficher deux épées au lieu d'une, vous pouvez utiliser l'arborescence suivante:

Scène du monde

|

+ - Body sword1, affichant l'épée Modèle

|

9

+ - Body sword2, affichant l'épée Modèle

|

+ - lumière lumière

|

+ - caméra caméra

Et voici le code (set xyz et rotation y sont utilisés pour positionner les deux corps et seront vu dans la section suivante; l'extrait de code n'inclut pas la scène, Light, Camera et MainLoop, qui sont identiques à la première scène "exemple):

sword_model = soya.Model.get ("épée")

sword1 = soya.Body (scene, sword_model)

sword1.set_xyz (1.0, 0.5, 0.0)

sword1.rotate_y (90.0)

sword2 = soya.Body (scene, sword_model)

sword2.set_xyz (1.0, -0.5, 0.0)

sword2.rotate_y (90.0)

2.6 Déplacer, faire pivoter et mettre à l'échelle les CoordSyst

Les méthodes de déplacement, de rotation et de mise à l'échelle appartiennent à la classe CoordSyst et sont héritées de toutes les classes enfants CoordSyst.

Cette section présente les méthodes les plus courantes de déplacement, rotation et mise à l’échelle; pour une référence complète, voir section 2.13.3.

2.6.1 Conventions de soja

  • Le cas échéant, Soya considère toujours X comme direction à droite, Y comme direction du haut, Z comme direction de l’arrière et donc -Z comme direction de l’avant (Soya utilise -Z pour l’avant afin de garder tous les systèmes de coordonnées à droite. à la main, juste pour éviter un nighmare mathématique interne).
  • Tous les angles sont exprimés en degrés.
  • Dans Soya, une position 3D est définie par trois valeurs X, Y, Z et le CoordSyst dans lequel elles sont exprimées. X, Y, Z seuls ne suffisent pas pour créer une position 3D.
  • Par défaut, une distance de 1,0 correspond à environ un mètre, bien que vous puissiez choisir une convention différente.



0