Tengaal
22/09/2002, 20h23
Suite à une remarque judicieuse concernant l'impossibilité de faire une symétrie avec un objet lumière, Parksto s'est lancé dans le code et nous a amené une bonne petite expression à laquelle, j'ai fait quelques petites remarques, je vous livre donc ici l'expression modifiée:
Ce code est bien sûr créé à la base par Parksto qui j'espère acceptera ces petits correctifs ! :wink:
La "symétrique" de la lumière est une instance ce qui permet de modifier la lumière originale avec une copie qui utilise les mêmes paramètres, j'ai également ajouté les symétries de rotations pour prendre en charge le cas des spots et lumières directionnelles...
var symetrie, lumiere, copie, poslumiere, posymetrie, distance, final, copielampe, containerlampe;
var rotlumiere, rotfinal;
main(doc,op)
{
//symetrie = "x";
//symetrie = "y";
symetrie = "z";
copie=doc->FindObject("lampe copie");
lumiere = op->GetDown();
if (!lumiere) return; //si il n'y a pas d'objet enfant on quitte
if (!instanceof(lumiere, LightObject)) return; //si l'enfant n'est pas une lumière on quitte
poslumiere = lumiere->GetPosition();
rotlumiere=lumiere->GetRotation();
posymetrie = op->GetPosition();
if (symetrie=="x") {
distance = poslumiere.x - posymetrie.x;
final=vector (posymetrie.x-distance,poslumiere.y,poslumiere.z);
rotfinal=rotlumiere;
rotfinal.x=-rotfinal.x;
rotfinal.z=-rotfinal.z;
}
if (symetrie=="y") {
distance = poslumiere.y - posymetrie.y;
final=vector (poslumiere.x,posymetrie.y-distance,poslumiere.z);
rotfinal=rotlumiere;
rotfinal.z=-rotfinal.z;
rotfinal.y=-rotfinal.y;
}
if (symetrie=="z") {
distance = poslumiere.z - posymetrie.z;
final=vector (poslumiere.x,poslumiere.y,posymetrie.z-distance);
rotfinal=rotlumiere;
rotfinal.x=-rotfinal.x+Radians(180);
rotfinal.z=-rotfinal.z;
}
if (!copie)
{
copie=new(InstanceObject); //on créé une instance pour notre lumiere
copie->SetName("lampe copie");
var container=copie->GetContainer(); //on accède aux paramètre de cet objet Instance
container->SetData(INSTANCEOBJECT_SOURCE,lumiere->GetName()); //l'instance pointe sur le nom de la lumiere
doc->InsertObject(copie,op,lumiere);
copie->SetContainer(container);
}
copie->SetPosition(final);
copie->SetRotation(rotfinal);
doc->Message(MSG_UPDATE); //actualisation des modifications du document
}
Cette expression doit être placée sur un objet servant de point de symétrie, dans lequel on glisse une lumière, celle-ci sera dupliquée par rapport à un axe définit dans le code (symetrie="z");
Merci Parsto ! :D
Ce code est bien sûr créé à la base par Parksto qui j'espère acceptera ces petits correctifs ! :wink:
La "symétrique" de la lumière est une instance ce qui permet de modifier la lumière originale avec une copie qui utilise les mêmes paramètres, j'ai également ajouté les symétries de rotations pour prendre en charge le cas des spots et lumières directionnelles...
var symetrie, lumiere, copie, poslumiere, posymetrie, distance, final, copielampe, containerlampe;
var rotlumiere, rotfinal;
main(doc,op)
{
//symetrie = "x";
//symetrie = "y";
symetrie = "z";
copie=doc->FindObject("lampe copie");
lumiere = op->GetDown();
if (!lumiere) return; //si il n'y a pas d'objet enfant on quitte
if (!instanceof(lumiere, LightObject)) return; //si l'enfant n'est pas une lumière on quitte
poslumiere = lumiere->GetPosition();
rotlumiere=lumiere->GetRotation();
posymetrie = op->GetPosition();
if (symetrie=="x") {
distance = poslumiere.x - posymetrie.x;
final=vector (posymetrie.x-distance,poslumiere.y,poslumiere.z);
rotfinal=rotlumiere;
rotfinal.x=-rotfinal.x;
rotfinal.z=-rotfinal.z;
}
if (symetrie=="y") {
distance = poslumiere.y - posymetrie.y;
final=vector (poslumiere.x,posymetrie.y-distance,poslumiere.z);
rotfinal=rotlumiere;
rotfinal.z=-rotfinal.z;
rotfinal.y=-rotfinal.y;
}
if (symetrie=="z") {
distance = poslumiere.z - posymetrie.z;
final=vector (poslumiere.x,poslumiere.y,posymetrie.z-distance);
rotfinal=rotlumiere;
rotfinal.x=-rotfinal.x+Radians(180);
rotfinal.z=-rotfinal.z;
}
if (!copie)
{
copie=new(InstanceObject); //on créé une instance pour notre lumiere
copie->SetName("lampe copie");
var container=copie->GetContainer(); //on accède aux paramètre de cet objet Instance
container->SetData(INSTANCEOBJECT_SOURCE,lumiere->GetName()); //l'instance pointe sur le nom de la lumiere
doc->InsertObject(copie,op,lumiere);
copie->SetContainer(container);
}
copie->SetPosition(final);
copie->SetRotation(rotfinal);
doc->Message(MSG_UPDATE); //actualisation des modifications du document
}
Cette expression doit être placée sur un objet servant de point de symétrie, dans lequel on glisse une lumière, celle-ci sera dupliquée par rapport à un axe définit dans le code (symetrie="z");
Merci Parsto ! :D