PDA

Voir la version complète : rotation referentiel camera editeur



mamy
04/07/2007, 11h05
bonjour braves programmeurs de cette board

voila j'ai un autre souci de programmation

je voudrais faire tourner mon objet dans le referentiel de ma camera. En gros quel que soit la position de la camera editeur (donc l'oeil de l'observateur), je voudrais que mon objet tourne a gauche (celle de l'observateur) si on lui demande de tourner a gauche, bascule vers l'avant, etc...

parce que la a priori la rotation par defaut se fait suivant le referentiel de l objet lui meme donc pour peu que l'observateur se situe a l'opposé de la direction de l'axe de rotation, celle-ci se fait du coup dans le mauvais sens ( gauche objet = droite observateur par exemple )

j'ai deja essayé un peu tous les moyens que l api de c4d met a disposition (y compris les quaternions) mais rien n'y fait

si quelqu'un a une idée pour me debloquer ce serait sympa

teg
04/07/2007, 11h11
met ton objet dans un Null.
Met ton Null enfant de la camera, avec le même referentiel.

Et ainsi tu fait tourner le null et non plus la camera.

mamy
04/07/2007, 11h22
wow merci pour cette reponse rapide
par contre euh, quand tu dis de le mettre dans un null, ca correspond a quoi exactement? je veux dire, c'est quel type ( ah oui j ai oublié de precisé, je programme sous c++, mais je suppose que si c'est une solution coffe je dois assez aisement trouver une equivalence)

alkodu57
04/07/2007, 11h27
A la premiere lecture, ca me parraissait assez clair, mais alors apres .... :?
Ce que tu dis teg, ne semble pas marcher (si j'ai bien compris ... :oops:)
En fait, avec ce que tu dis mamy, tu veux que l'objet soit immobile, non ? Si c'est pas ca, alors j'ai pas compris ce que tu viens de dire :wink:
Voila, en esperant plus d'explications pour trouver une solution :odile:

mamy
04/07/2007, 11h30
A la premiere lecture, ca me parraissait assez clair, mais alors apres .... :?
Ce que tu dis teg, ne semble pas marcher (si j'ai bien compris ... :oops:)
En fait, avec ce que tu dis mamy, tu veux que l'objet soit immobile, non ? Si c'est pas ca, alors j'ai pas compris ce que tu viens de dire :wink:
Voila, en esperant plus d'explications pour trouver une solution :odile:


non ce que teg disait correspond il me semble a ce que je cherche a faire
justement il ne faut pas que l'objet soit immobile, je veux le faire tourner mais toujours dans les directions qui correspondent a celles de l observateur

Aurety
04/07/2007, 11h35
Un null = objet neutre ( pas d'histoire de programmation là ) :wink:

mamy
04/07/2007, 11h38
Un null = objet neutre ( pas d'histoire de programmation là ) :wink:


ok merci bien :efface:

oli_d
04/07/2007, 13h15
Salut,

pour ce qui concerne le COFFEE, si tu charges la doc du SDK sous le chapitre tutorials il y a un tutorial qui traite des matrices ("Using matrices").

En résumé tu as trois types :

objet->GetMl(); // retourne la matrice en coordonnées locales
objet->GetMg(); // retourne la matrice en coordonnées globales
objet->GetUpMg(); // retourne la matrice de l'objet parent en coordonnées globales

donc si tu veux travailler en global, récupère la matrice avec GetMg()

Pour récupérer la rotation de l'objet, utilise la fonction GetHPB() :


var matrice=objet->GetMG();
var rot =matrice->GetHPB();

GetHPB() renvoie un vecteur x,y,z avec les valeurs en radians :


println(Degree(rot.z)); //renvoie la valeur de rotation B en degrés


Pour modifier l'angle il faut utiliser la fonction SetRotHPB(vecteur) mais attention car cette fonction remet la position à 0 et l'échelle à 1. Il faut d'abord récupérer les deux auparavant. La fonction suivante le fait :


SetGlobalRotation(objet, rot)
{
var matrice = objet->GetMg();
var pos = matrice->GetV0(); //on récupère la position du point d'origine
var echelle = vector(vlen(matrice->GetV1()), //on récupère les échelles dans les trois axes
vlen(matrice->GetV2()),
vlen(matrice->GetV3()));

matrice->SetRotHPB(rot); //on affecte la rotation à la matricee

matrice->SetV0(pos); // on réaffecte les paramètres récupérés auparavant
matrice->SetV1(vnorm(matrice->GetV1()) * echelle.x);
matrice->SetV2(vnorm(matrice->GetV2()) * echelle.y);
matrice->SetV3(vnorm(matrice->GetV3()) * echelle.z);

objet->SetMg(matrice); //on applique la matrice modifiée à l'objet
}


Ensuite si je veux bouger mon objet de 10° en Rot B :


main(doc,op)
{
var m=op->GetMg();
var rot=m->GetHPB();
rot.z=Radians(10)+rot.z;
SetGlobalRotation(op,rot);
}

Pour le C++ cela doit être le même principe.

Je pense que tu devrais d'abord te mettre au COFFEE, et une fois les grands concepts bien assimilés passer au C++.

Bonne programmation !

mamy
04/07/2007, 13h30
Je pense que tu devrais d'abord te mettre au COFFEE, et une fois les grands concepts bien assimilés passer au C++.

Bonne programmation !



en fait pour la comprehension des concepts, je pense que ca reste independant du langage donc c++ ou coffee c est pareil
pour ce qui est de ta solution je t'en remercie, il me semble avoir testé une solution similaire deja a quelques details pres mais je vais voir, j'ai peut etre oublié quelques points

base80
04/07/2007, 15h01
Je pense que tu devrais d'abord te mettre au COFFEE, et une fois les grands concepts bien assimilés passer au C++.

Bonne programmation !


Je pense que tu devrais essayer un bete Null(neutre) avant de te jeter dans le coffee, c'est chaud le coffee

Tengaal
04/07/2007, 16h45
je viens de relire le message de départ de ce sujet, et j'ai l'impression que ce que tu cherche c'est juste de changer le sens de rotation de ta vue finallement...

Tu as essayé d'aller dans les préférences générales puis dans la rubrique "généralités", cocher la case "inverser l'orbite" ?

Quand je relis ton message de départ, ça me fait penser à ça, mais peut-être que je suis à côté... :roll:

mamy
04/07/2007, 16h58
je viens de relire le message de départ de ce sujet, et j'ai l'impression que ce que tu cherche c'est juste de changer le sens de rotation de ta vue finallement...

Tu as essayé d'aller dans les préférences générales puis dans la rubrique "généralités", cocher la case "inverser l'orbite" ?

Quand je relis ton message de départ, ça me fait penser à ça, mais peut-être que je suis à côté... :roll:


non non c'est pas du tout ca en fait
c'est vrai que c'est pas evident a expliquer sans une demonstration de visu (et du coup encore moins evident a comprendre)
imagine toi en face de quelqu'un qui regarde vers toi et a qui tu dis de se tourner a droite, il tournera donc a sa droite, qui est ta gauche... et la est tout mon probleme: lorsque mon objet est face a moi et que je le fais tourner a droite, il tourne a ma gauche.

n'oublions pas le contexte, je manipule l'objet via la programmation pas via l'interface graphique donc pas de case a cocher ni a decocher helas :cry2:

base80
04/07/2007, 17h02
Quand Tengaal dit "l'orbite" je... :love: :love:

oli_d
04/07/2007, 17h51
c'est vrai que c'est pas evident a expliquer sans une demonstration de visu (et du coup encore moins evident a comprendre)

c'est vrai que dans ma réponse j'avais compris que tu essayais de faire un plug du type plan qui se tourne toujours face à la caméra et qui bouge avec et pis en plus qui cire les pompes et fait le café.... J'ai encore envoyé un missile pour éliminer un morpion ....



tu dis de se tourner a droite, il tournera donc a sa droite, qui est ta gauche... et la est tout mon probleme: lorsque mon objet est face a moi et que je le fais tourner a droite, il tourne a ma gauche

mais si il ne fait pas ce que tu lui dis de faire, demande lui simplement de faire l'inverse c'est à dire moins l'angle, non ?
Dans mon exemple remplace rot.z=Radians(10)+rot.z; par rot.z=Radians(-10)+rot.z; et il tournera dans l'autre sens.

mamy
04/07/2007, 18h19
mais si il ne fait pas ce que tu lui dis de faire, demande lui simplement de faire l'inverse c'est à dire moins l'angle, non ?
Dans mon exemple remplace rot.z=Radians(10)+rot.z; par rot.z=Radians(-10)+rot.z; et il tournera dans l'autre sens.



la camera ne sera pas toujours devant ou derrierre l objet, la camera bougera et selon comment l'utilisateur le placera il aura un certain angle avec l objet qui fait que se contenter de faire + ou - ne servira pas a grand chose malheureusement

Tengaal
04/07/2007, 18h20
Ah ok, donc en fait tu veux reproduire le principe du miroir finallement, je suis devant le miroir je tourne la tête vers la droite, mon image tourne également vers ma droite.

ben dans ce cas en Xpresso:
- tu places ton objet Camera avec en sortie les 3 ports coordonnées-> rotation globales H, P et B
- tu places également ton objet à faire tourner, avec en entrée les 3 ports coordonnées-> rotation globales H, P et B
- dans les fonctions Xpresso (Xpool -> calculer) tu vas chercher 3 fois le noeud "negation"
- enfin tu connectes chaque port H, P, B de la camera vers chaque noeud negation qui se connecte à chaque entrée H, P, B de ton objet

en gros, ici, tu inverse le signe pour chaque composante de la rotation tout simplement.
maintenant si tu tournes ta caméra, l'objet tourne à l'inverse, la position de la caméra n'a pas d'influence.

je sais pas si c'est bien ça que tu cherches mais bon, c'est une solution simple en tout cas... :wink:

mamy
04/07/2007, 18h22
c'est vrai que c'est pas evident a expliquer sans une demonstration de visu (et du coup encore moins evident a comprendre)

c'est vrai que dans ma réponse j'avais compris que tu essayais de faire un plug du type plan qui se tourne toujours face à la caméra et qui bouge avec et pis en plus qui cire les pompes et fait le café.... J'ai encore envoyé un missile pour éliminer un morpion ....



et je ne m'adressai pas specialement a toi pour ce qui etait de l explication mais a tengaal

paspas
05/07/2007, 14h22
salut

je dis ça de mémoire tengaal

mais ça sera uniquement possible si l objet moteur est immobile si tu utilise H P B avec un objet en mouvement gare au " Gimball effect "
pour ta solution tengaal ,
je pense que l' objet miroir doit être enfant de l' objet moteur et utiliser la rotation et pas la rotation globale mais je dit ça sans teste

sinon faut passer par la matrice globale


sur un autre topic (http://www.frenchcinema4d.fr/forum/index.php?topic=19342.0) j avais fait ça faudrait juste inversé certains axe


vidéo (http://www.deltazone.org/~fc4d/autres/paspas_filaplomb2.avi)

fichier (http://www.deltazone.org/~fc4d/c4d/paspas_Logo.c4d)


pour les xpresiophyle

http://www.deltazone.org/~fc4d/images/paspas_Xpresso.jpg



dis moi ce qui marche

paspas

Tengaal
05/07/2007, 15h12
je n'ai pas testé si l'effet gimbal apparaissait avec ma méthode, théoriquement non, car la rotation de l'objet est l'inverse de la rotation de la caméra, donc si l'objet bascule, c'est que la caméra a basculé avant (dans le cas d'un ciblage de camera par exemple).
Logiquement l'objet ne devrait pas basculer, ses rotations ne sont pas "dynamiques" en fonction d'une cible, mais plutôt "absolues" avec un lien de transfert de valeurs de rotation d'un objet vers un autre, donc le déplacement de l'objet n'a pas d'influence sur sa rotation...

Mais là encore tout dépend le but précis recherché dans la question de départ, et si en effet il faut passer par une autre méthode...

par contre quand je regarde ta video d'exemple, je vois juste un objet orienté en permanence face à la caméra, on fait la même chose avec un tag"cible" ou alors un tag "pointer vers la camera"... ou alors il y a une subtilité que j'ai pas capté dans ton Xpresso...

paspas
05/07/2007, 23h20
salut tengaal

en fait ton tag cible ( mais je connais pas bien ,en général je les fait moi même en cofee :mrgreen:)$

dans mon exemple

si tu met un tag cible celui ci fait orienter vers la caméra si celle ci ce déplace ,
si tu fait une rotation de la caméra le texte ne bouge pas vus que le texte est tj aligne au centre de la camera ,vu que c'est lui qui est ci blé (la position globale de la cam )

dans mon exemple le texte serra tj orienter vers la cam si celui ci arrive dans sons champs de vision et bien sur celui ci reste tj a la même place car si tu met le texte en enfant de la cam celui si restera évidemment face caméra mais pas a la même place

imagine une bulle de bande dessinéedans un espace 3D celui ci dot tj reste attache a son personnage et face camera pour la
lecture :wink:
je ne pense pas que le tag cible puisse le fait ( le tag pointer camera jamais tester :mrgreen:)

paspas

Tengaal
06/07/2007, 01h14
(...)
imagine une bulle de bande dessinéedans un espace 3D celui ci dot tj reste attache a son personnage et face camera pour la
lecture :wink:
je ne pense pas que le tag cible puisse le fait ( le tag pointer camera jamais tester :mrgreen:)

paspas
ben l'exemple de la bulle c'est justement ce que fait le tag cible, il oriente en permanence l'axe Z d'un objet vers un autre objet, donc vers une caméra si on le souhaite. Le tag "pointer vers la caméra" est une version dérivée du tag cible qui s'oriente vers la caméra de la vue de travail (objet camera du projet), ou même quand c'est la caméra utilisateur.

Donc ces 2 tags permettent bien d'avoir un objet distinct de la caméra, qui a une position indépendante de la caméra, qui sera donc toujours face à la camera, le fait que la caméra tourne ne nécessite pas la rotation de l'objet, il sera de toute façon face au spectateur... C'est le déplacement de caméra qui implique l'orientation de l'objet vers elle.

on les utilise notamment pour faire du "facing" avec les particules, on créé une particule genre rectangle orienté dans le plan XY avec map alpha dessus (fumée par exemple) et un tag "pointer vers la caméra", et ensuite on peut créer des flux (nuages, fumées) toujours face à la caméra, c'est notamment ce qui est utilisé pour les effets de fumées en jeux video la plupart du temps.


en fait ton tag cible ( mais je connais pas bien ,en général je les fait moi même en cofee Mr. Green)$
ah... ben tu sais qu'il plein de trucs sympa dans C4D qui sont déja tout prêts, sans avoir à ré-inventer la roue en permanence ? :lol: :wink:
bon allez, j'y retourne il faut que je termine mon programme de création de cubes, ensuite il faut que je développe un générateur de sphère ! :mrgreen:

paspas
06/07/2007, 02h58
tengaal :oops: je comprend pas comment tu arrive a le faire avec un tag cible

avec le tag cible c' est comme si on tirait une ligne du centre de l objet au centre de la cible et l' axe Z de l objet se met sur cette ligne imaginaire

mon expresso permet d' aligner les deux axe Z celui de l objet et celui de la cible sans pour cela que l' axe Z de l' objet soit sur cette ligne imaginaire
ce qui permet a mon texte d' être toujours parallèle au plan de la caméra


si tu a le fichier qui était avec la vidéo , retire la cible de la cam , met toi dans caméra de la vue

sélectionne la caméra et fait lui faire des rotations sur elle même , et regarde le texte . :wink:


paspas

oli_d
06/07/2007, 10h58
En relisant les posts il me semble quand même que j'avais bien compris, il s'agit de faire tourner un objet selon les axes de la caméra, et non pas selon les axes de l'objet ou du monde.

Pour éclairer mes propos et j'ai fait un petit Xpresso contenant du COFFEE commenté :http://campus.hesge.ch/eil/e-eil/od/RotCamera.zip

Dans les données utilisateurs de la caméra, il y a un curseur pour choisir l'angle et trois cases à cocher/bouton pour effectuer une rotation selon les axes de la caméra, et un lien pour l'objet à tourner.

J'espère que cela t'aidera, et si c'est toujours pas ça, cela m'aura au moins permis de me mettre les idées plus ou moins au clair sur les matrices en COFFEE.

Tengaal
06/07/2007, 11h13
tengaal :oops: je comprend pas comment tu arrive a le faire avec un tag cible

avec le tag cible c' est comme si on tirait une ligne du centre de l objet au centre de la cible et l' axe Z de l objet se met sur cette ligne imaginaire

mon expresso permet d' aligner les deux axe Z celui de l objet et celui de la cible sans pour cela que l' axe Z de l' objet soit sur cette ligne imaginaire
ce qui permet a mon texte d' être toujours parallèle au plan de la caméra

ah oui t'as pas compris, je ne parle pas de mettre un tag cible sur la caméra pour viser l'objet, car là en effet l'objet sera toujours en plein milieu du cadrage (sur l'axe optique) donc c'est la caméra qui tournera autour de l'objet, mais d'utiliser une caméra normale sans cible, et c'est l'objet qui porte le tag cible, donc qui s'oriente vers la caméra. Idem pour l'utilisation du tag "pointer vers la camera".
Dans ce cas de figure l'objet face à la caméra n'est pas forcément en plein milieu de champs de vision, il peut être n'importe où.

une illustration pour expliquer...
le texte est toujours orienté vers la caméra, quelque soit les positions des 2, donc il se trouve toujours sur la tagente du cercle imaginaire centrée sur la caméra, donc concrètement il est toujours face au spectateur même si il n'est pas centré dans le cadre.
sur mon screenshot, c'est la focale qui déforme le texte sur les bords du cadre.


[Fichier joint supprimé par l'administrateur]

paspas
06/07/2007, 12h49
OK

mais y a quand meme une grosse difference avec ma methode tengaal c est que la position du texte dans ma solution est simulee par le trai rouge

et donc tj paralele au plan du la camera

paspas

[Fichier joint supprimé par l'administrateur]

mamy
06/07/2007, 13h15
merci tengaal et paspas pour toutes ces reponses, sauf que voila, l'objet (et la camera) je les manipule par programmation donc je ne crois pas (corrigez moi si je me trompe) que je puisse me servir de Xpresso (et meme si je pouvais, j avoue que je n'ai aucune idée de comment ca s'utilise)

pour vous situer le contexte, en gros je dois créer un plug qui recupere les données d'un materiel type joystick et les transfère a C4D pour les mouvements de rotation et trranslation. Pour les translations, pas de souci mais pour les rotations, ben ce sont les problèmes dont je vous ai parlé.

j'ai bien une autre question liée a ca mais j'ai cru comprendre que personne n'a encore programmé des plugs en c++. Enfin je la pose quand même: quelqu'un connaitrait une methode propre pour rafraichir la scène a chaque modification (par setRot, setPos, setMg enfin peu importe la fonction) de la position du sujet? ou alors en COFFEE ca se fait tout seul?

oli_d
06/07/2007, 13h24
mamy,

Est-ce que tu as vu mon dernier post plus haut, j'ai écrit un bout de code qui devrait je l'espère répondre en partie à tes préoccupations de rotation (il faut ouvrir le tag Xpresso de la caméra, il y a un noeud COFFEE qui contient le code)

Pour ce qui est de la gestion des évènements en c++, je ne peux malheureusement pas y répondre.

mamy
06/07/2007, 13h25
mamy,

Est-ce que tu as vu mon dernier post plus haut, j'ai écrit un bout de code qui devrait je l'espère répondre en partie à tes préoccupations de rotation (il faut ouvrir le tag Xpresso de la caméra, il y a un noeud COFFEE qui contient le code)

Pour ce qui est de la gestion des évènements en c++, je ne peux malheureusement pas y répondre.



ah exact je ne l avais pas vu, merci je vais voir ca de suite

mamy
06/07/2007, 13h37
mamy,

Est-ce que tu as vu mon dernier post plus haut, j'ai écrit un bout de code qui devrait je l'espère répondre en partie à tes préoccupations de rotation (il faut ouvrir le tag Xpresso de la caméra, il y a un noeud COFFEE qui contient le code)

Pour ce qui est de la gestion des évènements en c++, je ne peux malheureusement pas y répondre.



ah exact je ne l avais pas vu, merci je vais voir ca de suite


euh sauf que dans ton zip j'ai un fichier c4d ( y a pas de source? ou alors si c'est la source je l'ouvre comment? )
desolé si mes questions parraissent stupides mais en fait je suis juste developpeur c++ sans connaitre tout de cinema 4d, je decouvre en meme temps que mon developpement ( et je n'ai malheureusement pas le temps de m'initier au COFFEE, je dois faire très vite)

oli_d
06/07/2007, 13h45
Enfin je la pose quand même: quelqu'un connaitrait une methode propre pour rafraichir la scène a chaque modification (par setRot, setPos, setMg enfin peu importe la fonction) de la position du sujet? ou alors en COFFEE ca se fait tout seul?

En fait j'avais ma lu la fonction en COFFEE c'est EventAdd() ([bool] EventAdd([[int] flags]));

les flags:

EVENT_FORCEREDRAW (Force a complete redraw)

EVENT_ANIMATE (Animate document)

EVENT_NOEXPRESSION (Don't execute expressions)

EVENT_CAMERAEXPRESSION (If this is set (and not EVENT_NOEXPRESSION), the event will only update camera dependant expressions (for faster speed).)

mamy
06/07/2007, 13h48
Enfin je la pose quand même: quelqu'un connaitrait une methode propre pour rafraichir la scène a chaque modification (par setRot, setPos, setMg enfin peu importe la fonction) de la position du sujet? ou alors en COFFEE ca se fait tout seul?

En fait j'avais ma lu la fonction en COFFEE c'est EventAdd() ([bool] EventAdd([[int] flags]));

les flags:

EVENT_FORCEREDRAW (Force a complete redraw)

EVENT_ANIMATE (Animate document)

EVENT_NOEXPRESSION (Don't execute expressions)

EVENT_CAMERAEXPRESSION (If this is set (and not EVENT_NOEXPRESSION), the event will only update camera dependant expressions (for faster speed).)





c'est la meme en c++...sauf que je dois pas m'en servir correctement parce que ca marche pas :cry2:
exemple:
mon joystick est a fond vers la gauche
reponse de l'objet: au lieu de tourner tout le temps sur lui meme, il attend que je relache le stick pour se mettre a la derniere position enregistrée snif

paspas
06/07/2007, 13h55
dsl mamy me suis un peut égare avec tegaal :oops:

pour les code voilas comment réaliser une matrice d' un objet dans c4d


var m = new (Matrix); // on crée une nouvelle matrice

m -> SetV0(p1); // position de l' objet
m -> SetV2(vnorm(p2-p1)) ; // on défini l'axe des y
m -> SetV1(Vnorm(vcross(p2-p1),vector(1,0,0)))); // on défini l axe des y perpendiculaire a l axe des y
m -> SetV3(Vnorm(vcross(p2-p1),vector(0,0,1)))); // on défini l axe des Z perpendiculaire a l axe des y

objet ->SetMg(m); // on rentre la matrice dans l objet


il faut imaginer ton joystick comme une barre verticale par faciliter prend une spline a deux point vertical de longueur 100

et tu rentre la matrice crée au dessus dans un null

au repos P1 = (0,0,0) position dans l espace de p1
et P2 = (0,100,0) position dans l espace de p2

si tu connait le vecteur direction tu le met direct a la place de p1-p2)

tu déplace P2 ( la longueur de la spilne n' a pas d importance vu que on ne récupère que le vecteur direction )

tu verra que les axe suive le mouvement ( normalement Y est parallèle a la spline )

je vais ça de mémoire sans tester , j espère ne pas me tromper


paspas



edit : avec cette methode ca devrait suivre en direct le mouvement

oli_d
06/07/2007, 14h10
euh sauf que dans ton zip j'ai un fichier c4d ( y a pas de source? ou alors si c'est la source je l'ouvre comment? )

Encore un truc que j'avais pas bien lu :

Ouvre le fichier c4d

1 : dans le gestionnaire d'objets il y a un objet nommé Caméra à droite il y a 2 logos double clique sur le second (c'est le tag Xpresso)
2: sélectionne le noeud COFFEE
3: clique sur le bouton pour ouvrir l'éditeur (voir première image ci-dessous)


EDIT :

pour atteindre les données utilisateurs sélectionne l'objet caméra, clique sur l'onglet données utilisateurs : (voir 2ème image)


[Fichier joint supprimé par l'administrateur]

mamy
06/07/2007, 15h21
Encore un truc que j'avais pas bien lu :

Ouvre le fichier c4d

1 : dans le gestionnaire d'objets il y a un objet nommé Caméra à droite il y a 2 logos double clique sur le second (c'est le tag Xpresso)
2: sélectionne le noeud COFFEE
3: clique sur le bouton pour ouvrir l'éditeur (voir première image ci-dessous)




cool merci bien :prie: