Script
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -50%
-50% Baskets Nike Air Huarache
Voir le deal
64.99 €

Programmer sur Script (partie 8)

Voir le sujet précédent Voir le sujet suivant Aller en bas

Tutoriel Programmer sur Script (partie 8)

Message par Morgan9195 Mer 13 Mar - 6:32

Programmer sur Script (partie 8)
Les cameras 3D



J'ai pas terminé la rédaction des tutoriels sur la 2D, il va me falloir un peu de temps pour organiser la suite. En attendant je vous propose de déjà apprendre la 3D. Normalement, vous auriez pu être capable d'apprendre la 3D avant même d'apprendre la 2D, mais je comptais à vous enseigner les bases de 2D qui sont aussi utilisées en 3D.

Commençons tout d'abord par passer en mode "dessin 3D" avec une fonction que je vous ai parlé au début du tutoriel sur la 2D, la fonction draw_3D();
Cette fonction est semblable à draw_2D(); sauf qu'elle active tout simplement la 3D au lieu de la 2D.

Code:

draw_3D();
light(false);

Nous allons désactiver les lumières 3D pour le moment, nous verrons comment les utiliser plus tard car il s'agit de fonctions assez avancées en 3D.
à la suite de ces deux lignes, nous allons directement placer la camera. Vous pouvez la placer où vous voulez dans le code, mais pour ne pas oublier de la placer et pour la retrouver facilement, je vous conseille de la placer dès le début du code 3D.

Il existe plusieurs fonctions pour placer la camera. Actuellement, il y en a 4, 2 complexes et 2 simplifiées par Script.

Je commence par vous expliquer en détail les 2 fonctions simplifiées, puis nous aborderons peu à peu les fonctions plus compliquées.

Les deux fonctions que j'ai créé dans Script pour vous simplifier l'utilisation des cameras sont:
- camera_3D_fps(active);
- camera_3D_tps(active);

Rien que leur nom vous informe déjà sur le type de camera que la fonction affiche.
Le mot "active" est à remplacer par true ou false tel que:
true: camera qui suit les déplacements de la souris et du joueur
false: camera figée, prête à être manipulée par le code (pour faire une cinématique par exemple)

- Les variables x, y et z indiquent la position de la camera. Vous devez déplacer le joueur vous même, la fonction de la camera n'inclus pas les déplacements.
- La variable angle_camera est l'angle qui penche la camera à droite ou à gauche (par exemple pour un effet de mort), valeur comprise entre -10 et 10.
- La variable zdir désigne la rotation de la tête du personnage, du haut vers le bas.

Et voila, je ne vois pas comment vous faciliter encore plus ces fonctions.
Passons maintenant aux deux fonctions compliqués, les fonctions que j'ai utilisé pour créer les deux fonctions simplifiées. Il n'est pas nécessaire de connaitre les deux fonctions suivantes pour faire de bonnes cameras 3D, mais ça peut permettre de personnaliser un peu plus vos jeux (vous pourrez par exemple faire des cameras de vue FPS aérien, pour faire des jeux d'avions, ce qui est possible avec les fonctions simples mais un peu compliqué).

Il nous reste donc deux fonctions de camera 3D. Je commence par vous partager la plus simple des deux.

d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup);

Dans cette fonction, vous devez indiquer le point de vue de départ, le point de vue de la direction à suivre et le vecteur haut.

xfrom, yfrom, et zfrom sont les coordonnées de la camera, on y place souvent les valeurs x, y et z.
xto, yto, et zto sont les coordonnées du point que la camera regarde. Pour une camera de vue FPS, le calcul de ces coordonnées se fait par le sinus et le cosinus de la variable "direction".
xup, yup, et zup désignent le vecteur haut.
Voici un exemple de camera qui peut vous aider à comprendre l'utilisation de cette fonction:

Code:

d3d_set_projection(20,10,20,0,0,0,0,0,1);

Dans cet exemple, la camera se situe aux coordonnées 20,10,20 , elle vise le point 0,0,0 , et le vecteur haut est 0,0,1 .
Si vous ne comprenez pas bien ce qu'est le vecteur haut. laissez y les mêmes valeurs que moi.

Voici maintenant la dernière fonction qui affiche une camera 3D, la plus complexe mais aussi la plus maniable:

d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect,znear,zfar);

xfrom, yfrom, zfrom, xto, yto, zto, xup, yup, et zup sont identiques à ceux de la fonction précédente, mais d'autres arguments ont été ajoutés à la suite.

L'argument "angle" est le champ visuel, c'est à dire la largeur de champ de l'objectif de la caméra. La valeur raisonnable est de 45, mais je vous encourage à modifier cette valeur pour mieux comprendre son utilité.
L'argument "aspect" est le ratio d'aspect entre la projection horizontale et verticale. Vous souhaiterez surement utiliser la même valeur que le ratio de l'aspect de la taille de la fenêtre, voici donc les dimensions de la fenêtre: room_width/room_height .
"znear" et "zfar" sont les distances de vue de la camera. Tout ce qui sera au delà de la distance zfar sera invisible, ce qui empêche le jeu de laguer. znear est la distance minimale de vue. Par exemple, si vous placez votre camera dans un personnage, la distance minimale vous permet de ne pas voir votre nez, ou encore la texture de votre visage (très pratique pour être vu par les autres en multijoueur, mais sans se voir soi même).
Si vous créez une plage de valeurs trop grandes, la précision sera mauvaise. Il est donc fortement conseillé d'en prendre soin.

Placer une camera 3D dans l'espace c'est bien, mais c'est un peu inutile si vous vous arrêtez là. L'espace étant vide pour le moment, la camera n'observera que du vide, donc du noir.
C'est pourquoi la suite vous expliquera comment afficher des formes 3D.

Suite disponible prochainement...
Morgan9195
Morgan9195
Fondateur
Fondateur

Messages : 168
Date d'inscription : 11/02/2013
Age : 28
Localisation : Entre le fauteuil et le clavier

Projet(s)
Niveau de connaissances dans Script: Professionnel
Spécialité: Programmeur

http://morgan9195.olympe.in/devblog/

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum