3D-Diablotine.com
Nous sommes actuellement le Jeu 5 Aoû 2021, 15:50




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

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 914
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: 914
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: 914
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: 914
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: 914
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: 914
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: 914
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: 914
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: 914
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Une bonne blague aussi, j'ai essayé de me connecter au discord d'Eric DAZ Studio mais je n'ai réussi qu'à accéder qu'à la version web. J'avais perdu mon mot de passe (ou plutôt je ne l'avais pas enregistré suite à une désinstallation rapide). J'ai essayé les deux solutions pour le redemander et je n'ai pas eu de réponse. Bien sûr, le système refuse de m'enregistrer puisqu'il me connait déjà. Bref, je peux le lire mais pas participer.

Je ne vois pas de différence entre un forum et un discord si ce n'est la difficulté de navigation sur un discord où tout est à la suite et où il faut attendre un certain temps avant le rafraichissement.

Donc ce n'est pas encore le retour de vacances, mais quelques ultimes participations avant de partir.

Parlons d'abord de camera optimizer. Il est censé optimiser la scène en masquant ou en supprimant les objets non vus par la caméra. J'ai fait un essai en supprimant les objets non vus par la caméra et il m'a supprimé des éléments de ma scène. Donc dangereux et pas au point!

Par contre, au cours d'une discussion avec Eric DAZStudio, suite à un tuto qu'il avait fait, scene optimizer permet de gagner du temps de rendu en limitant les dimensions des textures. Il y a quand même la précaution à prendre de sauvegarder son fichier duf de la scène avant de l'optimiser car ce logiciel modifie les liens à l'intérieur du fichier duf. Suspicion qu'il vaut mieux ensuite remettre le fichier original plutôt que de faire appel au script qui vient rétablir les liens d'origine.

Revenons à mon projet. Allez savoir pourquoi, je me suis dit qu'une piscine dans une demeure de luxe ça ne faisait pas cheveu sur la soupe. Pas de piscine à ras du sol car l'herbe du sol viendra remplacer l'eau de la piscine. Il faudrait creuser un trou (comme dans la réalité) dans le sol pour ne pas avoir ce défaut. Ca veut dire utiliser geometry editor mais multiplier le nombre de polygones du plan qui sert pour l'herbe. Autre solution la piscine en hauteur tout en restant suffisamment dans le luxe. Mon choix: Round pool deck. Attention car Round pool deck inclut des arbres et de l'herbe qui va venir par dessus celle sur laquelle la maison est posée. Donc surveiller le translate Y.

C'est là que les choses se corse car cette piscine qui est ronde, il va falloir la remplir d'eau. En ce qui concerne l'eau, j'ai déjà une idée car j'ai fait des essais en ce qui concerne la surface, on peut parfaitement avoir un plane qu'il faudra soigneusement dimensionner mais pourquoi ne pas utiliser directement un cercle? Des cercles, il n'y en a pas dans les primitives mais une cylindre sans trop d'épaisseur devrait faire l'affaire. Pour que le cercle soit un cercle, il faut que le X et le Z scale soit de la même valeur.
A un moment donné, j'ai des valeurs à peu près correcte correspondant à 800% mais la circonférence est plutôt composé de segments de droite. Je relève mes valeurs de translate et je détruit le cylindre pour mieux en refaire un.
Le 800% veut dire qu'il faut que je mette 8m de diamètre au lieu de 1 et je met 50 sides pour que le cercle soit vraiment un cercle. J'ajuste ensuite le tout dans le cylindre de la piscine.

Je clique sur le cylindre pour le sélectionner dans scene et je le sélectionne également dans surfaces. Dans base color je charge la texture fabriquée par Caustic generator. Puis avec l'aide des réglages horizontal et vertical tiles j'arrange un peu la surface de l'eau.

Mais le cutout opacity c'est du on/off. Il faut créer le cylindre à part, le texturer, jouer sur la transparence et ensuite l'incorporer dans la piscine. Sinon on n'a que des réglages iray. Vous trouverez un tuto plus complet chez Dany:http://dchacornac.free.fr/la3d/daz4/daz4d69.htm

Il faut aussi réduire l'épaisseur du cylindre pour n'avoir qu'un disque sinon on a des effets parasites en mettant de la transparence

Je reprends la suite de ce fil à sa position naturelle puisqu'il n'y a pas pour DAZ, d'endroits réservés aux abonnés. En attendant le couperet final!


Mer 16 Juin 2021, 08:22
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 914
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Ma première constatation en faisant un rendu est que malgré que l'eau soit transparente dans le viewport, elle devient opaque au rendu.

Après plusieurs essais, je suis donc revenu à un plane qui n'ayant pas d'épaisseur reste transparent au rendu.

Evidemment, on tombe sur la quadrature du cercle! pour que l'eau recouvre ma piscine qui est ronde et vu qu'il faut un plane pour la transparence, on voit les 4 coins du plane qui déborde du cadre de la piscine. La solution a été une suppression grossière de ce qui débordait du cercle de la piscine puisque la piscine est entouré d'un chemin en bois pour y accéder. Il suffit donc que le plane ne dépasse pas ce chemin. Dès que l'on déplace en hauteur le plane sous ce chemin, il ne reste que l'eau dans la piscine.

Rien à voir, j'ai fait des tests d'Unreal Engine. Dans le principe, c'est fantastique car on a accès à des éléments qui évitent d'avoir à faire du développement. Un jeu peut être rapidement réalisé. Epics, la société qui fournit gratuitement Unreal Engine, fait comme DAZ. C'est à dire que tous les mois, il y a des gratuits à récupérer (mais bien plus évolués que ceux que DAZ met à disposition).

Ca, c'était le côté positif. Côté négatif: temps d'apprentissage supplémentaire même si on trouve des vidéos en français. Volume des informations (au moins 50Go pour le moteur et certains gratuits à plus de 10Go) et Unreal Laucher qui tourne en tâche de fond au lancement de l'ordinateur (ce qui veut dire temps de processeur perdu quand on ne l'utilise pas). Je l'ai donc désinstallé (surtout que je ne joue quasiment jamais).


Lun 21 Juin 2021, 07:45
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 914
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Venons-en à cette possibilité d'animer la texture "eau" dont il a été question précédemment. Une fois que l'on a appliqué la texture eau au plane, on peut régler sa transparence, mais également "horizontal tiles" et "vertical tiles" pour mettre les reflets à la grandeur que l'on veut.
On pourrait également les déplacer avec "horizontal offset" et "vertical offset". La question qui se pose est comment faire pour que ces paramètres varient au cours d'une animation puisque ceux-ci ne semblent pas accessibles à l'animation?
Voici un script qui le permet:
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();

if (sName == "Default") {
// for( var i = 0; i < aPROPERTIES.length; i++ ){
var oDiffMap = oMat.findProperty( "Horizontal Offset" );
oDiffMap.setCanAnimate(true);
oDiffMap = oMat.findProperty( "Vertical Offset" );
oDiffMap.setCanAnimate(true);

}
}
})();


Après avoir appliqué votre texture "eau" sur votre plane, cliquez sur l'objet qui représente le plane "eau" dans scene. Lancez ce script et les paramètres Horizontal offset et Vertical offset deviennent animables.

Là, ce n'est pas Animate qu'il faut gérer mais Timeline. Dès l'ouverture de Timeline vous constaterez que votre plane "eau" apparait dans la hiérarchie de la timeline. Choisissez TROA dans les types. Déplacez votre curseur où vous voulez, modifiez la valeur de Vertical offset et/ou Horizontal offset et cliquez sur clé +. Vous obtenez une animation de l'eau.


Lun 21 Juin 2021, 08:23
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 914
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
Exemple de scripts que j'ai mis avec une image rapide fabriquée sous paint.net (décompresser dans le répertoire scripts:

https://drive.google.com/file/d/1W6qRAhwOdHMhdHRUhSnmX-mUzvtCy_6c/view?usp=sharing

Les scripts ont été fournis par le créateur de Lucie : http://www.lucie-adult-game.com

En général si vous cherchez à masquer un personnage, il ne disparait pas complètement? Avec ces scripts, il suffit de sélectionner le personnage dans l'onglet scene et de double-cliquer sur la vignette pour le faire disparaitre ou réapparaitre complètement. Le script est au format ascii donc lisible.


Lun 21 Juin 2021, 12:46
Profil
Super Diablotin(ine)
Super Diablotin(ine)

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

Quoi de neuf?: https://drive.google.com/file/d/17JbBUzTKPKOvuMEKSY2x7JfJPYhQKDaE/view?usp=sharing

L'eau de cette image a été réalisé selon les renseignements de Dany: http://dchacornac.free.fr/la3d/daz4/daz4d69.htm. Ca ne ressemble pas, c'est normal. Dans l'exemple, le rendu est fait probablement en 3Delight ou est une copie d'écran du viewport. Dans l'image ci-dessus, le rendu a été fait en iray, ce qui m'a posé problème pendant un certain temps. En effet, on voit une transparence de l'eau rapidement avec opacity strength dans le viewport mais dès qu'on fait un rendu en iray, l'eau est totalement opaque. En fait, j'ai fini par essayer une opacity strenght à 2%, ce qui donne le rendu ci-dessus mais fait disparaitre l'eau dans le viewport.

Pour éclairer les personnages, j'utilise parfois la headlamp (la lumière de la caméra) que je règle pour qu'elle ne "crame" pas le personnage le plus proche de la caméra (on peut également décaler les X, Y, Z offset de la headlamp).

Visiblement, le ciel qui apparait (mais pas dans l'image ci-dessu) se trouve chargé dans emission color et luminance de IR_skydome.
Il s'agit de clean blue HD. Plusieurs ciels possibles et voir si le ciel est indépendant des montagnes que l'on voit derrière. Le ciel est également chargé dans emission et luminance pour IR_Skyline.

Ayant un problème de luminosité avec mon skydome et l'image des nuages qui lui est appliquée, j'ai commencé à regarder un peu comment avait procédé l'auteur. En fait, au lieu de mettre un HRDI, l'auteur a utilisé un fichier jpg de ciel. Cette image est chargée dans luminance et dans emission color. D'origine, l'émission color est réglée sur un gris clair et la luminance à 100 000 cd/m2. En la passant à 1 000 000 cd/m2 j'ai la luminosité que je cherchais pour ma scène, mais le ciel devient blanc (le jpg est cramé). Compromis en augmentant le paramètre luminance et en réglant la lampe de la caméra pour éclairer les personnages.

J'oubliais! A 500 samples, le maillot de bain de la mère était truffé de petits points gris. Plutôt que de recommencer un rendu avec plus de samples, j'ai utilisé paint.net pour zoomer sur le maillot de bain et repeindre ces points en noir. Autre point dont je n'ai pas parlé: une femme sur le dos a les seins qui tombent de chaque côté du corps, j'en ai tenu compte dans la pose.


Dernière édition par alinal le Sam 26 Juin 2021, 09:49, édité 1 fois au total.



Sam 26 Juin 2021, 09:33
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 914
Localisation: Hauts de seine
Message Re: monologue à bâtons rompus
J'oubliais aussi que j'avais changé d'ordinateur. La mémoire du précédent était suffisante. Sous iray l'avantage de DAZ Studio est d'utiliser le CPU et la mémoire de l'ordinateur et ce n'est pas forcément le cas pour des renderer comme octane, ce qui fait que la complexité de la scène est rapidement limité pour cause de manque de mémoire sur la carte graphique.

Le fait de changer d'ordinateur n'est pas dû, comme je l'ai dit, à un manque de mémoire (bien que le nouveau fait des rendus bien plus rapides) mais parce que je compte utiliser 3DXChange de Reallusion (dont j'ai déjà parlé). Comme je n'ai le droit qu'à une licence par poste, j'ai choisi de l'installer sur l'ordinateur le plus puissant.

Pourquoi je parle de ça? Parce que je vais utiliser les bvh de Carnegie Mellon, reconditionnés par MCasual en gfa pour extraire des poses que j'appliquerai à G8 (ce qui nécessitera de les reconditionner en gfa. Exemple, l'animation où V3 grimpe à une échelle de playground peut être utilisé pour l'échelle de la piscine.


Sam 26 Juin 2021, 09:44
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)
Avatar de l’utilisateur

Inscrit le: Dim 11 Mar 2012, 20:07
Messages: 349
Message Re: monologue à bâtons rompus
Citer:
une femme sur le dos a les seins qui tombent de chaque côté du corps

Ahaha ! Mais un maillot plus serré évite que ses seins ne tombent !
Chouette rendu,
Costaud tes articles, faut s'accrocher !


Sam 26 Juin 2021, 13:04
Profil
Afficher les messages depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 84 messages ]  Aller à la page Précédent  1, 2, 3, 4, 5, 6  Suivant


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