Modif pour un script de porte

Répondre
Partager Rechercher
Bonjour/soir, j'ai fait l'acquisition d'un script de porte que j'utilise souvent pour des portes de voitures/coffres etc ...

Mais j'ai une question sur le script:

Ce script permet de changer de position un seul objet d'une position X à une position Y d'un seul mouvement ...

Ma question est: Est-ce possible de modifier le script pour qu'il puisse faire changer la position de la porte toujours d'un point X a Y mais en plusieurs mouvement, pour rendre l'animation de la porte lors du changement de position plus fluide

Voici le script en question:

Code PHP:

//------------------------------------------------------
// Timeless Linked Door Script by Timeless Prototype
//------------------------------------------------------
// The latest version of this script can always be found
// in the Library section of the wiki:
// http://www.secondlife.com/badgeo/
// This script is free to use, but whereever it is used
// the SCRIPT's permissions MUST be set to:
// [x] Next owner can modify
// [x] Next owner can copy
// [x] Next owner can transfer
// [x] Allow anyone to copy
// [x] Share with group

//------------------------------------------------------
// USAGE INSTRUCTIONS FOR EVERYDAY USE:
//------------------------------------------------------
// Say the following commands on channel 0:
// 'unlock'     - Unlocks all doors in range.
// 'lock'       - Locks all doors in range and allows
//                only the permitted users to open it.
// To open the door, either Touch it, Walk into it or
// say 'open' or say 'close'.

//------------------------------------------------------
// USAGE INSTRUCTIONS FOR BUILDERS:
//------------------------------------------------------
// 1. Copy and paste this script into the door prim and
//    change the settings (see further down).
// 2. The door prim must be linked to at least one other
//    prim (could be linked to the house for example).
// 3. The door prim MUST NOT be the root prim.
// 4. Use Edit Linked Parts to move, rotate and size the
//    door prim for the closed state.
// 5. When ready, stand close to the door and say
//    '/door closed' (this records the closed door
//    position, rotation and size to the object's
//    name and description).
// 6. Use the Edit Linked parts to move, rotate and size
//    the door prim for the opened state.
// 7. When ready, stand close to the door and say
//    '/door opened' (this records the opened door
//    position, rotation and size).
// 8. Once recorded it will not accept these commands
//    again. If you do need to redo the settings then
//    delete the Name and Description of the door prim
//    (these are where the position information is
//    stored), and then follow the steps above again.
//    Note: deleting the object name won't save, so set
//    the object name to 'Object' to reset the object
//    name.

//------------------------------------------------------
// Change these settings to suit your needs.
//------------------------------------------------------
// To mute any/all of the sounds set the sound string(s)
// to "" (empty string).
// To get the UUID of a sound, right click on the sound
// in your inventory and choose "Copy Asset UUID", then
// paste the UUID in here.
string      doorOpenSound       "startrekdoor";
string      doorCloseSound      "startrekdoor";
string      confirmedSound      "69743cb2-e509-ed4d-4e52-e697dc13d7ac";
string      accessDeniedSound   "58da0f9f-42e5-8a8f-ee51-4fac6c247c98";
string      doorBellSound       "ee871042-e272-d8ec-3d40-0b0cb3371346"// Setting to empty stops door announcements too.
float       autoCloseTime       120.0// 0 seconds to disable auto close.
integer     allowGroupToo       TRUE// Set to FALSE to disallow same group access to door.
list        allowedAgentUUIDs   = ["8efecbac-35de-4f40-89c1-2c772b83cafa"]; // Comma-separated, quoted list of avatar UUIDs who are allowed access to this door.
integer     listenChannel       0;


//------------------------------------------------------
// Leave the rest of the settings alone, these are
// handled by the script itself.
//------------------------------------------------------
integer     isLocked              FALSE// Only when the door is locked do the permissions apply.
integer     isOpen              TRUE;
vector      openPos             ZERO_VECTOR;
rotation    openRot             ZERO_ROTATION;
vector      openScale           ZERO_VECTOR;
vector      closedPos           ZERO_VECTOR;
rotation    closedRot           ZERO_ROTATION;
vector      closedScale         ZERO_VECTOR;
key         openerKey           NULL_KEY;
key         closerKey           NULL_KEY;
integer     isSetup             FALSE;
integer     listenHandle        0;
string      avatarName          "";

mySayName(integer channelstring objectNamestring message)
{
    
string name llGetObjectName();
    
llSetObjectName(objectName);
    
llSay(0"/me " message);
    
llSetObjectName(name);
}

mySay(integer channelstring message)
{
    
string name llGetObjectName();
    
llSetObjectName("Door");
    
llSay(0message);
    
llSetObjectName(name);
}

myOwnerSay(string message)
{
    
string name llGetObjectName();
    
llSetObjectName("Door");
    
llOwnerSay(message);
    
llSetObjectName(name);
}

mySoundConfirmed()
{
    if (
confirmedSound != "")
    {
        
llTriggerSound(confirmedSound1.0);
    }
}

mySoundAccessDenied()
{
    if (
accessDeniedSound != "")
    {
        
llTriggerSound(accessDeniedSound1.0);
    }
}

myGetDoorParams()
{
    
isSetup FALSE;
    if (
llSubStringIndex(llGetObjectDesc(), "door;") == && llSubStringIndex(llGetObjectName(), "door;") == 0)
    {
        list 
nameWords llParseString2List(llGetObjectName(), [";"], []);
        list 
descWords llParseString2List(llGetObjectDesc(), [";"], []);
        if (
llGetListLength(nameWords) != || llGetListLength(descWords) != 4)
        {
            
myOwnerSay("The door prim's name and/or description has invalid syntax and/or number of parameters. Delete the door prim's name and description and setup the door prim again.");
        }
        else
        {
            
openPos = (vector)llList2String(nameWords1);
            
openRot = (rotation)llList2String(nameWords2);
            
openScale = (vector)llList2String(nameWords3);
            
closedPos = (vector)llList2String(descWords1);
            
closedRot = (rotation)llList2String(descWords2);
            
closedScale = (vector)llList2String(descWords3);
            
isSetup TRUE;
        }
    }
}

mySetDoorParams(vector openPosrotation openRotvector openScalevector closedPosrotation closedRotvector closedScale)
{
    
llSetObjectName("door;" +
        (string)
openPos ";" +
        (string)
openRot ";" +
        (string)
openScale);
    
llSetObjectDesc("door;" +
        (string)
closedPos ";" +
        (string)
closedRot ";" +
        (string)
closedScale);
    
isSetup TRUE;
}

integer myPermissionCheck(key id)
{
    
integer hasPermission FALSE;
    if (
isLocked == FALSE)
    {
        
hasPermission TRUE;
    }
    else if (
llGetOwnerKey(id) == llGetOwner())
    {
        
hasPermission TRUE;
    }
    else if (
allowGroupToo == TRUE && llSameGroup(id))
    {
        
hasPermission TRUE;
    }
    else if (
llListFindList(allowedAgentUUIDs, [(string)id]) != -1)
    {
        
hasPermission TRUE;
    }
    return 
hasPermission;
}

myOpenDoor()
{
    
isOpen FALSE;
    
myToggleDoor();
}

myCloseDoor()
{
    
isOpen TRUE;
    
myToggleDoor();
}

myToggleDoor()
{
    if (
isSetup == FALSE)
    {
        
myOwnerSay("The door prim has not been configured yet. Please read the usage instructions in the door script.");
    }
    else if (
llGetLinkNumber() == || llGetLinkNumber() == 1)
    {
        
myOwnerSay("The door prim must be linked to at least one other prim and the door prim must not be the root prim");
    }
    else
    {
        
isOpen = !isOpen;
        if (
isOpen)
        {
            if (
doorBellSound != "")
            {
                
//llTriggerSound(doorBellSound, 1.0);
                
if (avatarName != "")
                {
                    
//mySayName(0, avatarName, "is at the door.");
                    //avatarName = "";
                
}
            }
            if (
doorOpenSound != "")
            {
                
llTriggerSound(doorOpenSound1.0);
            }
            
llSetPrimitiveParams([ PRIM_POSITIONopenPosPRIM_ROTATIONZERO_ROTATION openRot llGetRootRotation(), PRIM_SIZEopenScale ]);
            
// Door API.
            
llMessageLinked(LINK_SET255"cmd|door|opened"NULL_KEY);
        }
        else
        {
            if (
doorCloseSound != "")
            {
                
llTriggerSound(doorCloseSound1.0);
            }
            
llSetPrimitiveParams([ PRIM_POSITIONclosedPosPRIM_ROTATIONZERO_ROTATION closedRot llGetRootRotation(), PRIM_SIZEclosedScale ]);
            
// Door API.
            
llMessageLinked(LINK_SET255"cmd|door|closed"NULL_KEY);
        }
        
        
llSetTimerEvent(0.0);
        if (
isOpen == TRUE && autoCloseTime != 0.0)
        {
            
llSetTimerEvent(autoCloseTime);
        }
    }
}

default
{
    
state_entry()
    {
        
listenHandle llListen(listenChannel""NULL_KEY"");
        
myGetDoorParams();
    }

    
touch_start(integer total_number)
    {
        if (
myPermissionCheck(llDetectedKey(0)) == TRUE)
        {
            
avatarName llDetectedName(0);
            
myToggleDoor();
        }
        else
        {
            
mySoundAccessDenied();
        }
    }
    
    
timer()
    {
        
myCloseDoor();
    }
    
    
link_message(integer sender_numinteger numstring strkey id)
    {
        
// Door API. The API is here in case you want to create PIN entry keypads or whatever.
        
if (num == llGetLinkNumber())
        {
            if (
str == "cmd|door|doOpen")
            {
                
myOpenDoor();
            }
            else if (
str == "cmd|door|doClose")
            {
                
myCloseDoor();
            }
        }
        if (
str == "cmd|door|discover")
        {
            
llMessageLinked(LINK_SET255"cmd|door|discovered|" + (string)llGetKey(), id);
        }
    }
    
    
listen(integer channelstring namekey idstring message)
    {
        
// Performance note: it's quicker to compare the strings than to compare permissions each time anyone says anything on this channel.
        
if (message == "open")
        {
            if (
myPermissionCheck(id) == TRUE)
            {
                
// Only open the door if the person is quite close to this door.
                
openerKey id;
                
closerKey NULL_KEY;
                
avatarName name;
                
llSensor(nameidAGENT5.0TWO_PI);
            }
            else
            {
                
mySoundAccessDenied();
            }
        }
        else if (
message == "close")
        {
            if (
myPermissionCheck(id) == TRUE)
            {
                
openerKey NULL_KEY;
                
closerKey id;
                
avatarName name;
                
// Only close the door if the person is quite close to this door.
                
llSensor(nameidAGENT5.0TWO_PI);
            }
            else
            {
                
mySoundAccessDenied();
            }
        }
        else if (
message == "lock")
        {
            if (
myPermissionCheck(id) == TRUE)
            {
                
isLocked TRUE;
                
mySoundConfirmed();
            }
            else
            {
                
mySoundAccessDenied();
            }
        }
        else if (
message == "unlock")
        {
            if (
myPermissionCheck(id) == TRUE)
            {
                
isLocked FALSE;
                
mySoundConfirmed();
            }
            else
            {
                
mySoundAccessDenied();
            }
        }
        else if (
message == "/door opened" && llSubStringIndex(llGetObjectName(), "door;") == -1)
        {
            if (
llGetOwnerKey(id) == llGetOwner())
            {
                
mySoundConfirmed();
                
openPos llGetLocalPos();
                
openRot llGetLocalRot();
                
openScale llGetScale();
                
isOpen TRUE;
                if (! (
closedPos == ZERO_VECTOR && closedRot == ZERO_ROTATION && closedScale == ZERO_VECTOR))
                {
                    
mySetDoorParams(openPosopenRotopenScaleclosedPosclosedRotclosedScale);
                }
            }
            else
            {
                
mySoundAccessDenied();
            }
        }
        else if (
message == "/door closed" && llSubStringIndex(llGetObjectDesc(), "door;") == -1)
        {
            if (
llGetOwnerKey(id) == llGetOwner())
            {
                
mySoundConfirmed();
                
closedPos llGetLocalPos();
                
closedRot llGetLocalRot();
                
closedScale llGetScale();
                
isOpen FALSE;
                if (! (
openPos == ZERO_VECTOR && openRot == ZERO_ROTATION && openScale == ZERO_VECTOR))
                {
                    
mySetDoorParams(openPosopenRotopenScaleclosedPosclosedRotclosedScale);
                }
            }
            else
            {
                
mySoundAccessDenied();
            }
        }
    }
    
    
sensor(integer num_detected)
    {
        if (
openerKey != NULL_KEY)
        {
            
integer i;
            for (
0num_detectedi++)
            {
                if (
llDetectedKey(i) == openerKey && myPermissionCheck(llDetectedKey(i)) == TRUE)
                {
                    
myOpenDoor();
                }
            }
            
openerKey NULL_KEY;
        }
        else
        {
            
integer i;
            for (
0num_detectedi++)
            {
                if (
llDetectedKey(i) == closerKey && myPermissionCheck(llDetectedKey(i)) == TRUE)
                {
                    
myCloseDoor();
                }
            }
            
closerKey NULL_KEY;
        }
    }

//------------------------------------------------------
// Uncomment the following code if you particularly want
// collisions to affect the door state.    
//------------------------------------------------------

//    collision_start(integer num_detected)
//    {
//        integer i;
//        for (i = 0; i < num_detected; i++)
//        {
//            if (myPermissionCheck(llDetectedKey(i)) == TRUE)
//            {
//                avatarName = llDetectedName(i);
//                myOpenDoor();
//            }
//            else if (llDetectedType(i) & AGENT)
//            {
//                mySoundAccessDenied();
//            }
//        }
//    }

// End of default state and end of script. 
Merci d'avance pour votre temps
bon, je vais pas botter en touche, je vais te faire ca. Et les portes, on va dire que c’est un sujet que je connais bien
Ça me permettra de remettre le pied à l’étrier, ca fait pas mal de temps que j'ai pas scripté, mais ca doit être comme le velo, non ?
Citation :
Publié par Magic Cat
Ça me permettra de remettre le pied à l’étrier, ca fait pas mal de temps que j'ai pas scripté, mais ca doit être comme le velo, non ?
Oui c'est comme le vélo mais attention le terrain est piégé. Je viens de regarder le script qui est assez rustique au niveau mouvement puisqu'il mémorise position, rotation et dimensions de la position fermeture et idem pour l'ouverture, avec un passage sans transition d'un état à l'autre. Si une progressivité du mouvement peut aisément se faire pour une translation, les problèmes apparaissent pour la rotation et la dimension.

En effet une simple interpolation va donner des résultats à coup sûr incorrects parce que l'axe de rotation souhaité ne sera pas le bon dans le cas de la rotation et il y aura des risques de débordements dans le cas de la dimension.

Autrement dit pour automatiser un script de porte en satisfaisant aux 3 exigences mentionnées dans celui-ci il faut d'autres paramètres, comme par exemple l'axe de rotation souhaité et le point de référence pour la dimension.
Il est vrai que ce script est complexe, rien qu'un coup d'oeil rapide sur le script on peut vite s'en rendre compte (bon après j'y connais rien ...)

Mais j'aimerais vraiment garder ce script la si c'est possible, car il est vraiment d'une très bonne qualité, avec tout les options de sons etc ...

Sinon tampis, comme plan B j'essayerais avec le script de l'autre post similaire

J'ai bien vu que le terrain était piégé, c'est pour ça que je me suis gardée de répondre en me disant ça c'est pour bestmomo

Autrement, il y a la solution de faire la rotation sur une 1/2 prim coupée au milieu.
Je suis entièrement d accord avec Elenia et c'est ce que je comptais faire un prim couper en deux pour faire l'axe de rotation. Y a que des cinglés comme christy ou bestmomo pour faire une porte avec une charnière. (je sais de quoi je parle j'ai essayé)
Mais ce script est vieux, nous somme à l'heure du progrès et de la technologie. Il existe llSetprimitivparramfast
avec une petite boucle sur l'angle et roule ma poule l'affaire est dans le script
bonjour,
en revanche, ça va être dur de faire une demi portière de voiture en partant d'un sculpt
Le guide des rotations de Bestmomo detient la solution, elegante ,courte et efficace , permettant même de regler la vitesse d'ouverture de ladite porte moyenant un petit sleep entre chaque incrementation d'angle.
La solution du prim coupé en deux n'est pas vraiment satisfaisante et Menthal a raison pour les sculpts et maintenant les mesh. Après réflexion trouver l'axe de rotation n'est pas si ardu pour une porte classique sur charnière (on oublie les portes de garage ). Il faut procéder en deux étapes :


  1. puisqu'on connait la rotation d'arrivée et de départ on peut calculer la rotation différentielle et du coup on peut obtenir le vecteur de l'axe
  2. pour localiser cet axe dans l'espace c'est une histoire d'invariance : par définition les points situés sur l'axe ne changent pas de position pendant la rotation. Il suffit donc de trouver l'un de ces points pour localiser l'axe. On peut le trouver en partant du fait qu'entre la position de départ et la position d'arrivée l'écart pour un point entre les deux positions est d'autant plus grand que ce point est éloigné de l'axe. Ça hume bon une petite récursion pour trouver ce point .
C'est un peu la même histoire pour le scale sauf s'il y a aussi un déplacement global, auquel cas le problème se complique un peu.
Citation :
Publié par MenthalOH
bonjour,
en revanche, ça va être dur de faire une demi portière de voiture en partant d'un sculpt
Le guide des rotations de Bestmomo detient la solution, elegante ,courte et efficace , permettant même de regler la vitesse d'ouverture de ladite porte moyenant un petit sleep entre chaque incrementation d'angle.
Menthal a raison, ne perdez pas de vue qu'il s'agit de faire bouger des portières de voiture, coffres, etc..., donc à coup sur, un sculpt ou un mesh et là, charnière obligtoire...

Oooppss, désolé grillé par le big chief
c'est vrai que j'avais zapé que c'etait pour un sculpty...
D'ailleurs à ce sujet, il me semble qu'il n'y a pas moyen de savoir sa forme réelle c'est juste boule, donc faire une porte avec une boule, heuuu
bestmomo je cède mon tour
Je sais pas si ça peux aider, mais le Chat Magique parle d'une prim découpée, on fait ça pour décaler l'axe de rotation de la prim et s'affranchir de la charnière.

Donc ça peut fonctionner pareil avec un meshe ou un sculpty, puisque dans les deux cas, l'axe de l'objet résultant sera à l'endroit ou on l'aura placé dans Blender avant l'export.
/me arrive en roulant des épaules (et des hanches) et dit: "Poussez vous les portes c'est ma spécialité".

Sûr la solution Bestmomo est bonne; sauf que parfois ça sautille : avec le lag, rotation et déplacement ne sont pas forcément synchronisés. Je l'ai mise en oeuvre sur des portes de garage et sur des portières de voiture en sculpt. Mais je vous dis pas la galère sur les sculpt pour trouver le bon axe.

Mais bon j'ai la flemme de l'ajouter à ce script conséquent avec toutes ses fonctionnalités, et sur un sculpt c'est infernal pour trouver l'axe. Notre ami Rems n'aura pas un script facile à mettre en oeuvre.

Sûr pour la prim classique la demi-prim reste la meilleure solution si on veut une ouverture progressive (enfin par pas).

@anpton : il y a peut être une piste à creuser là pour les meshes. Mais xomment donc on place l'axe dans blender?
euh....j'ai fais des dizaines de portes de voitures, coffres, et autres...jamais eu de problème d'axes avec le script de bestmomo....
Code PHP:

rotation rot llAxisAngle2Rot(llRot2Up(llGetLocalRot()), DEG_TO_RAD angle); 

parfois le llRot2Up devient llRot2Left ou llRot2Fwd...et changer dimensions.x en y ou z....et ça roule
Si la charnière est parallèle à l'une des directions principales x, y ou z de la porte, il est très facile de trouver les coordonnées de la charnière, dans le repère local de la porte.

J'ai pris comme exemple un simple cylindre découpé, mais le principe reste le même pour un mesh ou un sculpt.

Pour se simplifier la vie, le plus simple est de mettre tous les paramètres de rotation à 0, le temps de faire la manip.
Ensuite, on crée une prim mince, pour matérialiser la charnière, que l'on place visuellement là où doit se trouver l'axe de rotation.

Il suffit ensuite d'éditer chacune des deux prims, et de faire la différence des coordonnées en x et y (dans l'example, puisque la charnière est suivant z) des deux prims.
Le tour est joué : ça donne directement, en coordonnées locales, la position de la charnière par rapport à la porte.

Si la charnière n'est ni suivant x, ni y, ni z, c'est une autre paire de manches. Dans ce cas, un script peut aider à trouver ces coordonnées relatives.

Cela dit, l'idéal est effectivement de concevoir la porte dès le départ de manière à ce que l'axe passe par le centre de la prim, lorsque c'est possible.
Déjà, ça évite le "sautillement" comme l'a dit Elenia.
Et last not least, ça nous simplifie tellement la vie
Miniatures attachées
Cliquez sur l'image pour la voir en taille réelle

Nom : porte1.jpg
Taille : 1100x850
Poids : 86,9 Ko
ID : 173326   Cliquez sur l'image pour la voir en taille réelle

Nom : porte2.jpg
Taille : 1100x850
Poids : 148,4 Ko
ID : 173327  
Citation :
Publié par anpton
Tu sélectionnes tout ton objet et tu le déplaces sur un axe pour le faire tangenter à l'axe de rotation que tu as choisis...
Mes plus humbles excuses à la communauté pour avoir raconté une énorme bêtise, j'avais effectivement réalisé une porte en meshe en décalant l'axe de rotation, mais c'était il y a quelques mois et j'avais oublié un détail...

En effet, il ne suffit pas de décaler l'objet par rapport à son axe il faut également créer une vertice en symétrie qui restera invisible une fois l'objet importé mais fera que l'axe sera ainsi lu au centre de l'objet...

CUBEEE.jpg

Cet axe de rotation restera lié à l'objet, ce qui fait que une fois importé dans SL, même si vous l'inclinez, il continuera de pivoter autour de l'axe ainsi créé dans Blender.
Après avoir effectué quelques tests avec ce script je le trouve déplorable au niveau ergonomie. Mettre la porte dans l'autre position en conservant l'axe de rotation correct est plutôt délicat. Et réciter sa litanie /door xxx dans le chat pas vraiment folichon.

Comme le dit Magic ce script date d'une autre époque et il ne me semble pas vraiment judicieux de le rapiécer. Je rejoins l'autre matou avec son axe mais je vois ça plutôt automatisé, genre le système rezze l'axe, on le positionne où on veut, ensuite avec un menu on provoque la rotation désirée de la porte sans s'embêter avec des manipulations avec l'éditeur, pareil pour les différentes options et hop on balance le tout pour le graver dans une note (j'aime pas trop l'inscription dans le nom et la description à cause de la limitation imposée).
C'est pas possible que après tant d'années et tant de portes crées, on ait encore des problème sur le sujet.
La solution de Anpton me semble être la plus judicieuse pour placer l'axe de rotation où veut. C'est une technique que j'utilisais pour faire des nano prim qui me permettait de faire croire à un gros sculpty car y a quelques vertices qui trainent. Là ca serait pareil quasi pareil...
Et on peut repartir sur un système simple comme un prim découpé avec une rotation progressive avec un llSetPrimitiveParamFast.
Citation :
Publié par Magic Cat
C'est une technique que j'utilisais pour faire des nano prim qui me permettait de faire croire à un gros sculpty car y a quelques vertices qui trainent. Là ca serait pareil quasi pareil...
Tout à fait ça résulte du même principe.
Citation :
Publié par Magic Cat
C'est pas possible que après tant d'années et tant de portes crées, on ait encore des problème sur le sujet.
Et bien justement on en a encore . Sans doute parce que personne n'a vraiment réellement pris en compte les contraintes et les solutions véritablement ergonomiques à mettre en œuvre. Lorsque je lis certains commentaires concernant les produits sur le marketplace j'en suis plus que convaincu. Par exemple pour un produit à 1000l$ :

Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
For L$1000 this has to be a joke..it is smooth. But its buggy and cant use it in a building vendor. The doors drift of in different directions. What is worse BillFox refuses to answer notecards sent to him. (notecards dont get capped like IMs). Great idea...poor execution and way to expensive for what it is. I will not be purchasing from Fox Labs ever again.


Et ça :

Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
smooth rotation is great, the locking is great, the remote is great, but very disapointed in the rotation when i rotate the whole building tried with doors linked,unlinked, and tried every different cut possible, doesn't seem to matter, if the building is rotated doors HAVE TO BE RESET which doesn't help when it's already been loaded into a house vendor and i rotate the vendor :-(
Ha les portes. Mes premières armes en script.

Ma plus belle réussite: la porte diaphragme que j'ai faite pour Sextan. 10 scripts pour faire une ouverture progressive. Aujourd'hui, on ferais ça en un script avec llLinkPrimParametersFast.

Donnez aux gens un monde connecté, ouvert, immense pour ne pas dire quasi-infini, et qu'est qu'ils veulent en premier? Des portes pour s'isoler, verrouillables de préférence. On pourrais en faire un sujet de bac de philo.

La méthode de black cat est géniale pour trouver l'axe sur un sculpt ou un mesh. J'aurais du y penser. Merci.

Et puis anpton, oui, cela m'a semblé tellement simple c'est pour ça que je l'ai qualifié de génial mais il y avait quelque chose qui me génait. Comme ça, cela me semble plus cohérent oui.

Et Magic Cat, ton super script de porte universelle tu le remets sur le métier?
Citation :
Publié par Elenia B.
Et Magic Cat, ton super script de porte universelle tu le remets sur le métier?
Je pense que je vais le revoir pour lui donner un petit coup de neuf pour lui rajouter du smooth.
Puis je le mettrais dans la wiki ici.

Il est pas vraiment universel, car il ne marchera pas dans notre cas de mesh, mais il est fait pour tout les gens qui ne savent pas, ne veulent pas comprendre le script.
Comme Anpton , qui a usé et abusé de ce script
Répondre

Connectés sur ce fil

 
2 connectés (0 membre et 2 invités) Afficher la liste détaillée des connectés