PDA

Voir la version complète : lumière dans objet symétrie



lenogre
22/09/2002, 03h14
Apparament, on ne peut pas faire de symétrie sur les lumières : Si on place une lumière dans un objet symétrie, il ne se passe rien.

Tengaal
22/09/2002, 11h38
Ah oui en effet ! Je n'avais jamais essayé ça et c'est vrai qu'un objet lumière n'est pas pris en compte dans une symétrie ! :shock:
Y'a p'tète un trucs à faire là...
Des programmeurs veulent tenter l'exercice ?
Ca pourrait être sympa pour des débutants en Coffee... :wink:

parksto
22/09/2002, 14h57
ben, moi, je viens de faire un petit essai :


var symetrie, lumiere, copie, poslumiere, posymetrie, distance, final, copielampe, containerlampe;

main(doc,op)
{

//symetrie = "x";
//symetrie = "y";
symetrie = "z";


copie=doc->FindObject("lampe copie");
lumiere = op->GetDown();
poslumiere = lumiere->GetPosition();
posymetrie = op->GetPosition();


if (symetrie=="x") {
distance = poslumiere.x - posymetrie.x;
final=vector (posymetrie.x-distance,poslumiere.y,poslumiere.z);
}
if (symetrie=="y") {
distance = poslumiere.y - posymetrie.y;
final=vector (poslumiere.x,posymetrie.y-distance,poslumiere.z);
}
if (symetrie=="z") {
distance = poslumiere.z - posymetrie.z;
final=vector (poslumiere.x,poslumiere.y,posymetrie.z-distance);
}

if (!copie) {
containerlampe = lumiere->GetContainer();
copie=new(LightObject);
copie->SetName("lampe copie");
doc->InsertObject(copie,op,lumiere);
copie->SetContainer(containerlampe);
}
copie->SetPosition(final);
}



j'imagine que c'est pas la solution la plus simple, mais ça fonctionne.

il faut mettre l'expression sur un object qui fera le centre de symétrie avec comme enfant une lumière.
pour actualiser les propriétés du la copie, il suffit d'en effacer l'object, il se recréera automatiquement, actualisé.


en esperant que ça serve à quelqu'un. :oops:

et aussi dans l'espoir de savoir comment l'ameliorer. :wink:

Tengaal
22/09/2002, 20h12
Oui c'est bien vu, bravo !
Quelques petits conseils tout de même:
Quand tu pointes sur un objet, comme par exemple lumiere=op->GetDown(); il est prudent d'ajouter une sécurité si l'objet n'a pas été trouvé car il n'existe pas : if (!lumiere) return;
Ensuite seconde chose, comme ton expression est censée travailler uniquement les objets "lumiere" (LightObject), il faut vérifier que l'objet à copier est bien une lumière, car si on place un cube, ton expression actuelle créé tout de même une image !
Il faut donc ajouter une fonction qui permet de vérifier si un objet est un type particulier:if (!instanceof(lumiere,LightObject)) return; ce qui signifie que si lumière n'est pas un LightObject alors on sort de l'expression sans rien faire, on aura donc le code suivant:
copie=doc->FindObject("lampe copie");
lumiere=op->GetDown();
if (!lumiere) return; //si l'objet n'existe pas on quitte
if (!instanceof(lumiere,LightObject)) return; //si ce n'est pas une lumiere on quitte.

on peut ensuite reprendre ton code:
poslumiere = lumiere->GetPosition();
(...)

Un dernière petite chose, plutôt que de créer un second LightObjet, pourquoi ne pas utiliser une instance, ainsi en modifiant l'original, sa copie sera automatiquement reparamétrée (couleur, intensité, type...)
copie=new(InstanceObject); //on créé une instance
copie->SetName("lampe copie");
var bc=copie->GetContainer();
bc->SetData(INSTANCEOBJECT_SOURCE,lumiere->GetName()); //l'instance pointe sur le nom de notre lumiere
copie->SetContainer(bc);
doc->InsertObject(copie,op,lumiere);
doc->Message(MSG_UPDATE); //permet de rafraichir le doc et ses modifications

Je poursuis ce sujet de programmation dans la partie Expression dans laquelle je mets le code final avec ses modifications...