Bonjour,

J'ai posté ce message dans un autre forum de Développez.com d'abord, petite erreur qu'un membre m'a gentillement fait remarquer, désolé, donc je reposte ici

************************************
Bonjour,

J'ai commencé il y a peu à m'intéresser à la 3D avec Delphi. Je n'ai actuellement aucun projet très particulier en tête, je préfère déjà voir ce que j'arrive à faire lol

J'ai votre version de Delphi 2005 sur laquelle j'ai installé les composants Asphyre, d'après ce que j'ai cru comprendre il y a des chances pour que ce choix de librairie 3D soit avantageux ? bref.

J'ai donc créé un monde tout simple : juste un plan ! mdr, mais ça suffit pour tester les premières fonctions.

J'ai ajouté un objet sous forme de "matrix" que j'ai appelé persogol (un personnage bien gogol fait à la va-vite avec anim8or (logiciel pour créer facilement des objet 3D en plusieurs formats, notament le .3ds qui peut être converti ensuite en .mesh pour être utilisable par Asphyre. Téléchargeable sur www.anim8or.com)
Je déclare les coordonnées de ce personnage avec ces variables globales :
// Coordonnées
PersoX := 0;
PersoY := 25;
PersoZ := 0;
// Angle
PersoAX := 0;
PersoAY := 0;
PersoAZ := 0;

Je place devant lui un curseur (invisible lol, je n'ai pas réussi à afficher mon PNG) à une distance de 50 (50 quoi ? Pixel ?? je ne sais pas vraiment)
// On initialise les coordonnées du curseur :
CurseurD := 50;
CurseurX := PersoX + CurseurD*sin(PersoAY) + CurseurD*cos(PersoAZ);
CurseurY := PersoY + CurseurD*cos(PersoAX) + CurseurD*sin(PersoAZ);
CurseurZ := PersoZ + CurseurD*sin(PersoAX) + CurseurD*cos(PersoAY);

Je créé ensuite une caméra dont les coordonnées suivent celles du personnage et orientée vers le curseur (qui n'est ni plus ni moins qu'une coordonnée 3D finalement)


J'ai ajouter un clavier et une sourie asphyre.
Les touches :
W : avancer
S : reculer
A : gauche (sans rotation)
D : droite (sans rotation)
La sourie gère la rotation autour de l'axe horizontal (donc vue vers le haut ou le bas) et autour de l'axe vertical (donc gauche ou droite)



Actuellement, mon personnage peut se déplacer et tourner donc.
Par contre j'ai deux soucis que je n'arrive pas à résoudre, ça fait des heures et des heures que je tourne en rond.
Lorsque je déplace la sourie sur les côtés le curseur suit bien (pas le curseur que vous avez en lisant ce message, mon fameux curseur invisible qui devrait toujours être au centre de l'écran... comme un viseur en fait ! lol), le personnage tourne (par contre on ne le voit plus, étant donné que la caméra est "en lui" il fallait que je désactive l'affiche du perso) donc la caméra est bien accès vers ce fameux cuseur.
Le premier hic est là... ça ne fonctionne pas sur lorsque je déplace la sourie en avant ou en arrière. Ma "formule" est incorrecte et je ne suis pas assez calé en trigo pour résoudre ça, j'ai fait énormément d'essaies mais pas le bon apparement.

le deuxième hic, c'est pour le déplacement avec le clavier. le personnage se déplace, le curseur suit le mouvement mais le déplacement du perso ne prend pas en compte l'angle dans lequel il se trouve depuis que j'ai bougé ma sourie sur les côtés ! La cata, le personnage ne se déplace donc pas dans le sens du curseur....

Voila mes deux soucis actuels (d'autres viendront c'est sûr )

Pour info :

Pour détecter les mouvements de la sourie :
// Axe horizontal
MouseDisplace := AsphyreMouse.displace;
if MouseDisplace.X < -1 then DeplacementAX := -1;
if MouseDisplace.X > 1 then DeplacementAX := 1;
// Axe vertical
DeplacementAY := MouseDisplace.Y;
if MouseDisplace.Y < -1 then DeplacementAY := 1;
if MouseDisplace.Y > 1 then DeplacementAY := -1;

Pour détecter les touches du clavier :
if AsphyreKeyboard.Key[DIK_A] then DeplacementX := -2;
if AsphyreKeyboard.Key[DIK_D] then DeplacementX := 2;
if AsphyreKeyboard.Key[DIK_S] then DeplacementZ := -2;
if AsphyreKeyboard.Key[DIK_W] then DeplacementZ := 2;
if AsphyreKeyboard.Key[DIK_SPACE] then DeplacementY := 2;
if AsphyreKeyboard.Key[DIK_C] then DeplacementY := -2;

Le calcul des angles de rotation :
PersoAX := PersoAX + 0.1*DeplacementAZ;
if PersoAX > 360 then PersoAX := PersoAX - 360;
if PersoAX < 0 then PersoAX := PersoAX + 360;
PersoAY := PersoAY + 0.1*DeplacementAX;
if PersoAY > 360 then PersoAY := PersoAY - 360;
if PersoAY < 0 then PersoAY := PersoAY + 360;
PersoAZ := PersoAZ + 0.1*DeplacementAY;
if PersoAZ > 360 then PersoAZ := PersoAZ - 360;
if PersoAZ < 0 then PersoAZ := PersoAZ + 360;

Déplacement du perso :
if DeplacementX <> 0 then PersoX := PersoX + DeplacementX + 2*sin(PersoAY);
if DeplacementZ <> 0 then PersoZ := PersoZ + DeplacementZ + 2*cos(PersoAY);

(2 * le cos ou sin parce que pour le déplacement par clavier la valeur est de 2, alors qu'avec la sourie j'ai mit 1 pour que ça ne tourne pas trop vite)

Et enfin le nouvel emplacement du curseur après un déplacement ou une rotation :

CurseurX := PersoX
+ CurseurD*sin(PersoAY)
+ CurseurD*cos(PersoAZ)
;
CurseurY := PersoY
+ CurseurD*sin(PersoAX)
+ CurseurD*cos(PersoAZ)
;
CurseurZ := PersoZ
+ CurseurD*sin(PersoAX)
+ CurseurD*cos(PersoAY)
;

(CurseurD est la distance séparant le curseur du perso, le curseur se déplaçant donc sur une sphère de diamètre 100 dans mon cas, autour du personnage)


J'ignore si pour vous tout ce que j'écris là est bien compréhensible, moi j'ai écris tout ce code donc je sais ce que chaque élément doit représenté donc si quelque chose doit être éclairci n'hésitez pas à me le dire.

Merci beaucoup à quiconque saura me mettre sur la voie. Personnellement je pense que les deux problèmes viennent de mes calculs de rotation, lorsque je bouge la sourie. Dure dure ... si j'avais su j'aurai sans doute plus bossé ma trigo à l'école lol

PS : pour ma "formule" je me suis basé sur ça :
x = r * cos(D)
y = r * sin(D)
Est-ce une bonne formule ou celle-ci n'est appliquable que pour le 2D, ce qui expliquerait en partie mes soucis dans la 3D ?