PDA

Voir la version complète : Maintenir l'orientation d'un objet par



yaotchose
09/04/2007, 23h16
Bonjour à tous,

Voici le problème que mes souvenirs évanescents en trigonométrie ne m'autorisent plus à résoudre ;)

J'ai un objet que se déplace devant une caméra fixe; il est muni d'un tag "Cible" qui pointe sur la caméra. Je souhaiterais cependant que cet objet conserve un alignement constant par rapport à la caméra.
Je joins une scène qui montrera mieux mon problème : je voudrais que la sphère reste verticale quelque soit sa position à l'écran.

Merci d'avance pour vos réponses.



[Fichier joint supprimé par l'administrateur]

Yamp
10/04/2007, 00h12
Salut

Je crois que l'on peut résoudre en fixant la rotation de la sphère avec XPresso.

Voir la scène modifiée:

http://www.jcuadras-arquitecto.com/Consultas/contrainte_orientationYamp.c4d

Pascal
10/04/2007, 00h43
Si tu es en V10, tu peux désactiver le "pitch" dans les paramètres de la cible.

yaotchose
10/04/2007, 09h17
Merci pour vos réponses, c'est donc un problème de pitch !
mais malheureusement, je ne suis pas encore en v10...

Yamp, je n'arrive pas à ouvrir le fichier que tu as renvoyé avec ma 9.1, :?
Pourrais-tu poster une image si ce n'est pas trop abuser? Merci d'avance!

Yamp
10/04/2007, 20h43
Yaotchose: le fichier c'est de la version 10.0
Je te mets l'image, il est nécessaire que le node "constant" soit un vecteur.

http://www.jcuadras-arquitecto.com/Consultas/OrientationObject.jpg

yaotchose
10/04/2007, 22h46
Merci yamp, j'ai suivi tes conseils mais je crois que cela ne correspond pas à ce que je cherche, car je voudrais contrôler le pitch comme l'évoque Pé. , de façon que ma sphère reste toujours verticale et orientée vers la caméra , comme sur l'image jointe.

J'imagine la manip qu'il faut faire, mais je patauge dans les histoires de vecteurs et de matrices... comment faire pour récupérer l'angle que fait ma sphère avec la verticale de l'écran? Mezrci pour votre aide !




[Fichier joint supprimé par l'administrateur]

Jean-Laurent
11/04/2007, 08h27
Pas bien réveillé moi ce matin, mais je viens enfin de comprendre ton problème.

Malheureusement le pitch de Pé ne te servira à rien il me semble.

Si j'ai bien compris:
Tu ne souhaite pas que l'objet reste aligné verticalement par rapport au monde, mais verticalement par rapport à l'écran. C'est ça?
Ceci dépend donc de l'angle d'ouverture de la caméra.

Pas si évident que ça, de prime abord.
Il faut bien maîtriser le principe de projection de la perspective 3D.

yaotchose
11/04/2007, 10h53
Merci Jean-Laurent, tu as mieux résumé le problème que je ne l'ai fait.

Lors du déplacement de ma sphère (ciblée sur la caméra) sur sa trajectoire, elle pivote plus ou moins autour de son axe z.
N'y a-t-il pas moyen de comparer, dans le plan de la caméra, l'orientation de ma sphère avec une orientation "de référence" (prise au centre de la vue par exemple), afin de la redresser ?
à la main, c'est fastoche, mais en expresso, c'est pas de la rigolade !

Yamp
11/04/2007, 21h19
Résolu! :wink:
Il n'est pas nécessaire d'utiliser XPresso,
En mettant la sphère à l'intérieur d'un Objet Nul, tel la sphère ne tourne pas au regard à la Càmera.
Regardez: MOVIE (http://www.jcuadras-arquitecto.com/Consultas/OrientationObject.mov)

http://www.jcuadras-arquitecto.com/Consultas/OrientationObject1.jpg

yaotchose
11/04/2007, 22h57
Bravo, yamp, c'est exactement ça, et en plus ta solution est très élégante !
... il ne me reste plus qu'à trouver le truc pour que ça marche chez moi, parce que pour l'instant ça bouge encore... :(

grrr....j'y retourne !

Jean-Laurent
12/04/2007, 10h37
En mettant la sphère à l'intérieur d'un Objet Nul, tel la sphère ne tourne pas au regard à la Càmera.


:o
Heu... J'ai quand même quelques doutes.
C'est peut-être l'impression donnée si l'ouverture de la caméra est faible.

Edit: En cherchant un peu, j'ai trouvé une matrice de projection 3D, mais c'est costaud.
Sinon sur Wikipédia il y a ça.



Projection centrale en synthèse d'image 3D [modifier]

Une formule simplifiée permet de calculer les coordonnées à l'écran d'un point.

2D.X = 3D.X - ((3DX / (3D.Z + Distance)) * 3D.X)
2D.Y = 3D.Y - ((3DY / (3D.Z + Distance)) * 3D.Y)


où 2D.X et 2D.Y sont les coordonnées finales projetées sur l'écran, 3D.X, 3D.Y, et 3D.Z les coordonnées du point à projeter, Distance une constante, et DX et DY la distance respectivement en X et Y entre la caméra et le point. On écrit encore plus simplement :

2D.X = 3D.X / (3D.Z * fov)
2D.Y = 3D.Y / (3D.Z * fov)

Cette formule est mathématiquement incorrecte mais donne de bons résultats à moindre coût. Si fov vaut 1, nous aurons une projection isométrique, sans notion de profondeur.


Je verrai ce que ça donne. :odile:

Yamp
12/04/2007, 20h46
Heu... J'ai quand même quelques doutes.
C'est peut-être l'impression donnée si l'ouverture de la caméra est faible.


Comme tu peux voir il fonctionne pour n'importe quelle ouverture de càmera.
Dans l'image une distance focale 55 º

http://www.jcuadras-arquitecto.com/Consultas/LimitacionObjeto3.jpg

Jean-Laurent
13/04/2007, 10h09
Je n'arrive malheureusement pas à lire ton .mov sur mon PC. Quicktime rale.

Si c'est possible pourrais-tu mettre le fichier C4D en ligne?

Je suis comme St Thomas, je ne crois que ce que je touche. ;-)
Et chez moi ça ne marche pas, d'où ma curiosité.

Sur l'image tu es bien centré et la sphère est assez petite.
La distance à la caméra joue aussi.
Ca m'intrigue toujours autant, je ne vois pas pourquoi un neutre resterait aligné à l'écran.

kilian
13/04/2007, 20h05
Mon conseil rejoint celui de Pé, c'est de loin le plus simple : un tag "Pointer vers la caméra" et décocher l'option "Changer la valeur de tangage".
Et c'est disponible au moins depuis la version 8.

Ou alors je n'ai rien compris ? :roll:

Yamp
13/04/2007, 20h51
Si c'est possible pourrais-tu mettre le fichier C4D en ligne?
Je suis comme St Thomas, je ne crois que ce que je touche.

Jean-Laurent, vous êtes un homme de peu de foi. :wink:
Regardez: FICHIER (http://www.jcuadras-arquitecto.com/Consultas/OrientacionYamp.c4d)

Jean-Laurent
14/04/2007, 09h18
Je pense que le quiproquo est maintenu.
Mieux vaut une image:
http://cinema4d.chez-alice.fr/verticale.JPG

La question est intéressante et je m'étais posé une autre question un moment donné.
Imaginons que l'on veuille une bulle (genre BD) qui reste affichée à l'écran, toujours face caméra.
Dans les jeux vidéos temps réels c'est un classique géré par le logiciel et ça porte un nom anglais que j'ai oublié.

Par exemple on se déplace dans la vue, mais cette information reste fixe à l'écran.
On peut évidemment faire ça facilement avec une simple texture sur un avant-plan ou un arrière plan.
Mais là, je parle d'un objet, un cube par exemple qui ne serait à aucun moment déformé par l'ouverture de la caméra et pointant toujours vers elle.

Le seul intérêt dans ce cas là par rapport à une texture serait l'intéractivité. Pouvoir redimensionner la bulle facilement, changer le texte à l'intérieur etc... mais directement dans C4D.

Je ne suis pas sûr que ce soit plus clair. :oops:

Yamp
14/04/2007, 12h23
Mais je pense que le problème est résolu :wink:
Si vous regardez le tour de chacune des sphères toujours B = 90, tout de suite il n'y a pas de rotation sur l'axe Z.

Un nouvel exemple:FICHIER (http://www.jcuadras-arquitecto.com/Consultas/OrientacionYamp.c4d)

http://www.jcuadras-arquitecto.com/Consultas/OrientacionObjeto.jpg

Jean-Laurent
14/04/2007, 17h56
Non, toujours pas. :lol:

J'ai bien téléchargé tes fichiers mais ils ne répondent pas à la problèmatique de yaotchose.

La confusion reste la même. :wink:

L'axe Z pointe bien vers la caméra et l'axe X reste bien verticale. Donc B=90° tout du long.
MAIS, yaotchose ne veut pas que l'axe X soit verticale par rapport au monde de C4D, mais verticale par rapport à l'écran.
Or, par déformation de la caméra (effet de perspective) lorsqu'on s'approche des bords, la verticale de C4D ne correspond plus à la verticale de l'écran. C'est l'image que j'ai tirée de ton précédent fichier.
L'axe X est effectivement verticale, mais pas par rapport à l'écran.
Et cette déformation est d'autant plus grande que l'ouverture de la caméra est importante.

Pour maintenir la sphère "verticale" par rapport à l'écran il faut justement la faire tourner légérement et faire varier le B.
On le fait facilement à la main dans un cas particulier (c'est ce que disait Yaotchose) mais c'est difficile à programmer pour tous les cas de figure.

yaotchose
16/04/2007, 00h08
Jean-Laurent, je suis content de voir que ma question ouvre des perspectives inexplorées qui remettent en cause les rapports du monde à la verticalité. Mais loin de moi l'idée de m'aventurer dans des espaces remplis de matrices hostiles qui vous projettent des vecteurs à tout bout de champ et qui changent de repaires en permanence!
Non, ma question est somme toute assez "simple", et l'habile réponse qu'a apportée Yamp me convient tout à fait.

Enfin..., elle me conviendrait tout à fait si j'arrivais à la faire tout seul devant ma bécane...
J'ai suivi tes conseils, yamp, mais chez moi ça tourne encore... :coup:
Je joins mon fichier, dites-moi si ça marche chez vous, parce que je ne sais plus où chercher.
Merci d'avance!



[Fichier joint supprimé par l'administrateur]

Jean-Laurent
16/04/2007, 09h23
Non, ma question est somme toute assez "simple", et l'habile réponse qu'a apportée Yamp me convient tout à fait.

Enfin..., elle me conviendrait tout à fait si j'arrivais à la faire tout seul devant ma bécane...


La question est effectivement simple mais pas la réponse. :wink:
Le problème c'est que la solution de Yamp ne correspond pas à ce que tu veux faire. :lol:
On reste dans l'incompréhension.

Comme disais Galilée: <<Et pourtant elle tourne.>> :wink:

paspas
16/04/2007, 15h20
salut

j' ai pas suivis se topic avec grande assiduité :oops: et je comprend pas tout le problème :oops:

mais j' avais fait des tests et si tu connaît UNE direction ( un vecteur de préférence) tu sait matricielement reconstituer les deux autre vecteur qui feront que tes axes reste orthonormé ,

pour rappel


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

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

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

mais je saispas si ça peu aider

paspas

Jean-Laurent
16/04/2007, 16h32
J'ai l'impression d'être un fou furieux qui répète toujours la même chose. :lol:

Il s'agit de définir la verticale par rapport à l'écran.
Si l'écran est lui-même placé à l'horizontal sur une table bien horizontale, on pourrait la trouver avec un fil à plomb.
Et pas par rapport au monde de C4D, comme indiqué sur mon message du 14 avril 2007.

paspas
16/04/2007, 16h47
si X pointe vers la camera et Y est vertivale et z ou il peut :mrgreen:




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

m -> SetV0(p1); // position de l' objet
m -> SetV1(vnorm(p2-p1)) ; // orientation camera si connait 2 point
m -> SetV2(Vnorm(vector(0,-1,0))); // tj verticale vers le bas
m -> SetV3(Vnorm(vcross(p2-p1),vector(0,0,1)))); // on défini l axe des Z perpendiculaire a l axe des X

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

mais ca serra plus orthogonal alors ????

paspas

faut tester evidament je fait ca de souvenir

paspas
16/04/2007, 17h05
pour fair un fil a plomb

tu prend la position du plan ex : pos_plan

var verticale = vector(0,-1,0) ;
var fil_plomb = pos_plan+verticale * 100 ;

tu aurra toujour la position du point situer a la verticale de pos_plan a une distance de 100

il te suffit d' y relier un null et de pointer vers ce null

paspas

ça marche aussi en xpresso avec les noeud adoc

paspas
16/04/2007, 19h56
un truc comme ca ?

video (http://www.deltazone.org/~fc4d/autres/paspas_filaplomb.avi)

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

paspas

Yamp
16/04/2007, 21h25
Salut
Les mathématiques et la géométrie me plaisent et je suis très têtu en cherchant la rigueur et la solution scientifique, et les commentaires de Jean-Laurent et paspas m'enchantent, mais il m'a semblé que ma solution n'est pas très rigoureuse mais si elle est pratique et facile d'appliquer.
Yaotchose, pour corriger ton fichier sélectionne l'Objet Neutre et mets R.P = 40 º

Jean-Laurent
17/04/2007, 09h35
:arg::cry2:

Vous êtes cruels avec moi. Ou alors vous me faites une farce, c'est ça. :wink:



Les mathématiques et la géométrie me plaisent et je suis très têtu en cherchant la rigueur et la solution scientifique, et les commentaires de Jean-Laurent et paspas m'enchantent, mais il m'a semblé que ma solution n'est pas très rigoureuse mais si elle est pratique et facile d'appliquer.



Je ne suis pas un fanatique des mathématiques je te rassure. Les solutions rapides et pragmatiques me plaisent tout autant.
Mais je voudrais bien que Yaotchose nous explique à nouveau son problème car je suis en train de me demander si finalement je l'ai compris.

Car si c'est le cas, vous ne répondez absolument pas au problème.

Je le repose une fois de plus de manière différente:

Imaginons que l'on modélise un cylindre vertical dans C4D.
J'attrape l'écran de l'ordinateur à pleine main et je le fait tourner de 90°.

Le logiciel C4D m'indique que le cylindre est toujours vertical et pourtant "DANS LE MONDE REEL" il est maintenant horizontal.

Il me semblait que Yaotchose souhaitait que l'objet reste vertical "DANS LE MONDE REEL", celui où on mange, on dort etc...
Pas la verticale de C4D.

Prochaine étape, je fais une photo. :grin:

kilian
17/04/2007, 10h20
Ca revient donc redresser artificiellement les fuyantes verticales de la perspective, pour toujours obtenir une vue frontale ... en perspective, c'est ça hein ?

Par exemple, quand on passe la caméra en mode "parallèle" au lieu de "perspective", ça change quoi dans votre problème ?

(pas taper, ou alors pas trop fort ... :arg:)

Jean-Laurent
17/04/2007, 10h25
Ca revient donc redresser artificiellement les fuyantes verticales de la perspective, pour toujours obtenir une vue frontale ... en perspective, c'est ça hein ?


Merci. :love:
C'est exactement ça, en bien mieux formulé. :prie:

Ensuite, je ne sais pas pourquoi yaotchose souhaite faire ça.

paspas
17/04/2007, 11h36
je pensait que c 'etait pas ca :oops:

vu que les camera peuve simuler un objetif a decentrement pour redreser les fuiyante , ( jamais tester mais y a un post sur le forum )


sinon JL fait un test avec mon fichier

tu met sur les deux point de la spline deux neutre 1- au debut et 2 le fin

tu place 1 dans l' objet camera

tu mets la positon du plan sur 1

et tu met un tag cible sur le plan qui pointe sur 2

et tu a ce que tu dit juste au dessus non ??



Imaginons que l'on modélise un cylindre vertical dans C4D.
J'attrape l'écran de l'ordinateur à pleine main et je le fait tourner de 90°.

Le logiciel C4D m'indique que le cylindre est toujours vertical et pourtant "DANS LE MONDE REEL" il est maintenant horizontal.

Il me semblait que Yaotchose souhaitait que l'objet reste vertical "DANS LE MONDE REEL", celui où on mange, on dort etc...
Pas la verticale de C4D.

paspas qu comprend pas le probleme :arg:

yaotchose
17/04/2007, 12h32
Bonjour à tous,
Merci pour toutes vos réponses, et toutes mes confuses pour cette discussion un peu floue, je vais essayer de préciser les choses pour que ce soit plus clair.


Je résume mon problème :wink: :
J'ai un objet (un logo en volume en l'occurence) que je déplace à l'écran.
J'ai une caméra qui suit cet objet, mais l'objet n'est pas toujours au centre de la vue.
Ce que je veux, c'est que le logo fasse face (!) à la caméra et reste toujours à peu près d'aplomb : ça fait plus joli dans mon anim, plutôt que d'avoir le logo qui pivote un coup à droite, un coup à gauche.
En ce sens, la solution de yamp est nickel, puisque mon objet garde son orientation initiale. Simple et efficace.
Sauf que ( je viens de m'en rendre compte) ça ne marche plus dès que je bouge ma caméra.

Lorsque j'ai posé ma question, voilà ce que j'avais imaginé sans pouvoir cependant le réaliser (je le fais à la main, mais je ne sais pas l'automatiser) :
1- je crée un objet, je lui mets un tag "cible" qui pointe vers ma caméra.
2- quand je sélectionne cet objet, je ne vois plus à l'ecran que son axe X et son axe Y, et ce quelquesoit l'angle d'ouverture de ma caméra.
3- je prends l'outil de rotation, et je tourne mon objet autour de son axe Z, afin de remettre l'axe vert Y vertical par rapport au bord de mon écran effectivement (et non pas de la caméra...)

En tapant cette explication, je me rends compte de cette subtilité qui m'avait échappé, mais heureusement que Jean-Laurent a l'oeil !

Jean-Laurent
17/04/2007, 13h12
Du coup le nom anglais me revient. Il me semble que ça se nomme un Gizmo (comme dans les Gremlins).

C'est l'exemple auquel je pensais quand je parlais de bulles interactives. (bulles ou logo c'est pareil).

Une solution a envisagée serait peut-être de faire un rendu une fois pour toute de ton logo 3D et de le transformer en une texture que tu projetterais avec de l'alpha sur un premier plan. Le problème c'est que le logo du coup restera fixe.

En vue perspective, les bords droits et gauches de ton logo seront de toute manière déformés et jamais parallèles.
Ton logo bougera donc bizarrement avec les déplacement de caméra.
Reste à voir si la vue parallèle peut convenir.

Le plus simple à tout ça, c'est quand même de faire de la post production.
Ton logo qui se déplace d'une part et ta caméra d'autre part.

paspas
18/04/2007, 23h24
et la j' ai bon ??


video (http://www.deltazone.org/~fc4d/autres/paspas_filaplomb2.avi)

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

paspas désespere :lol:

edit

pour les xpresiophyle

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

yaotchose
20/04/2007, 13h49
Super, paspas ! :efface:
Je l'essaye dans ma scène et je vous tiens au courant.
En tout cas, quand je décortique le biniou, ben je dis "bravo les spécialistes" !
Et merci !

paspas
20/04/2007, 18h33
j' espère que ça te conviendra

dans l' exemple je cible directement la spline "logo" donc elle est serra toujours centrée

maintenant tu peut cible un null et mètre ton logo comme enfant de ce null et donc la il ne serra plus forcement centré

paspas qui comprend vite quand on lui explique longtemps