#0 

02-11-2009 22:41:34

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Bonjours a tous !
Cela fait un moment (environs 1mois et demis) que je veut faire tourner ma caméra autour de mon perso.
Je peut récupérer les positions de la caméra et du personnage, si vous pouviez me donner le code en C++ ça serait génial.

Hors ligne


#1 

03-11-2009 10:33:20

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Je ne sais pas si c'est moi mais je pige pas la fin. En tout cas le début est clair, tu veux qu'on fasse le boulot à ta place tongue
Enfin, bon samaritain que je suis je vais t'aider mais commence par nous expliquer ou tu en est. Depuis un mois et demi t'as du avancer un peu non?


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#2 

03-11-2009 15:34:30

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Bon, pour ce qui est de faire tourner un objet autour d'un point, ça je pense que cela doit le faire pour toi.
La ou tu dois plus certainement rencontrer un soucis, c'est d'arriver à faire pointer ta camera dans une direction choisie.

Voici un code qui oriente un node vers un autre (donc aussi une camera vers un node).

Code c++ :


PointNode(scene::ISceneNode *node1, scene::ISceneNode *node2, float roll)
{
    core::vector3df target = node1->getPosition();

    float x=target.X;
    float y=target.Y;
    float z=target.Z;

    float xdiff=node2->getPosition().X-x;
    float ydiff=node2->getPosition().Y-y;
    float zdiff=node2->getPosition().Z-z;

    float dist22=sqrt( (xdiff*xdiff) + (zdiff*zdiff) );
    float pitch=atan2(ydiff,dist22);
    float yaw=atan2(xdiff,zdiff);

    node1->setRotation(  core::vector3df(RAD2DEG(-pitch), RAD2DEG(yaw) , RAD2DEG(roll)) );
}



Voilà, je pense que cela devrait déjà t'aider wink


Force et sagesse...

Hors ligne


#3 

04-11-2009 22:14:49

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Ben en fait je ne suis pour l'instant qu'en 3°, donc je n'ai pas les connaissances en math nécessaire.
Pour l'orientation du Node, ça ne pose pas de problème (c'est un caméra que je fait tourner donc il me suffit d'un setTarget(); ), mon problème est bel et bien de faire tourner une caméra autour d'un perso.

Dernière modification par Ilovechocolat (04-11-2009 22:15:30)

Hors ligne


#4 

05-11-2009 00:37:10

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

3° ne veut rien dire, je savais faire ça a ton age yikes
bref je vais pas te "mâcher le travail" mais la solution est dans la Trigonométrie, et je sais que c'est a ton programme :-} ( comme dans le code de TMyke )
mais le plus simple et le plus rapide reste les matrices

enfin bon si tu commence la programmation ...
voila le code de la camera de irrlamb http://code.google.com/p/irrlamb/source … .cpp?r=380
mais tu verras vite que rien ne vaux c'est propre codes wink

Hors ligne


#5 

05-11-2009 09:22:24

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

+1 Magun c'est pas beau de demander qu'on te mache le boulot sans avoir chérché avant.
Par contre s'il te faut une explication précise y'a pas de souchis.


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#6 

05-11-2009 17:10:12

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Arrêtez de dire que je veut que vous me mâchez le travail, si je savait le faire je l'aurait fait seul, j'ai essayé et encore essayé mais j'y arrivait pas.

Je n'ai même pas encore appris les vecteurs quand a la trigonométrie, j'ai appris en fouillant dans mon bouquin, j'avais réussit a trouver petit calcul cependant le seul problème c'est que je tombait a chaque fois sur une longueur et jamais sur des coordonnées (je suis au début de l'année de 3°).

Sinon merci pour le code, je vais fouiller dedans .
Et si vous pensez que je suis apte a comprendre une explication je ne suis pas contre (mon problème se situe surtout a la conversion entre longueur et coordonnées).

Hors ligne


#7 

05-11-2009 17:32:52

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Bon, pas de soucis, on va essayer dans ce cas d'y aller en douceur. On va rester dans un environnement 2D pour le moment. Un peu comme si tu regardais ta scene
du dessus. Si tu veux que ta camera tourne autour d'un point, on va donc actualiser en permanence les coordonnées X et Z de ta camera.
Si on considère que ta camera tourne, et que tu connais l'angle de rotation à chaque instant (on va l'appeler ALPHA), alors on peut par exemple écrire ceci:

X = distance * cos(ALPHA)
Z = distance * sin(ALPHA)

La valeur distance est représentative de la distance entre ton point de rotation et ta camera. Facile non ? wink

Attention, ces coordonnées sont relative, à toi des les ajouter au coordonnées absolues de ta camera.


Force et sagesse...

Hors ligne


#8 

05-11-2009 20:42:54

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Cool, je savait pas que c'était si simple !
Merci !

Hors ligne


#9 

05-11-2009 21:51:46

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Je reposte par ce que ça marche pas, je ne sais pas pourquoi mais irrlicht me fait une grosse rotation une fois puis s'arrête de rotationner.

Code:

        long distance = sqrt(pow(posCamera->X, 2) + pow(posCamera->Z, 2));
        posCamera->X = distance * cos(0.5);
        posCamera->Z = distance * sin(0.5);

posCamera est un irr::core::vector3df qui correspond a la position de ma caméra par rapport a mon perso, elle est a chaque fois additionné a la position de mon perso.

Hors ligne


#10 

06-11-2009 02:39:57

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

aller on va fouiller un peut dans mais vieux codes pour me remémorer la chose ... ... alors att 2sec .... ... ( 37 dossier plus tard ) ... ... ...

on connais 2 vecteur et une valeur (distance) c'est bien cela ?
donc pour avoir la position de ta camera par rapport ah ton node "visé"
il faut calculer comme TMyke le précise, la position X, et Z via la rotation Y du node

imaginons la fonction suivante :

Code:

void updateRpgCameraFromPos(vector3df& newPos = vector3df(0,0,0))
{
         float distance = 12.f; //utilise les event mousse.weel si tu veut t'amuser ...
         vector3df NodePos = target->getPosition();
         vector3df CamRot = came->getRotation();

         newPos.X += distance * cos(CamRot.Y);
         newPos.Z += distance * sin(CamRot.Y);
         newPos.Y += 0.f; //diminue ou augmente la valeur si tu veut que cela soit plus ou moin haut par rapport au node
         newPos += NodePos; //comme ça la nouvelle position seras a partir de la position du node et non de 0

         came->setPosition(newPos);
         came->setTarget(NodePos);
}

jusque la ses claire ?
mais dit si je me trompe ... je n'utilise pas du tout se système ...

maintenant pour calculer la position en hauteurs il faut varier la distance suivant la rotation X (?) et changer la position Y de newPos ...
oui on change distance pour faire en sorte que la camera bouge autour d'une sphere enfin avis personnel aucunne obligation pour cela smile

bon tu nous diras si ta bien compris jusque la .. pasque bon ... smile
et j'espere que je me suis pas gourer (oui encore)

si c'est bon on expliqueras la suite

edit : a la rigueur TMyke cela pourrais faire un "tuto" ... c'est une question souvent demander il me semble
ps : serais tu faire la class en c++ ? vue que tu commence il serais bon que tu commence par ceux-ci et les templates (avis personnel yikes)

Dernière modification par Magun (06-11-2009 04:15:39)

Hors ligne


#11 

06-11-2009 20:54:10

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Ca m'a l'air parfait magun. Et bien optimisé de surcroit wink


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
90 invités en ligne
Aucun membre connecté
RSS Feed