PDA

Voir la version complète : A propos du tutorial 3dattack de septembre



padawa
13/10/2004, 13h22
Salut,
me revoila, toujours a la conquete du coffee :poucehaut:

Je viens de faire le tutorail de 3dattack de septembre (tut n°2)
Voici le code que j'ai un peu arrangé a ma sauce notamment dans les nom des variables et la création du sol, bref


main(doc,le_pantin)
{
var le_sol = doc->FindObject("Sol");
if(!le_sol){
le_sol = new(FloorObject);
doc->InsertObject(le_sol,NULL,NULL) ;
}

var pantin_pos = le_pantin->GetPosition();
var sol_pos = le_sol->GetPosition();
println("Sol Y: " + tostring(sol_pos.y));
println("Pantin Y: " + tostring(pantin_pos.y));

var pantin_container = le_pantin->GetContainer();
var drop_speed = pantin_container->GetFloat(10000001);
println("Drop Speed: " + tostring(drop_speed));

var hauteur = pantin_container->GetFloat( PRIM_FIGURE_HEIGHT);
var demi_hauteur = hauteur/2;
var bas_y = pantin_pos.y - demi_hauteur - drop_speed;

if&#40;bas_y <= sol_pos.y&#41;&#123;
le_pantin->SetPosition&#40; vector&#40; pantin_pos.x, sol_pos.y+demi_hauteur, pantin_pos.z&#41;&#41;;
drop_speed = 0;
&#125;
else&#123;
le_pantin->SetPosition&#40; vector&#40; pantin_pos.x, sol_pos.y-drop_speed, pantin_pos.z&#41;&#41;;
drop_speed = drop_speed + 2;
&#125;
pantin_container->SetData&#40;1000001, drop_speed&#41;;
le_pantin->SetContainer&#40; pantin_container&#41;;

&#125;

Je voudrait juste savoir a quoi sert exactement la variable "drop_speed"?
Car si on la supprime cela marche et meme mieux, car comme ca le rafraichissement n'est pas net.
J'arrive pas a comprendre l'explication donné dans le tut

Voila c'est tout pour le moment :mrgreen:

Kaldera Lake
13/10/2004, 19h12
idem, il me semble que ce paramettre ne sert qu'à rendre la chutte sequentielle, mais cela n'aurait un interet que pour animer la scene, ce qui n'est pas le cas ici... sans ca je ne vois pas... je l'ai donc enlevé aussi...

padawa
13/10/2004, 19h20
C'est ce que je me disais aussi (enfin moi je me disais que c'était en rapport avec l'anim pas avec le truc séquencielle :mrgreen: )
parceque a la fin y dit que si tu met le drop_speed=-40 et que tu lance l'anim, ca doit faire trampoline :o mais moi j'ai rienqui se passe.

Majoul
13/10/2004, 20h20
je pense que cette ligne n'a rien a faire ici :

var drop_speed = pantin_container->GetFloat(10000001);


c'est plutôt

var drop_speed = pantin_container->GetData(10000001);

est ce qu'il existe ton ID (10000001) dans le container de ton objet.

padawa
13/10/2004, 21h19
Non c'est bien ce qui est notez dans le tut :?
je te marque le commentaire

Pull out the data we store there for the drop_speed.
The drop_speed will be 0 at first.
That's ok. The value is placed into the data container later in the script.

D'ou, je pense, le

pantin_container->SetData&#40;1000001, drop_speed&#41;;
le_pantin->SetContainer&#40; pantin_container&#41;;
à la fin.
Mais a quoi ca sert en fait :o

Majoul
13/10/2004, 21h47
Déjà il y a un problème d’ID, je m’explique :

Au début du script on prend la valeur drop_speed du container avec l’id 10000001
Et on la stocke avec l’id 1000001, regarde bien ce n’est pas le même ID il y a un zero en plus.



jettes un œil ici :
http://www.frenchcinema4d.com/phpBB2/viewtopic.php?t=6548

.

padawa
14/10/2004, 00h05
Oups :oops:
Je suis vraiment désolé Majoul, mais la c'est moi qui est fait une erreur de frappe (mille excuses :prie: , je sais combien c'est compliqué, alors si en plus je rajoute de faute :poucebas: )
l'ID est bien 1000001 partout.
Du coup la ca marche et effectivement avec drop_speed = -40 le pantin fait du trampoline lors squ'on lance l'anim :poucehaut:
Par contre si je reviens sur l'utilité de cette variable si j'ai bien compris
ca sert a accéder directement a certaine valeur du container, un peu comme pour les flag que l'on peu appelé par un numéro.
Est ce que j'ai bien compris?

Majoul
14/10/2004, 15h55
Est ce que tu as jeté un œil au lien que je t’ais mis dans mon message précédent.
Tu trouveras une réponse à ta question.

padawa
14/10/2004, 19h48
Ben ecoute apres avoir relu le code, ton exemple, le tut, la seule chose que j'en déduit c'est que le drop_speed remplace les commandes de modifications de l'objet. En fait c'est une copie du container de l'objet, donc de tout ces parametre :?
Donc dans l'exemple du pantin si celui ci est au dessous du sol on le positionne par le calcul, sinon
le drop_speed étant placé en position du Y dans le vecteur, il récupère la position originale du pantin en Y grace a son ID de container, puisque que le container est défini a la fin.
Le drop_speed peut etre résumé en "dernier parametre connu"

Voila si c'est pas ca je t'avou que j'ai plu de solution :cry2:

Tengaal
14/10/2004, 20h31
en utilisant
Ben ecoute apres avoir relu le code, ton exemple, le tut, la seule chose que j'en déduit c'est que le drop_speed remplace les commandes de modifications de l'objet. En fait c'est une copie du container de l'objet, donc de tout ces parametre :?

Pas du tout ! :mrgreen:
Je viens de tomber sur ton sujet Padawa, seulement aujourd'hui... :oops:

drop_speed est une valeur personnelle du programmeur.
Elle est est ici utilisée en "bricolage" pour compenser la vitesse de changement de taille du pantin, et donc de sa position (taille/2)
Cette valeur est stockée directement dans le container de l'objet primitif "Pantin" par question de commodité car il faut pouvoir lire la valeur de l'image précédente pour la recalculer à l'image actuelle.
Un container est un espace de stockage qui contient notamment les paramètres des objets de C4D.
Ces paramètres sont accessibles en lecture/écriture, on les localise par un pointeur appelé ID qui est une valeur précise.
Chaque paramètre est donc localisé par un ID unique.
Dans le SDK du Coffee ces valeurs ID sont identifiées en texte pour plus de facilité, par exemple pour un objet "Caméra", le paramètre de focale se trouve dans le container à l'ID CAMERAOBJECT_FOCUS.

Dans le tut auquel tu fais référence, le programmeur utilise un ID personnel 1000001 afin de stocker puis relire sa donnée "drop_speed".


IMPORTANT:
Il faut faire extrêmement attention avec cette pratique du stockage dans le container des objets car si par hasard vous utilisez un ID perso qui est en fait le même ID qu'un des paramètres standards de l'objet, vous risquez de faire quelques dégâts, et même planter purement et simplement C4D, si par exemple vous stockez une valeur de type Float en écrasant un paramètre de l'objet qui est de type différent (Bool, texte...). Il n'y a pas de documentation officielle qui liste les ID à ne pas utiliser...
Il est bien sûr possible de connaitre la valeur des ID officiel avec "println(NOM_IDENTIFIANT);" et de le lire dans la fenêtre console, mais le COFFEE étant arrêté sur les fonctions de C4D 6, les nouvelles fonctions supplémentaires de C4D 7 et 8 utilisent des ID supplémentaires et non documentés, donc prudence...

padawa
14/10/2004, 20h58
Ok, merci Tengaal, pas la peine de le dire 2 fois :mrgreen:

Non sans rire, c'est donc en fait ce que j'expliqué tres mal, un genre de container temporaire. Vu qu'il faut pouvoir accéder a la valeur précédente du container, il la stocke dans ce container temporaire, car sinon la valeur du container originel serait remplacé :o (j'espere que vous m'avez suivi :mrgreen: )
Bref, vu le niveau de complexité de ce type d'utilisation, je crois que c'est réservé a un niveau plus élevé :cry: et dans l'immédiat je vais m'en passé. :poucehaut:
Par contre est ce qu'il n'aurait pas pu stocker une valeur simple dans une variable?

Tengaal
14/10/2004, 21h05
Oups, double message, je me suis dons auto-supprimé ! :mrgreen:

La valeur "drop-speed" n'EST PAS un container, c'est une valeur (ou un paramètre perso).

Un container est un espace de stockage qui contient plusieurs valeurs (paramètres). Donc tu ne peux pas remplacer un container comme tu l'expliques, car cela voudrait dire que tu remplaces tous les paramètres de l'objet...

padawa
14/10/2004, 22h14
Bon je crois que je vais mettre ca de coté pour le moment car si c'est une valeur, pourquoi ne pas avoir fait une variable toute simple :shock:

Bref te prend pas la tete, je pense que le declic viendra au fur et a mesure de mon apprentissage, la je suis encore trop c.. :mrgreen:

Merci quand meme :poucehaut:

Tengaal
14/10/2004, 23h28
Heu Padawa, une variable c'est une valeur de toute manière...

Si il la stocke c'est simplement que dans un script la valeur n'existe qu'à l'instant où le script est exécuté, c'est à dire à chaque image ou à chaque rafraichissement de la scène. Donc il la stocke dans un endroit fixe : le container de l'objet.

Bon, je te conseille de commencer par le commencement car il te faut un minimum de connaissances sur le fonctionnement du COFFEE dans C4D et également sur la manière dont C4D est géré en interne... :wink:

Majoul
15/10/2004, 17h53
mais le COFFEE étant arrêté sur les fonctions de C4D 6, les nouvelles fonctions supplémentaires de C4D 7 et 8 utilisent des ID supplémentaires et non documentés, donc prudence...

Mais cela n’empêche pas de les connaître même s’ils ne sont pas documentés.
Un container qui contient par exemple 11 paramètres, ces paramètres sont indexer de l’index 0 à 10, si on ajoute un nouveau paramètre au container il prendra automatiquement l’index 11.
Par exemple un objet matériaux dans la v8.2 contient 87 index et dans la v9 108 index, ou encore les paramètres des lumières etc.…
C’était juste pour dire qu’on arrive toujours a accédé à certaines nouveautés avec la fonction GetIndexId(index) pour connaître l’ID du paramètre, même s’il n’est pas documenté, on peut se servir de l’Id pour programmer ou pour éviter de modifier le type de la valeur.

.

Tengaal
15/10/2004, 18h31
Oui, d'accord, mais il faut de toute façon vérifier si l'ID que l'on souhaite utiliser n'est pas un ID déjà utilisé en interne par C4D, c'est pour ça que je dis "non documentée".
Et puis il ne faut pas oublier le cas où le script est utilisé sur des versions différentes de C4D, entre différentes versions, certains paramètres ont disparus d'autres sont apparus, et cela avec des ID différents. Ce qui signifie concrètement que tu peux très bien utiliser un ID "libre" qui fonctionne avec C4D 6, et qui va écraser un paramètre sous C4D 7.xx ou 8.xx...
Là encore, c'est le soucis de ne pas avoir de documentation officielle...

Sinon on peut se faire ses propres listing d'ID en fouinant dans C4D en bricolant des traceurs en COFFEE pour en sortir notamment les points d'accès vers les fonctions de C4D 7 et 8 que la doc COFFEE actuelle ne mentionne pas. J'ai recours à ce genre de truc pour passer la compatibilité d'un plug codé en Coffee d'une version 7 vers une version 8 par exemple.

padawa
15/10/2004, 18h48
Attend un peu, j'ai p'tetre un nouveau flash. :o

En fait, le drop_speed est la pour démontrer que l'on peut rajouter une entrée dans un container. Donc au lieu d'accéder a la valeur Y du container, on accede au drop_speed qui, dans cet exemple a la meme utilité-valeur :shock:

Bon allez dites moi ou j'ai faux, encore une fois :cry2:

padawa
15/10/2004, 18h51
D'ailleur,
dans son commentaire il dit que maxon recommande d'utiliser un id de la sorte (1000001) pour eviter les conflits et que dans le cas d'un usage commercial, il faut demander cet id a maxon directement :wink:

Tengaal
15/10/2004, 19h49
Tu mélanges plein de trucs Padawa...

Dans le tut il est expliqué que pour stocker une valeur dans un container il faut utiliser un ID unique (par exemple 1000001, CE N'EST QU'UN EXEMPLE).

Ensuite, en ce qui concerne les ID à obtenir par le site de développement de Maxon, cela concerne essentiellement les ID qui identifient un plugin que tu réalises, pour ne pas qu'il entre en conflit avec d'autres plugins existants. Chaque plugin C4D doit avoir son ID propre.
Quand on développe un plugin chez soit, on peut se contenter d'utiliser un ID personnel dans la gamme d'ID de développement indiqué par Maxon, mais à partir du moment où le plugin est diffusé, il faut qu'il dispose d'un ID unique fournit par Maxon.

Majoul
15/10/2004, 20h01
Padawa si tu commence par un petit exercice simple en manipulant une primitive C4d comme j’ai commencé avec la primitive Tube pour en faire une tuile paramétrique. Tu verras que les choses deviendront dans le temps plus claire dans ta tête. Il n’y a pas de secret, il faut commencer par planter C4D plusieurs fois :mrgreen: pour y arriver comme tout le monde et on est là pour te filer une aide au besoin.

Cherche une idée et attaque.
.

padawa
15/10/2004, 20h08
Merci les gars :wink:

C'est exactement ce que je suis en train de faire, mais ce truc m'as brouillé les idées car ca fait partie du tut n°2 seulement et pour une manipulation toute simple :o

Je vais laissé ca de coté :mrgreen:

Designer
19/11/2004, 22h59
Salut les gars :)

Trés bien exemple padawa! :poucehaut:
Est-ce que je peux corriger deux lignes de code?



le_sol = new&#40;FloorObject&#41;; if&#40;!le_sol&#41; return;
&#91;...&#93;

var pantin_container = le_pantin->GetContainer&#40;&#41;; if&#40;!pantin_container&#41; return;
&#91;...&#93;


Je sais pas pourquoi, mais les francais jamais revisent ses pointers. ;)

Katachi

padawa
20/11/2004, 01h17
Il faut dire "anglais" Designer :mrgreen:
Car c'est un code que j'ai repris dans le 3D attack :wink:

Mais merci de cette precision.
:poucehaut: