3D-Diablotine.com
Nous sommes actuellement le Jeu 17 Juin 2021, 22:20




Publier un nouveau sujet Répondre au sujet  [ 69 messages ]  Aller à la page Précédent  1, 2, 3, 4, 5
 monologue à bâtons rompus 
Auteur Message
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Pour ceux qui ne sauraient pas comment utiliser ces bouts de code; il suffit de lancer ScriptIDE (dans panes) et ensuite les coller dedans puis de cliquer sur execute.

Un peu de temps de recherche et beaucoup de chance pour avoir trouvé la solution:

Code:
(function(){
var actMgr = MainWindow.getActionMgr();
var act = actMgr.getAction(0);
print (act.className);
// Iterate over the actions
for( var i = 0, nActions = actMgr.getNumActions(); i < nActions; i += 1 ){
// Get the 'current' action
act = actMgr.getAction( i );
// If the label of the action does not match the one we are looking for
// Return the class name
print(i, act.className()," ",act.description);


}
})();

vous affichera toutes les actions avec leur utilisation.
Je vois que les actions pour animate dont les précédents numéros allaient de 610 à 625 soit 16 actions sont passées de 424 à 439,ce qui veut dire que la numérotation n'est pas fixe et qu'il vaut mieux utiliser les noms de classe.
A ce propos, si vous vérifiez dans object index, vous verrez que la méthode className n'apparait pas. Super sympa de laisser travailler les gens avec des documents pas à jour.
A noter que vous pouvez créer vos propres actions.
A quoi servent les actions? Elles servent à automatiser ce que vous auriez fait manuellement en vous servant du menu.

En ce qui concerne animate:

424 aniMateAction Show or hide the aniMate2 pane.
425 aniMateSeekFirst Seek to the beginning
426 aniMatePlayToggle Toggle playback On or Off
427 aniMateSeekLast Seek to the end
428 aniMateFrameNext Advance to the next frame
429 aniMateFramePrev Advance to the previous frame
430 aniMateZoomIn Zoom In
431 aniMateZoomOut Zoom Out
432 aniMateCopy Copy
433 aniMatePaste Paste
434 aniMateDelete Delete
435 aniMateKey Set Key
436 aniMateZero Zero Key
437 aniMatePreferences Preferences
438 aniMate2ViewToolAction Click to activate the aniMate2 Viewport Tool
439 aniMate2Pane1Action Show or hide the aniMate2 Constraints pane.

On voit qu'il serait possible de mouvoir le personnage par du script et de créer l'animation qui correspond.
Encore un mot avec les actions. Je vous ai dit que le code général pour lancer une action était:
Code:
(function(){
var oActionMgr = MainWindow.getActionMgr();
var oAction = oActionMgr.findAction("aniMateZoomIn");
if( oAction ){
oAction.trigger();
}
})();

on remplace aniMateZoomIn par l'action parmi les 835 existantes. Toutefois, pour certaines actions, un travail de préparation sera peut-être nécessaire. Lancer animate par exemple (possible aussi par script) ou mettre à jour certaines propriétés (c'est comme ça qu'on appelle les variables d'une classe).


Dim 6 Juin 2021, 12:25
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Puisqu'on est dans le script, on va y rester un peu.
Code:
(function(){
MainWindow.windowTitle = "Mon DAZ à moi";
})();

va changer le nom de DAZ Studio dans la barre de titre


J'ai commis une erreur en disant que className() n'était pas documenté. En fait, j'avais oublié qu'en programmation objet, un classe peut hériter d'une autre et ainsi de suite. Pour ceux qui ne connaissent pas, cela veut dire qu'une classe que l'on dit hériter d'une autre récupère ses méthodes et ses propriétés. En l'occurrence DzAction hérite de QtObject qui a une méthode className.

Si vous avez la curiosité d'aller voir la classe QtObject vous constaterez que de nombreuses classes héritent de cette classe. Probablement toutes les classes d'une manière ou d'une autre puisque c'est la classe de base.

J'avais donc cherché parmi toutes les méthodes de DzAction sans penser à regarder de qui elle héritait.

Je reviens également sur ce que j'avais dit dans un message précédent. Toutes les "actions" que l'on peut utiliser dans un script correspondent à ce que l'on aurait fait manuellement en passant par le menu. Donc, j'en conclus que si lors d'une opération manuelle, vous faites apparaitre une ou des fenêtres qui vous réclament des données, ça veut dire qu'il faudra remplir ces mêmes données dans les propriétés avant de lancer l'action. Il se peut que pour entrer ces propriétés, vous soyez obligés de passer par des méthodes (qui sont en fait des fonctions). Normalement, en programmation objet, on ne laisse pas l'accès direct aux propriétés (pour éviter que l'utilisateur y mette n'importe quoi). Il y a donc des fonctions set pour accéder à ces propriétés (avec vérification que c'est correct) et des get pour récupérer les valeurs.

Pour ceux qui sont intéressés par les scripts, je rappelle que DAZ a mis un certain nombre d'exemples ici:
http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/start

Je reviens sur les actions animate. Elles seront inutiles dans la plupart des cas. Vous aurez pu constater qu'il n'y a pas d'actions permettant d'ajouter un aniblock. J'ai essayé de voir si on pouvait accéder à un menu par une méthode ou une propriété de DzAction mais sans succès. Pour ma défense, je rappelle que je n'ai pas de documentation sur le sujet et qu'on n'en trouve visiblement pas sur internet. Par contre, entre deux bugs de script IDE, je suis arrivé aux conclusions que:
- si on veut travailler sur des aniblocks, il vaut mieux le faire manuellement.
- si on veut se servir des actions animate il faut importer des animations bvh (on peut transformer une animation gfa en bvh). Marchent toutes les actions ayant un rapport avec le curseur avec cette particularité que les actions aniMateSeekFirst et aniMateSeekLast font l'inverse de ce qu'on leur demande (????).

De toutes façons, il serait difficile de construire une animation par script sans savoir ce qu'elle fait.


Lun 7 Juin 2021, 07:49
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Une fois que le script est validé sans erreur, pour l'utiliser plusieurs fois, on n'est pas obligé de le recharger dans scriptIDE. On peut aussi le mettre dans un dossier qu'on appellera scripts et lui attribuer une image (celle qu'on veut).

L'image doit porter le même nom que le script mais ne se voit qu'après un redémarrage de DAZ studio. DAZ Studio utilise des vignettes à 91*91 au format png mais j'ai vu des auteurs utiliser du 150*150.

Un double-clic sur la vignette et le script se déclenche. En examinant des scripts déjà écrits, je vois qu'ils sont conçus un peut différemment mais écrits avec une fonction anonyme comme je l'ai fait ça marche aussi.

Puis j'ai voulu contrôler le pane "Surfaces". Pas de chance, lui aussi n'est accessible que par son nom exact. En fait, on a d'un côté l'interface graphique avec ses méthodes (MainWindow) et de l'autre côté la programmaion avec ses méthodes (App).

Pour trouver l'accès à la fenêtre animate, il avait préalablement fallu que je trouve son nom exact. J'ai du recommencer pour surfaces. Il n'existe qu'une méthode pour accéder à un pane et celle-ci réclame un nom de classe que bien sûr je ne connais pas. Le moyen de le trouver est le code ci-dessous. On fait en fait appel à une méthode qui met tous les noms de classe des panes dans un tableau et on liste le tableau élément par élément. ATTENTION, comme les autres listes que j'ai déjà données il est probable que l'ordre de la liste n'est pas toujours le même, c'est pourquoi SEUL le nom de classe des panes est vraiment utile.

(function(){
var paneMgr = MainWindow.getPaneMgr();
var panes = paneMgr.getPaneList()
var nPanes;
for( var i = 0, nPanes = paneMgr.getNumPanes(); i < nPanes; i += 1 ){
print(panes[i].getLabel());
}
})();

donne:

Help
Scene
Render Settings
Simulation Settings
Surfaces (Color)
UI Widget Map
Viewport
Aux Viewport
Environment
Draw Settings
aniMate2
aniMate2 Constraints
Script IDE
Align
Batch Convert
Parameters
Posing
Cameras
Lights
Shaping
Tool Settings
Content Library
DForm
Figure Setup
Dynamic Clothing
Property Hierarchy
Puppeteer
Render Album
Render Library
Steps
ShaderBuilder
Shader Builder
RSL Editor
Shader Mixer
Smart Content
Install
Timeline
Scene Info
PowerPose
Face Transfer


Mar 8 Juin 2021, 07:34
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Ce que je cherche à faire maintenant est créer un curseur qui règle quelque chose, donc de comprendre comment ça marche.

Si on charge un personnage, on a accès à un certain nombre de réglages et nous allons voir (ou pas) si on arrive à en fabriquer un perso.

Donc, on commence par charger un personnage. On va regarder X translate (dans parameters). Si on clique sur l'icône roue dentée, on peut cliquer sur parameter settings. Et qu'est-ce que nous dit parameter settings?

Name Xtranslate. Zone verrouillée, on ne peut rien changer. Probablement, le nom qui sert à faire le travail
Label Xtranslate. C'est le nom qui apparait au dessus du curseur. On peut le changer, vous pouvez le vérifier par vous-mêmes.
Path General/Transforms/Translation. Dans Parameters vous avez une hiérarchie qui s'affiche. Vous avez entre-autres une branche Transforms avec trois sous-branches Translation, Rotation, Scale. Le path sert à déterminer où le réglage se situera dans cette hiérarchie.

On trouve également d'autres paramètres comme le min et le max, la valeur par défaut. Le nudge est probablement la sensibilité du curseur.

Je ne vois pas (pour l'instant) à quoi correspond components.
Je sais que controllers correspond à la possibilité d'ajouter le réglage du curseur au réglage d'autres curseurs. Quant à keys, il correspond au nombre de frame d'une animation (si le personnage a été enregistré avec une animation).
On a vu qu'un personnage pouvait être enregistré avec une animation incorporé, il peut également être enregistré avec un réglage de morphs.

Renseignement complémentaire: le name est verrouillé pour les réglages créés par DAZ Studio. Je constate qu'il ne l'est pas pour des réglages fait par un auteur extérieur.

Déjà, il y a une application pour fabriquer un curseur perso (dans panes: property hierarchy). Vous sélectionnez avec le bouton droit l'objet pour lequel vous voulez créer un réglage et vous sélectionnez ERC Freeze dans le popup.

Dans le champs property, vous avez deux choix:
select a property:
vous pouvez rendre les réglages de transforms (translate X,Y,Z, rotate X, Y,Z, scale inopérants soit les réglages restent à 0, soit ils varient mais ne sont pas appliqués au personnage.
Vous pouvez choisir une autre propriété dans la hiérarchie de parameters. Si vous choisissez un réglage de morphs, il se peut qu'un tableau apparaisse car un réglage peut interagir avec d'autres. Vous pouvez décocher certaines cases. Vous pouvez même choisir des réglages hidden (cachés).
Je pense qu'il est dangereux de choisir un hidden puisq'on ne sait pas ce qu'il fait. J'avais choisi largeur des areoles et j'ai constaté que le diamètre variait si on changeait ensuite un réglage comme translate X. Donc je ne vois pas l'intérêt mais je n'ai peut-être pas compris la finalité.
Create new
Là, on lance une fenêtre de création de curseur du genre de celle qu'on a quand on est dans le parameter settings d'un réglage.
Une fois qu'on a rempli les champs et qu'on revient à la fenêtre précédente un tableau apparait avec tous les réglages existants (comme quand on clique sur All dans parameters en fait) et on peut décocher pour ne laisser cocher que ce que l'on veut. Je constate d'ailleurs que s'y ajoute les réglages de la chevelure, de la robe, etc... y compris ce qui n'a pas de squelette.
Résultat: Le personnage perd sa couleur, revient au personnage de base, présente un non-fitting de la chevelure mais il y a effectivement un réglage perso que j'avais appelé toto et qui règle toutes les morphs des cases que j'avais cochées en même temps, Si on va dans les parameters settings de ce réglages, on voit les morphs qui seront controlés en même temps dans subcomponents.
Mais bon, à partir du moment où mon personnage est totalement déformé pour le reste, je ne vois pas trop l'intérêt.

Mais comme je suis têtu j'ai continué. Je me suis aperçu avec une G8 de base (sans rien d'autre) que mon tableau était vide, alors que j'ai quand même des morphs chargés. Des essais complémentaires m'ont montré que ce qui apparaissait dans le tableau était des morphs dont j'avais chargé la valeur.

Conclusion: pour ne pas perturber le système il vaut mieux ajouter chevelure et vêtements après avoir utilisé property hierarchy? Cet utilitaire peut servir à réunir plusieurs réglages en un seul. Par contre, il disparait dès qu'on fait new. Il suffit de sauver le personnage comme un scène et le réglage apparait dans parameters, même si on redémarre DAZ. Reste à savoir si un réglage qui sert à en régler plusieurs autres a une utilité. A chacun de voir.

La nuit portant conseil, j'ai trouvé une utilité que je n'ai pas vérifié. Les ERC ont une propriété canAnimate. Cette propriété sert à permettre à Animate de fabriquer des images-clés sur des variations d'un réglage. Il faudrait faire l'essai d'un ERC prenant le contrôle d'un autre qui n'a pas la propriété canAnimate pour voir si ce nouvel ERC devient animable.


Mer 9 Juin 2021, 07:24
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Maintenant, examinons le script fourni par DAZ qui s'appelle silent_ERC_freeze.dsa:

Code:
// Define an anonymous function;
// serves as our main loop,
// limits the scope of variables
(function( oNode ){
 
        /*********************************************************************/
        // String : A function for retrieving a translation if one exists
        function text( sText )
        {
                // If the version of the application supports qsTr()
                if( typeof( qsTr ) != "undefined" ){
                        // Return the translated (if any) text
                        return qsTr( sText );
                }
 
                // Return the original text
                return sText;
        };
 
        /*********************************************************************/
        // If the application is less than 4.9.3.95
        if( App.version64 < 0x000400090003005f ){
                // Define message components
                var sTitle = text("Resource Error");
                var sMessage = text("This script requires version 4.9.3.95 or newer.");
                var sOk = text("&OK");
 
                // Inform the user
                MessageBox.information( sMessage, sTitle, sOk );
                // We're done...
                return;
        }
 
        // Initialize
        var oSkeleton = undefined;
        // If we have a bone
        if( oNode.inherits( "DzBone" ) ){
                // Get its skeleton
                oSkeleton = oNode.getSkeleton();
        // If we have a skeleton
        } else if( oNode.inherits( "DzSkeleton" ) ){
                // That is what we're looking for
                oSkeleton = oNode;
        }
 
        // Define a controller; prefer a skeleton
        var oControllerNode = (oSkeleton ? oSkeleton : oNode);
 
        // Let the user know we're busy
        setBusyCursor();
 
        // Declare a property group path
        var sPropertyGroup = "/ERC Freeze Test";
 
        // Create and setup a controller property
        var oControllerProperty = new DzFloatProperty( "ERC_Freeze_Controller", false, true );
        oControllerProperty.setLabel( "ERC Freeze Controller" );
        oControllerProperty.setPath( sPropertyGroup );
        oControllerProperty.setMinMax( -1, 1 );
        oControllerProperty.setIsClamped( true );
        oControllerNode.addProperty( oControllerProperty );
 
        // Create and setup an attenuation property
        var oAttenuateProperty = new DzFloatProperty( "ERC_Freeze_Attenuate", false, true );
        oAttenuateProperty.setLabel( "ERC Freeze Attenuate" );
        oAttenuateProperty.setPath( sPropertyGroup );
        oAttenuateProperty.setMinMax( -1, 1 );
        oAttenuateProperty.setIsClamped( true );
        oControllerNode.addProperty( oAttenuateProperty );
 
        // Create the ERC Freeze utility
        var oFreezer = new DzERCFreeze();
 
        // Set the controller node
        oFreezer.setControllerNode( oControllerNode );
        // Set the controller property
        oFreezer.setControllerProperty( oControllerProperty );
        // Set the type of attentuation
        oFreezer.setAttenuateMode( DzERCFreeze.SubComponents );
        // Set the attentuation property
        oFreezer.setAttenuateProperty( oAttenuateProperty );
 
        // Declare working variable
        var oCurNode;
 
        // Build the list of nodes with properties to freeze
        var aNodes = (oSkeleton ? [ oSkeleton ].concat( oSkeleton.getAllBones() ) : [oNode] );
        // Iterate over the nodes
        for( var i = 0, n = aNodes.length; i < n; i += 1 ){
                // Get the 'current' node
                oCurNode = aNodes[ i ];
                // Add the node's properties
                oFreezer.addPropertiesToFreeze( oCurNode );
        }
 
        // We're not using animated links
        oFreezer.setKeyed( false );
 
        // Restore the figure when the freeze is complete
        oFreezer.setRestoreFigure( true );
        // Restore the rigging when the freeze is complete
        oFreezer.setRestoreRigging( true );
        // Apply the controller property when the freeze is complete
        oFreezer.setApplyController( true );
 
        // Begin collecting undo-able operations
        UndoStack.beginHold();
        // If the freeze is successful
        if( oFreezer.doFreeze() ){
                // Create the undo item
                UndoStack.accept( text("ERC Freeze") );
        // If the freeze fails
        } else {
                // Cancel the undo item
                UndoStack.cancel();
        }
 
        // Let the user know we're done
        clearBusyCursor();
 
// Finalize the function and invoke
})( Scene.getPrimarySelection() );


Mer 9 Juin 2021, 11:44
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Premier point: on voit en fin du script qu'un appel de fonction a été inséré, ce qui explique pourquoi la fonction anonyme prend un paramètre. On aurait pu faire une fonction sans paramètre et faire le scene.getPrimarySelection dans le code.

Scene.getPrimarySelection veut dire que vous avez l'obligation de sélectionner un objet dans l'onglet scene. Si vous ne le faites pas, il y aura une erreur car la fonction attend un paramètre DzNode qu'elle n'aura pas.

Second point: la partie qui se déroule se situe à l'endroit où le commentaire indique "initialize". Comme cette partie appelle des fonctions, il faut que celles-ci soient connues, donc déclarées avant le code principal.

Je ne vois pas à quoi sert la fonction text. Visiblement, toutes les versions de DAZ ne supportaient pas qStr. La fonction d'après vérifie que la version de DAZ n'est pas inférieure à DAZ 4.9.35 mais en 64 bits. Peut-être que la fonction text sert pour les versions 32 bits.

Partie initialize: on vérifie que le node hérite bien de la classe DzBone. Si oui, on récupère le squelette. Si non si le node hérite de la classe skeleton et dans ce cas la variable oSkeleton vaut le node.
On résume:
si dans scene on clique dans le vide pour que rien ne soit sélectionné, on a une erreur.
Si dans scene on sélectionne un personnage, on passe dans le if et on récupère un squelette complet
si dans scene on sélectionne un os (le hip par exemple) on passe dans le else if
si dans scene on sélectionne un objet tel qu'un cube qui n'a pas de squelette, on ne passe ni dans l'un ni dans l'autre

J'ai ajouté deux lignes sous la ligne var oControllerNode = (oSkeleton ? oSkeleton : oNode);
Code:
print (oControllerNode.inherits("DzSkeleton"));
print (oControllerNode.inherits("DzNode"));

pour savoir où j'en étais. Il s'agit d'un raccourci de if/else. ControllerNode prend la valeur de skeleton s'il est vrai que que celui-ci est vrai et de node s'il est faux, sachant qu'il a été prédéfini à undefined.
Selection d'un personnage, on a true true passe dans le else if
sélection d'un os d'un personnage on a true true passe dans le if
sélection d'un cube on a false true

De toutes façons, les deux curseurs sont crées quelque soit le cas, même pour le cube. La différence est que dans le cas du cube le réglage n'agit sur rien.

On crée le réglage avec new DzFloatProperty( "ERC_Freeze_Controller", false, true );
DzFloat Property a deux constructeurs un sans paramètre et l'autre avec 4 paramètres dont le dernier a la valeur 0 par défaut (voir object index)
Le premier est le nom (ne pas confondre avec le label qui est ce qui est indiqué au-dessus du curseur). On voit que le nom doit être sans espaces, eventuellement avec des underscores). Le seconde est canAnimate. Ca ne concerne pas la possibilité de déplacer le curseur visiblement, ni la possibilité de générer des image-clés dans animate. Le troisième paramètre est isUserProperty qui est à true et je n'ai pas vu de différence en le faisant passer à false.
Set path et setLabel on en a déjà parlé. Minmax également.
Clamped veut dire bloqué et je n'ai pas vu de différence entre true et false
Et la partie importante est celle-ci:
oControllerNode.addProperty( oControllerProperty );
qui est probablement le lien entre le curseur et ce qu'il change.
On ajoute enuite un attenuate de la même manière que le controller.
Sauf que les deux réglages n'agissent sur rien. Enfin pas tout à fait! Pour un personnage complet (avec cheveux, vêtements et tout le tra-la-la, j'ai eu des perturbations comme avec property hierarchy. Les deux curseurs modifiaient mon personnage (ce qu'ils n'auraient pas du faire) mais en sens inverse. On verra plus tard si on peut détecter une différence avec un autre script.

En étudiant d'autres scripts, je me suis rendu compte qu'effectivement les modifications apportées à un node (n'importe quel objet sur scène est un node) étaient enregistrées sous forme de properties. Je vais donc travailler sur un script permettant de voir quels sont ces propriétés et si on peut les manipuler par un ERC (un curseur de réglage).


Mer 9 Juin 2021, 11:45
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Passons à une autre script, récupéré lui aussi:

Code:
(function(){
var oNode = Scene.getPrimarySelection();
// If nothing is selected
if( !oNode ){
// We're done..
return;
}
var oShape = oNode.getObject().getCurrentShape();
var nMat = oShape.getNumMaterials();
for (var k=0; k < nMat; k++) {
var oMat = oShape.getMaterial(k);
var sName = oMat.getName();
print(sName);
if (sName == "Default") {
var oDiffMap = oMat.findProperty( "Luminous Efficacy" );
print(oDiffMap.className());
print(oDiffMap.getLocalValue());

}
}

})();



En fait, il faudra mettre des lignes en commentaires pour qu'il soit utile (on pourrait le bricoler mais je manque de temps). Comme par hasard, le script fonctionne mais certaines classes n'existent pas dans object index. Il est donc difficile de savoir si elles sont obsolètes. Vous chargez ce que vous voulez dans la scène et vous cliquez sur celui dont vous voulez connaitre les matériaux. Avant de lancer ce script, pour ne pas qu'il plante vous devrez mettre en commentaires les lignes depuis if(sName) jusqu'à } (fin de la boucle if) y compris.
Le print (sName) va vous donner le haut de la hiérarchie, Probablement "Default" pour un objet et "Torso","legs" etc pour un personnage.

Vous décommentez if(sName) et vous remplacez if(sName =="Default") par la partie du corps qui vous intéresse si vous avez chargé un personnage. Si c'est un objet, ça doit être bon.
Si vous regardez dans l'onglet Surfaces (Color) vous avez la liste des noms des réglages dont vous pouvez connaitre la valeur. Seulement, le problème c'est que oDiffMap peut être un float, un int, un booléen et qu'il faut d'abord le savoir.
Mettez en commentaire la ligne
Code:
print(oDiffMap.getLocalValue());

et relancer le script. Maintenant vous savez quelle classe aller regarder pour connaitre la valeur, voire la changer. Si vous n'avez pas de résultat, verifiez que vous avez coché ce qu'il faut dans scene.
Là, pour Luminous Efficacy, ça me renvoie un DzFloatProperty et une valeur de 5000.

Pourquoi je me lance là dedans? Je voudrais cumuler deux scripts et créer un curseur réglant la luminosité de la scène par mon plafond de lumière mais dans l'onglet parameters.

Code:
Code:
(function(){

var oNode = Scene.getPrimarySelection();
// If nothing is selected
if( !oNode ){
// We're done..
return;
}
var oShape = oNode.getObject().getCurrentShape();
var nMat = oShape.getNumMaterials();
for (var k=0; k < nMat; k++) {
var oMat = oShape.getMaterial(k);
var sName = oMat.getName();
print(sName);
if (sName == "Default") {
var oDiffMap = oMat.findProperty( "Luminous Efficacy" );
print(oDiffMap.className());
print(oDiffMap.getLocalValue());

}
var oSkeleton = undefined;
// If we have a bone
if( oNode.inherits( "DzBone" ) ){
// Get its skeleton
oSkeleton = oNode.getSkeleton();
// If we have a skeleton
} else if( oNode.inherits( "DzSkeleton" ) ){
// That is what we're looking for
oSkeleton = oNode;
}
 
// Define a controller; prefer a skeleton
var oControllerNode = (oSkeleton ? oSkeleton : oNode);
 
// Let the user know we're busy
setBusyCursor();
 
// Declare a property group path
var sPropertyGroup = "/ERC Freeze Test";
 
// Create and setup a controller property
var oControllerProperty = new DzFloatProperty( "ERC_Freeze_Controller", false, true );
oControllerProperty.setLabel( "ERC Freeze Controller" );
oControllerProperty.setPath( sPropertyGroup );
oControllerProperty.setMinMax( 0, 10000 );
oControllerProperty.setIsClamped( true );
oControllerNode.addProperty( oDiffMap );
// Create the ERC Freeze utility
var oFreezer = new DzERCFreeze();
 
// Set the controller node
oFreezer.setControllerNode( oControllerNode );
// Set the controller property
oFreezer.setControllerProperty( oControllerProperty );
// Set the type of attentuation
oFreezer.setAttenuateMode( DzERCFreeze.SubComponents );
 
}

})();


Le code ci-dessus transfère carrément le réglage dans parameters et le supprime dans Surfaces (Color). Le code est améliorable mais le but est de montrer un principe. Créez un primitive plane, appliquez lui le Shader Preset DAZ Uber Emissive et lancez le script. Vous pouvez contrôler l'intensité de la lumière depuis parameters en ayant sélectionné le plane. J'ai mis le max à 10000 mais vous pouvez mettre plus si vous le souhaitez. Dans le iray settings, passez en mode scene only, sinon vous aurez l'éclairage du dôme et mettez un objet sous le plane, passer le viewport en mode iray.

Bonnes vacances à tous et à la rentrée :multi:


Mer 9 Juin 2021, 11:56
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Bonjour à tous,

Je me suis mis en vacances pour m'occuper un peu de mon projet. Les événements (sondage pour la survie de ce forum) font que je reviens provisoirement avant la rentrée.


Première chose allez voir ce site: https://www.youtube.com/channel/UCAz9LIkKL_hgycE3BT4A1HA
très bonnes vidéos d'explications et en français!

Deuxième chose: si vous ne voulez pas que ce forum disparaisse, inscrivez-vous et participez. Si vous êtes débutant, ce peut être sous forme de questions, si vous êtes chevronnés pour partager votre savoir.


Dim 13 Juin 2021, 07:58
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 898
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Désormais la suite de "monologue à bâtons rompus " sera dans la zone réservée aux abonnés.


Mer 16 Juin 2021, 08:22
Profil
Afficher les messages depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 69 messages ]  Aller à la page Précédent  1, 2, 3, 4, 5


Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 3 invités


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Rechercher pour:
Sauter vers:  

3D-DIABLOTINE.COM © 2002 - 2018 | Reproduction totale ou partielle interdite



Powered by phpBB © phpBB Group | Translated by phpBB.fr © 2007, 2008 | Designed by Vjacheslav Trushkin