tag:blogger.com,1999:blog-51801613512921462902024-03-19T15:24:52.127-07:00Guillaume Jobst CG blogI’m Guillaume Jobst , 29 years-old. I'm a CG technical director.
In this blog I'll especially show differents technical / artistical tests ans works with software like Maya, 3dsMax, Houdini, Mantra, Vray, MentalRay, Renderman or Realflow etc.
Email: contact@guillaume-j.comGuillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comBlogger68125tag:blogger.com,1999:blog-5180161351292146290.post-7212256528727714752017-06-27T13:51:00.000-07:002017-08-03T14:44:42.465-07:00Cirrus: Versioning control over the cloud embedded in 3D app ( Python )I usually work on very different type of assets such as Digital assets in Houdini, meshes, textures etc.<br />
I wanted to have a easy versioning control over these objects just like my python code on github. That is why I decided to create my own tool for that directly embedded in 3D apps using Python.<br />
<br />
I decided to go with Amazon Web Service S3 simple storage, it allows you to keep former version of your assets and have a decent pricing model as well. It comes with a neat python API and it's also easily scalable.<br />
<br />
This tool works on a base of "project", a project is just a folders hierachy where you save your assets and scenes. These folders also exist on the Amazon Cloud. You can then send and get data from / to the cloud direclty you app.<br />
As it is fully python code only ( with PySide2 for UI and boto3 amazon API ), it can be used in many 3D packages which support python ( Maya, Nuke, Houdini, ... ) or even as a standalone app. The video of example bellow is made in Houdini only because it's my main 3D package.<br />
<br />
It also support a lock system where you can "lock" a file you want to work on. The file is then locked on the cloud. If another artist want to work on that asset he / she will have to wait until you finished your task on that asset ( until you submit your asset on the cloud or unlock your file ). This process ( very well known as "checkout asset" in Perforce system for instance ) allows you to safely work with multiple artists on the same project without overlapping your work.<br />
<br />
It also comes with a "plugin" system which allows you to execute python scrits after an action such as, Get a file, Lock a file, Save a file or Click on icon. This, according a filters ( type of files, software etc.).<br />
This allows you for instance to reload a geometry after getting a new version, reloading an digital asset etc.<br />
<br />
This tool is designed to work with Amazon S3 system but the in / out interface is one python file, which can be changed to use another cloud provider as long as they have python API available.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid9gEtrFIBLHJSUJ-oNdgoP79QDYyeqnfKDWB6NajnpaV0SjCK1ztdcqOiF_-DYlH_PaXuEpRiA8aBQ6DT6rPE5GvIh3G9c5iStVg_kmpCojwEmYVhTm85rlkvOkYVssNINR7f4emDvE4/s1600/awsv_code_img.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="1024" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid9gEtrFIBLHJSUJ-oNdgoP79QDYyeqnfKDWB6NajnpaV0SjCK1ztdcqOiF_-DYlH_PaXuEpRiA8aBQ6DT6rPE5GvIh3G9c5iStVg_kmpCojwEmYVhTm85rlkvOkYVssNINR7f4emDvE4/s640/awsv_code_img.jpg" width="640" /></a></div>
Here is an example of the user interface of the tool direclty embedded as a python panel in Houdini where you can browse your project and get or send data from / to the cloud:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLBBcs5meBbaxJKFuEbEKl6oblQINNrMnSoE3Qzx2oXb_9AD_rFAraYCi7ISgPY2ZLsCXLeIIntN1MyXgq3ejVu5c5t47HvhdyO1vEbTjeHM1htbVURSVG0Atj8QmzsgvdPBSE-upWnUk/s1600/awsv_browse.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="623" data-original-width="590" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLBBcs5meBbaxJKFuEbEKl6oblQINNrMnSoE3Qzx2oXb_9AD_rFAraYCi7ISgPY2ZLsCXLeIIntN1MyXgq3ejVu5c5t47HvhdyO1vEbTjeHM1htbVURSVG0Atj8QmzsgvdPBSE-upWnUk/s1600/awsv_browse.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Here is a video explaning a bit how it works and what features are available:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<iframe allowfullscreen="" frameborder="0" height="360" mozallowfullscreen="" src="https://player.vimeo.com/video/223211035?portrait=0" webkitallowfullscreen="" width="640"></iframe><br />
<br />
The tool is still work in progress, there are still some bugs I have to get ride of. I also have to work a bit more and the UI and features.<br />
As usual, the code is available and free on my github: https://github.com/GJpy/AWS_Vault<br />
<br />
<br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-71857466809882668722017-03-07T12:27:00.001-08:002017-03-07T12:28:08.191-08:00Houdini R&D: Gaia ScatterHi folks !<br />
<br />
Here is a small R&D project I've been working on: Gaia Scatter. It's a toolset made of few digital assets driven by a Python interface which helps you to scatter objects on a terrain.<br />
It allows you to have the flexibility of painting combined with the power of procedural rules.<br />
<br />
As it's asset-based you still have a full control on what's going on. No black box here.<br />
<br />
As said, it's still WIP / R&D and I'll test more features soon such as LOD system according to the position of the camera, variation in shaders, dynamic object layers, etc... I'll post updates of the tool here.<br />
<br />
In the meantime, you can find the first video on my vimeo account as well as the source code / digital assets on my github ( not very commented yet tho ... ).<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="360" mozallowfullscreen="" src="https://player.vimeo.com/video/207162865?portrait=0" webkitallowfullscreen="" width="640"></iframe>Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-64793209967210110012017-02-23T14:59:00.002-08:002017-02-23T14:59:20.102-08:00HelpCard maker for Houdini 16I have ported Helpcard maker for Houdini 16 ! enjoy :)<br />
<br />
The houdini 15.5 version is still available under the branch "Houdini 15.5" on my Github !<br />
<br />
https://github.com/GJpy/HelpCardMaker<br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-86395526227795567972017-01-20T10:59:00.001-08:002017-01-20T11:19:41.447-08:00Helpcard maker update: 0.9.4I've just finished an update of helpcard maker, beside few bug fixes, you can now also reorder widgets with a drag and drop system, by clicking on the small handle on the left side of the widget:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzmOj5kHmMvoXuJN2Hq_m0d1aISHz9Az7KeUxhhOP2BH7_ZSyggzw7YMxbbjYiHJ7EMH7SuHYwtw99VFET4iVFnsdefuoYLu5onwax-RtEXEV-xhVSFls6jZhXOyDtiXXPGWvo9PFx-xE/s1600/help_card_reorder.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="439" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzmOj5kHmMvoXuJN2Hq_m0d1aISHz9Az7KeUxhhOP2BH7_ZSyggzw7YMxbbjYiHJ7EMH7SuHYwtw99VFET4iVFnsdefuoYLu5onwax-RtEXEV-xhVSFls6jZhXOyDtiXXPGWvo9PFx-xE/s640/help_card_reorder.jpg" width="640" /></a></div>
<br />
<div style="text-align: center;">
More informations and install files <a href="http://guillaumejobst.blogspot.fr/2016/12/helpcard-maker-for-houdini.html">here</a></div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-27680739319183841482016-12-30T04:43:00.000-08:002017-01-20T11:18:09.906-08:00Helpcard maker for Houdini<iframe allowfullscreen="" frameborder="0" height="360" mozallowfullscreen="" src="https://player.vimeo.com/video/197432788" webkitallowfullscreen="" width="640"></iframe>
<a href="https://vimeo.com/197432788">Help card maker for houdini</a> from <a href="https://vimeo.com/cetras">Cetras</a> on <a href="https://vimeo.com/">Vimeo</a>.<br />
<br />
Changelog:<br />
<br />
0.9.4:<br />
- Fix folders and multiparms random order.<br />
- Only one instance per multiparm is added to the parameters help grid.<br />
- Added handles on the left side of widgets to reorder widgets.<br />
<br />
<br />
<br />
<br />
This is the first version of "Helpcard maker" for Houdini 14 to houdini 15.5.<br />
<br />
<br />
To install it follow these steps: <br />
<br />
<br />
- Download the lastest zip archive of the tool on my github deposit:<a href="https://github.com/GJpy/HelpCardMaker/raw/master/HelpCardMaker.zip">https://github.com/GJpy/HelpCardMaker/raw/master/HelpCardMaker.zip</a> ( github => GJpy ) <br />
<br />
<br />
- Go to your HOME folder/houdiniXX.x and unzip the file in here, you should have now few new files and folders: <br />
<br />
<br />
scripts/python/HelpCardMaker<br />
<div>
config/Icons/helpcardmaker.png<br />
<div>
python_panels/HelpcardMaker.pypanel </div>
<div>
<br />
- Launch Houdini, you'll have the Helpcard maker pypanel available and should be able to directly add a help card maker tab. <br />
<br />
<br />
Any issue or install troubles, feel free to drop an email: contact@guillaume-j.com.<br />
<br />
<br />
This is the first release of the tool, a lot of new features will be added shortly such as link to other pages, vimeo video, new widgets and more !</div>
</div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-7800525462473042372015-05-04T05:01:00.000-07:002015-05-16T16:21:12.669-07:00HCom For Houdini 14.0 and Maya 2015<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial, Helvetica, sans-serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDUubNCwtqtJ8VdI_Ls9xAE-F1DH92nP-iLDZlaAuM0e9WJUy1OuJUHHEyoZV0XGmqDh_H9YImk7Sp73iKndsoXppTGI49fCQn8s-pKiZ4w1e0pqpZ7tOBNJ_wqIc4QaHk0cuyqkL4HHw/s1600/hcom_icon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDUubNCwtqtJ8VdI_Ls9xAE-F1DH92nP-iLDZlaAuM0e9WJUy1OuJUHHEyoZV0XGmqDh_H9YImk7Sp73iKndsoXppTGI49fCQn8s-pKiZ4w1e0pqpZ7tOBNJ_wqIc4QaHk0cuyqkL4HHw/s1600/hcom_icon.png" /></a></span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="MsoPlainText" style="text-align: center;">
<i><span style="font-family: Arial, Helvetica, sans-serif;"> </span><b style="font-family: Arial, Helvetica, sans-serif;">To download the latest version :</b></i></div>
<div class="MsoPlainText" style="text-align: center;">
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><b><i>Github : <a href="https://github.com/GJpy/HCom" target="_blank">https://github.com/GJpy/HCom</a></i></b></span></span><br />
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b></span></span>
<span lang="EN-US"><b style="font-family: Arial, Helvetica, sans-serif;"><a href="http://guillaumejobst.blogspot.fr/p/hcom.html">HCom help and infos</a></b></span><br />
<br />
<i style="font-family: Arial, Helvetica, sans-serif;">Alembic support:</i><br />
<br />
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/128033450" webkitallowfullscreen="" width="500"></iframe> <br />
<br /></div>
<div class="MsoPlainText">
<div style="text-align: center;">
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b></span></span>
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><i>Houdini Client:</i></span></span><br />
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b></span></span></div>
</div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/127091487" webkitallowfullscreen="" width="500"></iframe></div>
<div style="text-align: center;">
<i style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-small;">For Houdini 14 ( 14.0.291 recommended), tested only on
windows.</span></i><br />
<i style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size: x-small;"><br /></span></i>
<br />
<div class="MsoPlainText">
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b></span></span><span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><i>Maya client:</i></span></span><br />
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><b><br /></b></span></span></div>
<div>
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="https://player.vimeo.com/video/127655675" webkitallowfullscreen="" width="500"></iframe><br />
<br /></div>
</div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;">Hcom is a client – server communication system for Houdini and Maya</span></span><br />
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;"><br /></span></span>
<span lang="EN-US"><span style="font-family: Arial, Helvetica, sans-serif;">It allows users to send data between sessions ( Maya and Houdini ) through local network.</span></span></div>
<div class="MsoPlainText">
<br /></div>
<div class="MsoPlainText">
<span style="font-family: Arial, Helvetica, sans-serif;">You can send data like meshes in .obj, bitmaps, alembic caches and Houdini digital assets. More to come soon ...</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;">Maya can receive digital asset only if you have <a href="http://www.sidefx.com/engine" target="_blank">Houdini Engine</a> installed.</span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
<br />
<div style="text-align: center;">
<br /></div>
</div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-72628727986888932232014-12-18T13:29:00.000-08:002014-12-18T13:29:18.420-08:00Demoreel update !Hi folks,<br />
<br />
Here is my latest updated demoreel where I show works I have done as Lighting / Comp TD or Pipeline TD, more update to come soon !<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="//player.vimeo.com/video/113972849" webkitallowfullscreen="" width="500"></iframe> </div>
<div style="text-align: center;">
<a href="http://vimeo.com/113972849">Guillaume Jobst demoreel 2014</a> from <a href="http://vimeo.com/cetras">Cetras</a> on <a href="https://vimeo.com/">Vimeo</a>.</div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-11246911892674156772014-11-11T14:40:00.002-08:002014-12-24T02:36:17.989-08:00hman: Jobs management tool (beta version 0.5.0)Hi all,<br>
<br>
I would like to share a python tool I've been working on for several weeks now: <b>hman</b> ( for <b><span style="color: lime;">H</span></b>oudini <span style="color: lime;"><b>MA</b></span>ya <span style="color: lime;"><b>N</b></span>uke ).<br>
<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/GJpy/hman" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9ESW2-CUqCXuqOfUBh1btn4wLsJrUagwZeK_iioZUHQwlqR9jmJjZMJtUwoH7DtJlNR5N2HtkEsa3UEeo9R756PkY4DG2m4IL96Bt8InHozs9NLwbZnxRBPNogBCVFXmICsg12rRQ_ms/s1600/hman_logo.png"></a></div>
<div style="text-align: center;">
<br></div>
<br>
<br>
It allows you to create a stack of jobs and run them one after the other. Jobs can be:<br>
<br>
- <b>Maya jobs</b> => Rendering a scene or exporting meshes to obj format. You can as well override the camera used or the render layers rendered from hman directly ( .ma file strongly advised ).<br>
<br>
-<b> Houdini jobs</b> => Rendering nodes from a given hip file. Nodes supported for the moment are : Mantra nodes, comp nodes and rop output. You can select the node you want to render from hman directly.<br>
<br>
- <b>Nuke jobs</b> => Writing images from a given write node ( from a nuke script) , which can be selected from hman too.<br>
<br>
- <b>Python jobs</b> => Executing a Python script with a given Python interpreter.<br>
<br>
- <b>Batch command jobs</b> => Can either run a .bat file or a given command with args if any ( test on window only for the moment ).<br>
<br>
<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8wNfTx1_SfZQt4woU-xH9_C_P6DXVP_DpFW8riWyvITbGvTgJWqLYYfJblvaQsDRWPcQdS-4G3iqKDFnlylQjdDtz1vpZsZ-xqW1kjY3gJa27iwV4SqY0D9FAZjHvIMVqOY1Q8ebL67E/s1600/hmanMainUi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="580" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8wNfTx1_SfZQt4woU-xH9_C_P6DXVP_DpFW8riWyvITbGvTgJWqLYYfJblvaQsDRWPcQdS-4G3iqKDFnlylQjdDtz1vpZsZ-xqW1kjY3gJa27iwV4SqY0D9FAZjHvIMVqOY1Q8ebL67E/s640/hmanMainUi.png" width="640"></a></div>
<div style="text-align: center;">
<i>hman main user interface</i></div>
<div style="text-align: center;">
<br></div>
<br>
This tool is written in Python, but doesn't use software python implementation directly as Hython or maya.cmds, it generates scripts and run them with the proper interpreter, this means it can be used with any Python 2.x versions. It's written using PyQt4 tho, be sure you have the right version of PyQt, compatible with the Python version you use, in the "libs" folder.<br>
<br>
You can download the source code latest version on Github. Keep in mind it is still in beta version.<br>
<br>
<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/GJpy/hman" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8p4rr0DWfPkRdN2rPqO9UQI8TUcYt4opPiRk-kxuOG0nAfZZ_6IBB_ytdDRdmZay0qoHi3blaQ38KZJjctsHb39USibMilDyxCuACANei8m-gHYs1j3n9l9_ITle1kzeOAAjpC91VH2w/s1600/githubvol-icon.png"></a></div>
<div style="text-align: center;">
<span style="font-size: x-large;"><a href="https://github.com/GJpy/hman" target="_blank">Download hman on Github</a></span></div>
<div style="text-align: center;">
<br></div>
<div style="text-align: center;">
<br></div>
Find more infos and documentation here: <a href="http://guillaumejobst.blogspot.fr/p/hman.html">hman doc</a><br>
<br>
Any questions, feel free to contact me: <i><a href="mailto:contact@guillaume-j.com">contact@guillaume-j.com</a></i>Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-14024963351317991392014-10-05T11:57:00.001-07:002017-01-20T11:12:37.545-08:00PyTake2 create take using python in HoudiniPyTake is now completely rewritten, new version is now fully object oriented. It allows the user to create and edit takes in houdini using python.<br />
<br />
It works with all version of Houdini (Apprentice, Apprentice HD, escape, master or Indie.) Free for all usage ( comercial or not ).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzYk02NWw5VU5SNm8/view?usp=sharing" target="_blank"><img border="0" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitOfZ789zTrtpc04kWeELM06VMjkCHM8lougdtkms_tynS5fnPRDs6eDsewlHvWrYrxMJc3pDhg33-b6mZWCx3jf5BLHdNw71krFU5pENjPslFPgYIYnV0o08J4FbrxCQrljQs5XVNZJE/s1600/PyTakes.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><a href="https://github.com/GJpy/Houpy_PyTake2" target="_blank">Download latest version on Github</a></b></div>
<br />
To create a new take, just instance a new Take() object :<br />
<br />
<span style="color: #6fa8dc;">import PyTake2 as pt</span><br />
<br />
<i># This will create a new take and add it to the take list</i><br />
<span style="color: #6fa8dc;">myTake = pt.Take('mytake')</span><br />
<br />
<i>#This will include the display flag of the node « /obj/grid/grid1 » to the take.</i><br />
<span style="color: #6fa8dc;">myTake.includeDisplayFlag('/obj/grid/grid1')</span><br />
<br />
<i># You can also use a hou.Node() as parameter :</i><br />
<span style="color: #6fa8dc;">node = hou.node('/obj/sphere/sphere1')</span><br />
<span style="color: #6fa8dc;">myTake.includeDisplayFlag(node)</span><br />
<br />
<i># To include all parms of a node to the take, use :</i><br />
<span style="color: #6fa8dc;">myTake.includeParms(node)</span><br />
<br />
<i># To add only some parameters, use :</i><br />
<span style="color: #6fa8dc;">myTake.includeParms(node, parms_dict={'radx':None, 'rady':None, 'radz':None))</span><br />
<br />
<i># To add only some parameters, and set node's parameters values use :</i><br />
<i># This will set radx to 5, rady to 1 and radz to 2 in the take.</i><br />
<span style="color: #6fa8dc;">myTake.includeParms(node, parms_dict={'radx':5, 'rady':1, 'radz':2),set_parms_value=True)</span><br />
<br />
<i>#To exclude parms from the take, use :</i><br />
<span style="color: #6fa8dc;">myTake.includeParms(node, parms_dict={'radx':None, 'rady':None, 'radz':None},include=False)</span><br />
<br />
<i># To copy a take</i><br />
<span style="color: #6fa8dc;">copy_take = myTake.copy()</span><br />
<i># => this create a new take name_copy</i><br />
<i><br /></i>
<i># To remove a take :</i><br />
<span style="color: #6fa8dc;">myTake.remove()</span>Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-13889723373142231172014-09-21T06:05:00.004-07:002014-09-21T06:52:54.796-07:00Maya / Houdini Python live connectionI'm playing a bit with rpc module and python. Here is a little example of what I've tried so far, a live connection between Maya and Houdini.<br />
Maya looks up for Houdini start up and then connects its python to Houdini's automatically. Thanks to that, in this video, I create a "live connected" camera and I can also send meshes directly from Maya to Houdini ( and vise versa ).<br />
<br />
This needs the rpyc module for Python 2.7 ( it is also included with Houdini ), you can downloaded it at this adress :<a href="http://rpyc.readthedocs.org/en/latest/" target="_blank"> http://rpyc.readthedocs.org/en/latest/</a><br />
<div style="text-align: center;">
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Here is the source code for the connection Maya => Houdini. It must be saved in the scripts folder of maya and used as followed from a Python shelf tool:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b><span style="color: #3d85c6;"> import MayaModule</span></b></div>
<div style="text-align: left;">
<b><span style="color: #3d85c6;"> ui = MayaModule.MayaConnectionUI()</span></b></div>
<div style="text-align: left;">
<b><span style="color: #3d85c6;"> ui.show()</span></b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
You can copy the icons green_light.png and red_light.png in a folder "icons" saved in the same place as the python file.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
On the Houdini side, you must have a Python file called "123.py" (or hescape.py if you use Houdini Escape ) withthese two lines of code in it:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b><span style="color: #3d85c6;"> import hrpyc</span></b></div>
<div style="text-align: left;">
<b><span style="color: #3d85c6;"> server = hrpyc.start_server(port=18812)</span></b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
<b><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzSkkwSXRlOGFSN2c/edit?usp=sharing" target="_blank">Download Maya script source code</a></b></div>
<div style="text-align: left;">
<br />
<br /></div>
</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="//player.vimeo.com/video/106691975" webkitallowfullscreen="" width="500"></iframe> </div>
<div style="text-align: center;">
<a href="http://vimeo.com/106691975">Houdini / Maya Python live connection</a> from <a href="http://vimeo.com/user3968066">Cetras</a> on <a href="https://vimeo.com/">Vimeo</a>.</div>Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-58336481876420416262014-08-30T03:36:00.001-07:002014-08-30T03:36:27.786-07:00Alien Isolation TrailerA it late, but finally here is the latest trailer I worked on at Axis animation, as lighintg / compositing artist and TD ! That was almost a year ago... Good to see it online !<br />
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="281" mozallowfullscreen="" src="//player.vimeo.com/video/103369924" webkitallowfullscreen="" width="500"></iframe> <br />
<div style="text-align: center;">
<a href="http://vimeo.com/103369924">Alien: Isolation - Improvise</a> from <a href="http://vimeo.com/axisanimation">axisanimation</a> on <a href="https://vimeo.com/">Vimeo</a>.</div>
</div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-42191798066099367082014-08-05T04:59:00.002-07:002014-08-05T04:59:38.769-07:00Powerful method hou.hipFileJust a quick arcticle to speak a bit about the not well known but powerful python class hou.hipFile.<br />
It allows you to have access, open, edit, save, merge hip file from python. For instance, you could drive Houdini from an external python tool without opening Houdini at all.<br />
<br />
You have access then to all python methode of the Houdini module. You can export geos, do mantra rendering, create / manipulate object and otls etc.<br />
<br />
For instance the code bellow, we will open the hip file "houhipfile.hip" and export the geo which is in that file tanks to a rop_output node, (warning this does not work with houdini apprentice):<br />
<br />
<span style="color: #666666;"># Here we setup the path to the HIP file as well as where you want to export the bgeo file.</span><br />
<span style="color: #0b5394;">PATH = r"H:/houhipfile.hip"</span><br />
<span style="color: #0b5394;">OUTPUT_GEO = r"H:/teapot.bgeo"</span><br />
<br />
<span style="color: #666666;"># Here we load the hip file.</span><br />
<span style="color: #0b5394;">hou.hipFile.load(PATH)</span><br />
<br />
<span style="color: #666666;"># Then we fetch the rop output node</span><br />
<span style="color: #0b5394;">ropNode = hou.node("obj/outputGeo/rop_output")</span><br />
<br />
<span style="color: #666666;"># We change the Ouput path parameter</span><br />
<span style="color: #0b5394;">ropNode.parm("sopouput").set(OUTPUT_GEO)</span><br />
<br />
<span style="color: #666666;"># We do the render ( exporting the geo )</span><br />
<span style="color: #0b5394;">ropnode.render()</span><br />
<br />
<span style="color: #666666;"># And finally we clean the current houdini session</span><br />
<span style="color: #0b5394;">hou.hipFile.clear()</span><br />
<span style="color: blue;"><br /></span>
This could be launched from any python tool, with a nice UI in PyQt for instance.<br />
<br />
Instead of opening a hip file, you could of course create nodes from scratch:<br />
<br />
<span style="color: #0b5394;">root = hou.node("/obj")</span><br />
<span style="color: #0b5394;">geo = root.createNode("geo")</span><br />
and then you have access to the geo node's parms, etc.<br />
<br />
More infos here => <a href="http://www.sidefx.com/docs/houdini13.0/hom/hou/hipFile" target="_blank">hou.hipFile class help</a><br />
And you can download the hip file as example <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzenM0bnRXWWVBb1U/edit?usp=sharing" target="_blank">here</a>Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-6521728749653414152014-05-06T07:12:00.000-07:002014-05-06T23:38:26.128-07:00Tutorial: Python sop in houdini [ENG/FR]<br />
<i><a href="http://guillaumejobst.blogspot.fr/2014/05/tutorial-python-sop-in-houdini-engfr.html#french">French Follows!</a></i><br />
<br />
<br />
The idea of this article is to show how to use Python in Houdini for the creation of SOP node. In order to follow this short tutorial you should know basic of Python as well as Houdini ( SOP nodes, digital assets création ... ).<br />
<br />
You can find a ready to go otl <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzWHFCSXVjY01ERk0/edit?usp=sharing" target="_blank">Here</a>, and you can download the python source code <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzV3NDTTNQQVdQejQ/edit?usp=sharing" target="_blank">Here</a>.<br />
<br />
We're going to create an otl via Python which will be able to return in a point attribute the value of the angle between each edges of a ordered curve.<br />
I insiste on that point, the curve must be ordered ! that means points order must follow the direction of the curve. To order curve's points you have multiple possibilities like sort node, nurbs UV, pathfinding etc. This might be the subject of another article later on.<br />
This tool could be created throught vex or with normal nodes of houdini, but the point of this tutorial is to show how python works in Houdini :)<br />
<br />
There are multiple ways to use Python in Houdini, here, we'll create a SOP node by Python.<br />
First, we'll create that node, which is actually nothing else than a digital asset. Use the menu "File => new operator type", then select type: "Python" and "Geometry node" ( it means "SOP node" actually ).<br />
Don't forget to put a name an label just like an normal digital asset.<br />
A window similar to digital asset création opens, the difference is that the tab "Code" is available. This is where we will write our code.<br />
You can see that Houdini write for us a bit of starting code :)<br />
<br />
<i><b># This code is called when instances of this SOP cook.</b></i><br />
<i><b>node = hou.pwd()</b></i><br />
<i><b>geo = node.geometry()</b></i><br />
<i><b><br /></b></i>
<i><b># Add code to modify the contents of geo.</b></i><br />
<br />
Houdini write what is needed in order to fetch the geometry and the node you need.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4o2ZheGuiik1gErmAjgb-cEPdlXdR2fVBzy1T3IYhneWrP-3X0hLfdo6YjsvawLIQGULARPFV78JdhUL4AVNug0Yxqc_9fSb8mv45gbi5o8drC3bOQl6-hpe5er94zuqzeMYf8WUk68A/s1600/codetab.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4o2ZheGuiik1gErmAjgb-cEPdlXdR2fVBzy1T3IYhneWrP-3X0hLfdo6YjsvawLIQGULARPFV78JdhUL4AVNug0Yxqc_9fSb8mv45gbi5o8drC3bOQl6-hpe5er94zuqzeMYf8WUk68A/s1600/codetab.jpg" height="298" width="400" /></a></div>
<br />
<b style="font-style: italic;">node = hou.pwd() =></b> creates a reference to the current node ( our otl )<br />
<i style="font-weight: bold;">geo = node.geometry() => </i>creates a reference of the geometry of the current node, this is where you can modify the actual geometru ( points, vertex, prim etc. ).<br />
<br />
We will create also 2 parameters:<br />
One float called "threshold" with a range from 0 to 180 and a default value at 120.<br />
One String called "groupname", with a default value "anglegroup".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvZwmhJ41sXqWlki4DQNb38RQ7wroESVzV2xolCUc0kCMhmK-OUKYoz2vetJtZiITjzjDRB3FTh7FD1esBQMP_z-kr2CIW7XRSUB5cspiHNo8DC289L7vTcJClM_KOqCTUkEK1EHPQbzo/s1600/threshold.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvZwmhJ41sXqWlki4DQNb38RQ7wroESVzV2xolCUc0kCMhmK-OUKYoz2vetJtZiITjzjDRB3FTh7FD1esBQMP_z-kr2CIW7XRSUB5cspiHNo8DC289L7vTcJClM_KOqCTUkEK1EHPQbzo/s1600/threshold.jpg" height="298" width="400" /></a></div>
<br />
<br />
You can download the source code <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzV3NDTTNQQVdQejQ/edit?usp=sharing" target="_blank">here</a>, we'll have a look on that line after line:<br />
<br />
First of all, we import all the python modules needed. You can import you custom modules as well, as long as they are saved in a folder scanned by Houdini.<br />
<span style="color: blue; font-family: Times, 'Times New Roman', serif;">import math</span><br />
<span style="color: blue; font-family: Times, Times New Roman, serif;">import numpy</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
As seen, we create here a reference to the current node, as well as the current geometry<br />
The line "points = geo.points()" returns a list of all points in the current geometry.<br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;">node = hou.pwd()</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;">geo = node.geometry()</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;">points = geo.points()</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
Here we save in a variable "_threshold" the value of the parameter "threshold" exposed in our UI.<br />
<span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">_threshold = node.evalParm(</span><span style="color: yellow; font-family: Times, 'Times New Roman', serif;">"threshold"</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">)</span><br />
<br />
Then we create a point group, empty for the moment and which will have the name found in the parameter "groupname".<br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;">grp = geo.createPointGroup(</span></span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> node.evalParm(</span><span style="color: yellow; font-family: Times, 'Times New Roman', serif;">"groupname"</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">)</span><span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;">)</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"><br /></span></span>
<span style="font-family: Times, 'Times New Roman', serif;">We create an attribute type point which will have as name "angle" and as default value -1.0. This will allow us to save, for each points, the value of the angle found. For points which won't have angle values the attribute value will be -1.0. ( We will see later on that it's in fact, extremities of the curve)</span><br />
<span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">attr = geo.addAttrib(hou.attribType.Point, </span><span style="color: yellow; font-family: Times, 'Times New Roman', serif;">"angle"</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">, -1.0)</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;">It's here that we start to compute the angle value for each edges. We have to compute the angle between each vector 0 => 1, 2 => 1, 1 => 2, 3 => 2 etc...</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXPgqJVZmmdZQHc2AnIuv-7VNGexpkOD7fcWtvIJEBfIIECBve9zlOnbAu7fqN45eFeU7cq5J9wE9dfAnqtEFjfWuxmFp2ykanQsZ_dC45mZias6hLaXnPxY7CYQq8_qwT2SUQ5t6a2YE/s1600/curve.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXPgqJVZmmdZQHc2AnIuv-7VNGexpkOD7fcWtvIJEBfIIECBve9zlOnbAu7fqN45eFeU7cq5J9wE9dfAnqtEFjfWuxmFp2ykanQsZ_dC45mZias6hLaXnPxY7CYQq8_qwT2SUQ5t6a2YE/s1600/curve.jpg" height="150" width="400" /></a></div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;">Let's do a bit of math ! We have 3 points p0, p1, p2, the vector v0->1 will be compute as followed:</span><br />
<div class="separator" style="clear: both;">
<i><br /></i></div>
<div class="separator" style="clear: both;">
<i>vx = p0x - p1x</i></div>
<div class="separator" style="clear: both;">
<i>vy = p0y - p1y</i></div>
<div class="separator" style="clear: both;">
<i>vz = p0z - p1z</i></div>
<div class="separator" style="clear: both;">
<i><br /></i></div>
<div class="separator" style="clear: both;">
Where p0x is the position.x of the point 0 etc.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
For each points of the curve, we will use the current point ( i ) and also the point before ( i-1 ) and the point after ( i+1 ) on the curve.</div>
<div class="separator" style="clear: both;">
So we will start the loop at 1 in order to skip the first point ( which is the point[0] ) and ends it at (length of the list -1) in order to skip the last point:</div>
<span style="color: blue; font-family: Times, 'Times New Roman', serif;">for</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> i </span><span style="color: blue; font-family: Times, 'Times New Roman', serif;">in</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> range(1, len(points)-1):</span><br />
<div class="separator" style="clear: both;">
<br /></div>
<span style="font-family: Times, 'Times New Roman', serif;">Here we save in variables these 3 points.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;"><br /></span>
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> p1 = points[i-1]</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> p0 = points[i]</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> p2 = points[i+1]</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, Times New Roman, serif;">Using the method </span><span style="font-family: Times, 'Times New Roman', serif;">Hou.Point.attribValue(name) we can access to the position values of each points. As the attribute is a vector(x,y,z) we can fetch each values separately for each points:</span><br />
<span style="font-family: Times, 'Times New Roman', serif;"><br /></span>
<span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> p0x = p0.attribValue(</span><span style="color: yellow; font-family: Times, 'Times New Roman', serif;">"P"</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">)[0]</span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p0y = p0.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[1]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p0z = p0.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[2] </span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p1x = p1.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[0]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p1y = p1.attribValue(</span><span style="color: yellow;">"P")</span><span style="color: #6fa8dc;">[1]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p1z = p1.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[2]</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p2x = p2.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[0]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p2y = p2.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[1]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p2z = p2.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[2]</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, Times New Roman, serif;">Then we calculate the vector coordinates and put them in a numpy.array()</span><br />
<span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> v1 = numpy.array([p0x - p1x, p0y - p1y, p0z - p1z])</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> v2 = numpy.array([p0x - p2x, p0y - p2y, p0z - p2z])</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, 'Times New Roman', serif;">Some more math ! The angle between 2 vector in radian is found by:</span><br />
<span style="font-family: Times, 'Times New Roman', serif;"> <b><i> acos( dot(normalize(v1), </i></b></span><span style="font-family: Times, 'Times New Roman', serif;"><b><i>normalize(v2)))</i></b></span><br />
<br />
<span style="font-family: Times, 'Times New Roman', serif;">In our case the line </span><span style="font-family: Times, 'Times New Roman', serif;"><i>"</i></span><span style="font-family: Times, 'Times New Roman', serif;"><i>v1 = v1/numpy.linalg.norm(v1)"</i> normalize our vector v1.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;">and <i>"numpy.dot(v1, v2)"</i> returns the dot product of there 2 vectors.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;">then, "Math.acos(x)" will return the angle in radian where x is the dot product result.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;">finally math.degrees(x) will convert radian value to degres angle value.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;"><br /></span>
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> out = math.acos(numpy.dot(v1/numpy.linalg.norm(v1), v2/numpy.linalg.norm(v2)))</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> out = math.degrees(out)</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, Times New Roman, serif;">We save the angle value in the point attribute we created:</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> points[i].setAttribValue(attr, out)</span><br />
<br />
And as bonus, if the angle found is smaller than the threshold value, we put the current point in the point group we created.<br />
<span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> </span><span style="color: blue; font-family: Times, 'Times New Roman', serif;">if</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> out < _threshold:</span><br />
<span style="color: #6fa8dc; font-family: Courier New, Courier, monospace;"> grp.add(points[i])</span><br />
<div>
<span style="color: #6fa8dc; font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
Et voilà ! Our node is ready to be used ! We could've add some other options like change the threshold test via an option "greater than or smaller than", expose a string parameter for the name of the attribut angle etc.</div>
<div>
<br /></div>
<div>
The node is in the tab menu at SOP level only, ready to go :)</div>
<div>
<br /></div>
<div>
Any questions or comments: contact@guillaume-j.com !</div>
<div>
<br /></div>
<div>
<br /></div>
-----------------------------------------------------------------------------------------------------------<br />
-----------------------------------------------------------------------------------------------------------
<a href="https://www.blogger.com/null" name="french"></a>
<br />
<br />
<br />
<br />
L'idée de ce billet est de présenter un peu l'utilisation de Python dans houdini au niveau SOP object. Ce court tutorial part du principe que vous connaissez déjà les rudiments de Python ainsi qu'Houdini (Nodes SOP, création de digital assets etc.).<br />
<br />
Vous pouvez trouver <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzWHFCSXVjY01ERk0/edit?usp=sharing" target="_blank"><u>ici</u> </a>un digital asset pré-fait, ainsi que le code source python <u><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzV3NDTTNQQVdQejQ/edit?usp=sharing" target="_blank">ici</a></u>.<br />
<br />
Nous allons créer un otl en python qui sera capable de retourner dans un point attribute la valeur de l'angle observé entre chaques edges d'une courbe ordonnée.<br />
J’insiste sur ce point: la courbe doit être ordonnée, c'est a dire que les points de la courbe suivent le sens de la courbe elle-même. Pour ordonner une courbe de points qui aurait des points générés de façon aléatoire, plusieur solutions s'offrent à avous: sort node via attribut, nurbs UV, path finder etc. Ceci fera peu être l'objet d'un autre billet sur ce blog.<br />
Cet outil pourrait être créé avec des nodes "normaux" d'houdini et / ou du vex sans aucuns doutes. Mais l'idée de ce billet est bien de voir comment fonctionne Python dans Houdini :)<br />
<br />
Il existe plusieurs façons d'utiliser Python dans Houdini, nous allons voir comment créer ici un SOP node custom en python.<br />
Tout d'abord, créer ce fameux node qui sera en faite un digital asset (otl), par le billet du menu File => new operator type.<br />
Selectionnez le type "Python", et également le type "Geometry node" qui correspond au niveau SOP.<br />
N'oubliez pas de mettre un label et un nom comme un digital asset normal et sauver le.<br />
Une fenêtre comparable à la fenêtre de création de digital assez s'ouvre, la différence est que le tab "Code" est disponible, c'est ici qu'on va pouvoir écrire le code Python.<br />
Vous pouvez d'ailleurs voir qu'on code par défaut a été écrit:<br />
<br />
<i><b># This code is called when instances of this SOP cook.</b></i><br />
<i><b>node = hou.pwd()</b></i><br />
<i><b>geo = node.geometry()</b></i><br />
<i><b><br /></b></i>
<i><b># Add code to modify the contents of geo.</b></i><br />
<br />
En effet, Houdini écrit pour nous les bases nécessaires à la création de notre node:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjptIaqfSShZ58GI8lu75bIeR5rIK9c4zc302ntBqknNtNs-95I3zb56nDEbu-ZVxmGv6JmY4R76gSUMPZTfBTY9WoI6VsFj-1pFqsHKoQC0Vt3bKlZEsbSPdVN75faxwsRJ-olP-8i5g4/s1600/codetab.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjptIaqfSShZ58GI8lu75bIeR5rIK9c4zc302ntBqknNtNs-95I3zb56nDEbu-ZVxmGv6JmY4R76gSUMPZTfBTY9WoI6VsFj-1pFqsHKoQC0Vt3bKlZEsbSPdVN75faxwsRJ-olP-8i5g4/s1600/codetab.jpg" height="297" width="400" /></a></div>
<br />
<br />
<b style="font-style: italic;">node = hou.pwd() </b>=> créer une référence au node courant ( notre otl ).<br />
<i><b>geo = node.geometry() </b></i><b style="font-style: italic;"> </b>=> créer une référence à la géometry courante, c'est ici que sont fait toutes les manipulation sur la géometrie de notre input, au niveau vertex, points, primitives etc.<br />
<br />
Nous allons également créer un paramètre "threshold" en float avec un range de 0 à 180, qui nous sera utile par la suite.<br />
Créez également un paramètre string "groupname" avec en valeur par défault "anglegroup".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB_hj_Zz_N3TeBkiJk63wDq6dk8QQ0QasA2TR0zA20E6RD5cjJ2bIkrCzjE8vlVrQNeW2iRtVPceviiNVJmijRIA9Le-Xv532aGWYUOwFcyhqfQe57eJj-A9lpyUmKZCfz-4CelV1v_ow/s1600/threshold.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB_hj_Zz_N3TeBkiJk63wDq6dk8QQ0QasA2TR0zA20E6RD5cjJ2bIkrCzjE8vlVrQNeW2iRtVPceviiNVJmijRIA9Le-Xv532aGWYUOwFcyhqfQe57eJj-A9lpyUmKZCfz-4CelV1v_ow/s1600/threshold.jpg" height="297" width="400" /></a></div>
<br />
<br />
<br />
Vous pouvez télécharger le code source du node <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzV3NDTTNQQVdQejQ/edit?usp=sharing" target="_blank">ici</a>. Nous allons détaillé ce code ligne par ligne:<br />
<br />
Tout d'abord on importe les modules nécessaires, math et numpy. Vous pouvez ici importer toutes sortes de module, interne à Pyhton ou écrites par vous même si elles sont placées dans un dossier scanné par houdini.<br />
<span style="color: blue; font-family: Times, Times New Roman, serif;">import math</span><br />
<span style="color: blue; font-family: Times, Times New Roman, serif;">import numpy</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
Comme vu plus haut, on créer des références au node courrant ainsi qu'à la géométrie courante.<br />
La ligne "points = geo.points()" retourne une liste contenant tout les points de la géométrie.<br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;">node = hou.pwd()</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;">geo = node.geometry()</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;">points = geo.points()</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
Ici nous allons enregistrer dans une variable "_threshold" la valeur de notre paramètre threshold qui sera exposé dans l'interface de notre otl.<br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;">_threshold = node.evalParm(</span><span style="color: yellow;">"threshold"</span><span style="color: #6fa8dc;">)</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
Nous créer ensuite un group de points ( pour le moment vide ), et qui aura comme nom la valeur de notre paramètre "groupname"<br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;">grp = geo.createPointGroup(</span></span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;"> node.evalParm(</span><span style="color: yellow; font-family: Times, 'Times New Roman', serif;">"groupname"</span><span style="color: #6fa8dc; font-family: Times, 'Times New Roman', serif;">)</span><span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;">)</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"><br /></span></span>
<span style="font-family: Times, Times New Roman, serif;">A cette ligne nous créons un attribute de type point qui aura pour nom "angle" et comme valeur par défaut -1.0. Cela nous permettra de sauvegarder, pour chaque points, la valeur d'angle que l'ont va trouver dans cet attribute. Pour les points qui n'auront pas de valeur d'angle, l'angle restera à -1. ( Nous verrons plus loin qu'il s'agit en faite des extrémités de la courbe.</span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;">attr = geo.addAttrib(hou.attribType.Point, </span><span style="color: yellow;">"angle"</span><span style="color: #6fa8dc;">, -1.0)</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;">C'est ici que l'ont commence à calculer l'angle pour chaque edge. Il s'agit de calculer l'angle entre les vecteurs entre les points 0 et 1 et 2 et 1, 1 et 2 et 3 et 2 etc...</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDh29raJnBIbb9raI7hn35l9iZEhcrpRrVdboW0oBmYJ3nuXs69-rNqI81s5hbajrXyBfhyC5PhEsHg2mTl-hbJUnmrRe-8OGB1VyNIm61PibyYTnZKdjZD7pVm3ywPw-alVyFmLatS-E/s1600/curve.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDh29raJnBIbb9raI7hn35l9iZEhcrpRrVdboW0oBmYJ3nuXs69-rNqI81s5hbajrXyBfhyC5PhEsHg2mTl-hbJUnmrRe-8OGB1VyNIm61PibyYTnZKdjZD7pVm3ywPw-alVyFmLatS-E/s1600/curve.jpg" height="120" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Un peu de math ! Nous avons 3 points p0, p1, p2, le vecteur v0->1 sera calculé de la sorte:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i>vx = p0x - p1x</i></div>
<div class="separator" style="clear: both; text-align: left;">
<i>vy = p0y - p1y</i></div>
<div class="separator" style="clear: both; text-align: left;">
<i>vz = p0z - p1z</i></div>
<div class="separator" style="clear: both; text-align: left;">
<i><br /></i></div>
<div class="separator" style="clear: both; text-align: left;">
Ou p0x est la position en x du point 0 etc...</div>
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;">Pour chaque point de la courbe nous allons traiter le point courant ( i ), mais également le point d'avant ( i-1 ) et le point d'après ( i+1 ) sur la courbe. Nous allons donc faire commencer la boucle à 1 pour ignorer le premier point ( qui aura donc une valeur par défaut d'angle de -1.0) et la finir à la longeur de la liste - 1 pour ignorer également le dernier point de la courbe.</span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: blue;">for</span><span style="color: #6fa8dc;"> i </span><span style="color: blue;">in</span><span style="color: #6fa8dc;"> range(1, len(points)-1):</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, 'Times New Roman', serif;">Ici nous mettons dans des variables px les points correspondants.</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> p1 = points[i-1]</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> p0 = points[i]</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> p2 = points[i+1]</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, Times New Roman, serif;">Grâce à la méthode Hou.Point.attribValue(name) nous pouvons accéder aux valeur de position de chaque points, comme l'attribut en question est de type vector(x,y,z) nous pouvons récupérer les valeurs d'x, y et z séparéments pour chacun des trois points:</span><br />
<span style="font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p0x = p0.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[0]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p0y = p0.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[1]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p0z = p0.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[2] </span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p1x = p1.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[0]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p1y = p1.attribValue(</span><span style="color: yellow;">"P")</span><span style="color: #6fa8dc;">[1]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p1z = p1.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[2]</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"><br /></span>
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p2x = p2.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[0]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p2y = p2.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[1]</span></span><br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> p2z = p2.attribValue(</span><span style="color: yellow;">"P"</span><span style="color: #6fa8dc;">)[2]</span></span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, Times New Roman, serif;">Nous calculons ensuite les coordonnées des vecteurs qui nous intéressent et les mettons dans une variable numpy.array().</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> v1 = numpy.array([p0x - p1x, p0y - p1y, p0z - p1z])</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> v2 = numpy.array([p0x - p2x, p0y - p2y, p0z - p2z])</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="font-family: Times, 'Times New Roman', serif;">Encore des math ! L'angle en radian entre deux vecteurs est calculé comme ceci:</span><br />
<span style="font-family: Times, 'Times New Roman', serif;"> <b><i> acos( dot(normalize(v1), </i></b></span><span style="font-family: Times, 'Times New Roman', serif;"><b><i>normalize(v2)))</i></b></span><br />
<span style="font-family: Times, 'Times New Roman', serif;"><br /></span>
<span style="font-family: Times, 'Times New Roman', serif;">Dans notre cas la ligne <i>"</i></span><span style="font-family: Times, 'Times New Roman', serif;"><i>v1 = v1/numpy.linalg.norm(v1)"</i> normalise notre vecteur v1.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;">Puisqu'on utilise le module numpy, numpy.dot(v1, v2) retournera le dot product nécessaire.</span><br />
<span style="font-family: Times, 'Times New Roman', serif;">Math.acos(x) retournera la valeur en radian en partant d'un valeur x ( généré par notre dot product précédent )</span><br />
<span style="font-family: Times, Times New Roman, serif;">Pour finir, math.degrees(x) convertie une valeur x en radian en une valeur d'angle en degrés.</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> out = math.acos(numpy.dot(v1/numpy.linalg.norm(v1), v2/numpy.linalg.norm(v2)))</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> out = math.degrees(out)</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> </span><br />
<span style="color: #999999; font-family: Times, Times New Roman, serif;"> </span><span style="font-family: Times, Times New Roman, serif;">Nous enregistrons la valeur trouvée d'angle dans l'attribut "angle" créé précédemment.</span><br />
<span style="color: #6fa8dc; font-family: Times, Times New Roman, serif;"> points[i].setAttribValue(attr, out)</span><br />
<br />
Et en bonus, si l'angle trouvé est inférieur à l'angle indiqué dans le paramètre threshold, nous ajoutons le point courant dans le group créer au début du node.<br />
<span style="font-family: Times, Times New Roman, serif;"><span style="color: #6fa8dc;"> </span><span style="color: blue;">if</span><span style="color: #6fa8dc;"> out < _threshold:</span></span><br />
<span style="color: #6fa8dc; font-family: Courier New, Courier, monospace;"> grp.add(points[i])</span><br />
<div>
<br /></div>
<div>
Et voilà notre node est prêt à être utilisé ! Nous aurions pu ajouter d'autres options comme changer le test du treshold via un paramètre ( greater than, or smaller than ), un paramètre exposé pour le nom de l'attribut angle etc.</div>
<div>
<br /></div>
<div>
Votre node se trouve maintenant dans le menu tab si vous êtes en SOP level ! :)</div>
<div>
<br /></div>
<div>
Des questions ou remarques: contact@guillaume-j.com !</div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-79696201984651295542014-04-09T23:46:00.002-07:002014-04-09T23:48:42.615-07:00Houdini OTLcheck python scriptHere is a simple python script for Houdini, OTLCheck<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGU4BMd8f5VbBll60HlARbJ2xHMIuQV4eu_3rnmO1Gu3g43o8QMQ6NZfSot_K9Y9koSjV6VOiyvx6ZdpBTwFEdgrvRMy6PJVn1ViTRMOiozIjyiSuPtUkRw3e3fzy5Mei1hGTFawiWdFo/s1600/GJ_otlcheck.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGU4BMd8f5VbBll60HlARbJ2xHMIuQV4eu_3rnmO1Gu3g43o8QMQ6NZfSot_K9Y9koSjV6VOiyvx6ZdpBTwFEdgrvRMy6PJVn1ViTRMOiozIjyiSuPtUkRw3e3fzy5Mei1hGTFawiWdFo/s1600/GJ_otlcheck.jpg" height="112" width="400" /></a></div>
<div style="text-align: center;">
<br />
<h2>
<b><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzR0NEOGFDMHRDbTg/edit?usp=sharing" target="_blank">Download the script here</a></b></h2>
<br /></div>
This script allows the user to check which sub-otl(s) are used inside a selected otl.<br />
It checks all sur subchildren nodes and will print a list of otls and path in the console or in the python shell.<br />
<br />
If the otl uses a uncomplete asset definition the script will output a warning:<br />
WARNING: node <node path>, is embedded.<br />
<br />
The script skips all otls lib built-in shipped with Houdini.<br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-66999759199719682492014-03-08T11:44:00.002-08:002014-03-08T11:46:01.363-08:00Houdini Engine test with UnityHere is a work in progress tool in order to test the Houdini Engine with Unity.<br />
<br />
<div class="western" style="margin-bottom: 0cm;">
This tool helps the
user to create different and procedural kind of "labyrinth-type"
level designs in Unity by using Houdini Digital asset ( .otl ).</div>
<div class="western" style="margin-bottom: 0cm;">
<br /></div>
<div class="western" style="margin-bottom: 0cm;">
Features:</div>
<ul>
<li><div class="western" style="margin-bottom: 0cm;">
Create 3 type of
labyrinth models with Straight modules ( full instancied models), Vegetal, or "random
direction vegetal".</div>
</li>
<li><div class="western" style="margin-bottom: 0cm;">
Extra path inputs
as houdini curves directly in Unity.</div>
</li>
<li><div class="western" style="margin-bottom: 0cm;">
Project Vegetal
and "Random direction vegetal" model on custom terrain
mesh.</div>
</li>
<li><div class="western" style="margin-bottom: 0cm;">
Create a player
starting point randomly in the labyrinth.</div>
</li>
<li><div class="western" style="margin-bottom: 0cm;">
Override every
models used as instance to built a new labyrinth model ( Labyrinth
modules or trees models for Vegetal type ).</div>
</li>
<li><div class="western" style="margin-bottom: 0cm;">
Density, radius,
etc. Options for vegetal labyrinth.</div>
</li>
</ul>
<div>
<span style="text-align: center;"><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzS0pqQndXN2hlZUU/edit?usp=sharing" target="_blank"><i>Documentation of the tool here in .pdf ( work in progress )</i></a></span></div>
<div>
<span style="text-align: center;"><br /></span></div>
<div>
<div style="text-align: center;">
Video example:</div>
</div>
<div>
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="273" mozallowfullscreen="" src="//player.vimeo.com/video/88514256" webkitallowfullscreen="" width="500"></iframe> </div>
<div style="text-align: center;">
<a href="http://vimeo.com/88514256">Houdini Engine and Unity - Labyrinth test</a> from <a href="http://vimeo.com/user3968066">Cetras</a> on <a href="https://vimeo.com/">Vimeo</a>.</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-4021768254213043852014-02-20T13:37:00.001-08:002014-02-20T13:38:57.273-08:00GJ round decimalJust finished a small utility node, GJ round decimal which allows the user to round a float value, you can keep from 0 decimal ( convert to int ), to 4 decimals.<br />
<br />
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzbmp6QmlkY1Z3VTA/edit?usp=sharing"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE1VuurICjUB5dYA8m71ZxFlsgFZdDi-9JAwStMKDGvg_gwnSbYwj0IjfMnXE-hRR5Z7dsAdTgAnRZ4Hn0eib8CT9IowPj5Fz5-lKQXlFypWCDXP8LTq3c07kqTl_KnhqOcvk07-HMPUk/s1600/GJ_rounddecimal.jpg" height="112" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<b><span style="font-size: large;"><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzbmp6QmlkY1Z3VTA/edit?usp=sharing" target="_blank">Download round decimals vop</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4bWQui_kcUm7JIckQ8FpL535r51u8DzouP8PGlS4FgVh5ZZuWFY1wQa7EUj5FJbAnPsE1c1fgMXs5Ufcr12nlRaH383JU8DNnkcvT4j4wrGuHYtDE_0Zm2zsxyTm-TPcYEZc1c9MWCYw/s1600/example.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4bWQui_kcUm7JIckQ8FpL535r51u8DzouP8PGlS4FgVh5ZZuWFY1wQa7EUj5FJbAnPsE1c1fgMXs5Ufcr12nlRaH383JU8DNnkcvT4j4wrGuHYtDE_0Zm2zsxyTm-TPcYEZc1c9MWCYw/s1600/example.jpg" height="342" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-47118932527648427192014-02-15T14:18:00.000-08:002014-02-15T14:22:06.122-08:00WallGen (Voronoï) updatedI have just updated the wallgen tool, with 3 new feature: Density noise, holes parameters and erode top options. More info <a href="http://guillaumejobst.blogspot.fr/2013/11/wallgen-voronoi-houdini-otl.html">here</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://guillaumejobst.blogspot.fr/2013/11/wallgen-voronoi-houdini-otl.html"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS3zaXhP6vYmYmsIFdg8iJFoxn_pWHMBmZJooLayYSgritAlhjN3LJmYfHa8zuYFQqoBuZMM1NiwmEqPBGdbmGVBp75lYlUzUf3KU24zcICbfnF3ZlewKHhlVR9W7lRrwx6J8APLsd_l4/s1600/VorWallGen.jpg" height="111" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
It has been also tested in Maya with the Houdini Engine ( more info <a href="https://www.sidefx.com/index.php?option=com_content&task=view&id=2525&Itemid=66" target="_blank">here </a>), with houdini installed ( apprentice version works fine ) you can now use the asset ( .otl ) inside maya directly :<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuTaEzzlgGidy_6m8yJck97kzkONICuqowK4w5l63KziUDvgeLiYkZ4_V4K090xHohekylWyPzxZQwMRExen_yrUKs5T10lfOdG5XxL2cMemRnQxIbbVpumYPQrqZv4JNj_bAlNwBM5iY/s1600/mayaExemple.jpg" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuTaEzzlgGidy_6m8yJck97kzkONICuqowK4w5l63KziUDvgeLiYkZ4_V4K090xHohekylWyPzxZQwMRExen_yrUKs5T10lfOdG5XxL2cMemRnQxIbbVpumYPQrqZv4JNj_bAlNwBM5iY/s1600/mayaExemple.jpg" height="235" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-44333647410190796512014-02-08T10:21:00.000-08:002014-02-09T12:07:51.410-08:00Houdini OTL: Layered TextureHere is a new little asset, still work in progress, Layered Texture.<br />
Allows the user to create a texture map made of multiple layers inside a material.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzUko3dEViREY3alU/edit?usp=sharing" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcTh_TjP3hSNk0fBklLP-CPH95ED9_2jbGNk_yQQAGEXZCnLgiRzNdk2fOe2NL7Qv_wJshHcvIk6PXiop4-N86Ly48FEg6UOdvxibKc_A8bGDBOTH_ykjPr5cnmMQRbeGSp7Y-G0ywNRk/s1600/GJ_layeredTexture.jpg" height="112" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-size: large;"><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzUko3dEViREY3alU/edit?usp=sharing" target="_blank">Download GJ_Layered_Texture</a></span></b></div>
<br />
<br />
Parameters:<br />
<br />
- 1 Main layer called "base map", UVs built switch with transforms for main layer<br />
<br />
- Layers:<br />
<br />
Layer 0 on top of main layer ( generated by default )<br />
<br />
Add / remove / clear layers button to add layers.<br />
<br />
Enable / Disable layer checkbox<br />
Mode: Multiply, Substract, Mix and Add<br />
UVs transformation for each layers<br />
<br />
Layers are comped on top of each other: L2 on L1 (...) on L0 on MAIN.<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRfu1rhRL6Pa4nEh1CcfbhwRmHdXdsJFlW6mnzMh03mON8_6ImMplJJNn-N45iYp04y7LhRk8R4f8JIW85UibbiCoumMY3_FaHJXTKYih2FYDnNeIcFoSmboUCsDqlMvJ8MLX4knXcLeM/s1600/ui.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRfu1rhRL6Pa4nEh1CcfbhwRmHdXdsJFlW6mnzMh03mON8_6ImMplJJNn-N45iYp04y7LhRk8R4f8JIW85UibbiCoumMY3_FaHJXTKYih2FYDnNeIcFoSmboUCsDqlMvJ8MLX4knXcLeM/s1600/ui.jpg" height="400" width="353" /></a></div>
<br />
Python source code available <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzTjFGNHpKNFU4RlU/edit?usp=sharing" target="_blank">here</a>Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-51059369002008353422013-11-27T13:32:00.000-08:002013-12-23T01:37:58.173-08:00Python SOP node: Connectivity merge groupsHere is a custom python SOP node which merges groups together if they are not connected to each other.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzVXZ1Yi1vSmFMeDg/edit?usp=sharing" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwE-CRwqsBI-woWfwlX5y-i-aNrPdAeajdEaVzXR37v2SaW9FVuGVs40gYgcavOS9rsD1KG4aptJ-ebHzbl-beRgh6iRFs4MMXSHfhi7j07vciMVHUPv7LmzrTosMW2KSYNmKYG8hU3kk/s1600/ConnectivityMergeGroups.jpg" /></a></div>
<br />
<h2 style="text-align: center;">
<b><u><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzVXZ1Yi1vSmFMeDg/edit?usp=sharing" target="_blank">Download Connectivity Merge Groups</a></u></b></h2>
<u>Parameters:</u><br />
<br />
Pattern: <i>Groups used as input</i><br />
Ouput Groups: <i>Create new groups with merges groups</i><br />
Keep Old: <i>Keep old groups</i><br />
<br />
If interested the python source code is availaibe here: <a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzbzRhWnZlcWJfVjg/edit?usp=sharing" target="_blank">Python Source Code</a><br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-41243575085927818312013-11-16T12:36:00.000-08:002014-02-15T14:23:14.057-08:00WallGen - Voronoï - Houdini otlHere is a new tool, derived from the fist WallGen otl. This one use Voronoï noise pattern in order to create 3D rough wall.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzWUJJVUZwUnhNYTg/edit?usp=sharing" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilgzq_PO02cEVJOwLj4va2wl7Fif8wGwhh25dEpRWZnXZSPNuNLEHwbSeMjBuYLp2MemcUOc4lDLSxfEaKjJftAeqOPBzsoYVf9mhRchewjIwUhaZ8OSDyfixto77mwXAGFLvi7vceK1k/s1600/VorWallGen.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzbzBEYlpsUFNNbXM/edit?usp=sharing" target="_blank"><b><span style="font-size: large;">Download WallGen Vononoï</span></b></a></div>
<div style="text-align: center;">
<br /></div>
It takes as input either a closed geo, opened geo, or curve ( must be one primitive poly or nurbs curve ).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1eNx1f4OvDFlydUCdxLkAN45oKC4PfoSOQFVGHdaP3DZr5fMZTUjOzpiehzMiYJ5NULFNpTry36heBdsG35AETQBbOuEqSYz15-51xW1nCw-Euyi-dHbfz_mb_iScCTWrFUN9kqW2Kv4/s1600/SampleWall.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1eNx1f4OvDFlydUCdxLkAN45oKC4PfoSOQFVGHdaP3DZr5fMZTUjOzpiehzMiYJ5NULFNpTry36heBdsG35AETQBbOuEqSYz15-51xW1nCw-Euyi-dHbfz_mb_iScCTWrFUN9kqW2Kv4/s400/SampleWall.jpg" height="221" width="400" /></a></div>
<br />
Options:<br />
<br />
<u><span style="font-size: large;">Input:</span></u><br />
<br />
<b>Edit mode</b>: Hides the wall to have very fast feedback when you change input options ( for instance size of the mesh generated from the curve input ).<br />
<br />
<b>Input:</b> Switch to different kind of inputs => closed geo, opened geo, or curve.<br />
<br />
<b>Inset </b><i>(Opened geo only)</i>: Applies inset to the input polygons<br />
<br />
<b>Width</b><i>(Curve only): </i>The width value of the mesh generated by the curve.<br />
<br />
<b>Heigth</b><i>(Curve only): </i>The heigth value of the mesh generated by the curve.<br />
<br />
<b>UV scale </b><i>(Curve only): </i>The scale of the uvs applied to the mesh.<br />
<br />
<br />
<u><span style="font-size: large;">Wall Controls:</span></u><br />
<br />
<b>Density:</b> Density of the noise pattern<br />
<br />
<b>Density Attribute:</b> Point attribute used to drive the density<br />
<br />
<b>Density Noise:</b> Create a density attribute according a noise pattern <i>(new)</i><br />
<br />
<b>Density Noise Size:</b> Size of the noise pattern <i>(new)</i><br />
<br />
<b>Density Noise Density: </b>Density of the noise pattern <i>(new)</i><br />
<br />
<b>Bias:</b> Bias of the density attribute higher value will increase the density where the density attribute value is the higher.<br />
<br />
<b>Bevel:</b> Applies bevel on the pieces generated ( relative ).<br />
<br />
<b>Smooth: </b>Applies mesh smooth on pieces generated.<br />
<br />
<b>Erode top: </b>Erode top of the wall according to an angle value ( N.y ) <i>(new)</i><br />
<br />
<b>Erode angle:</b> Angle value of erode process <i>(new)</i><br />
<br />
<b>UV Scale:</b> Scale the UVs applied on each pieces.<br />
<br />
<b>Keep Input Geo:</b> Keep the input geo underneath the wall pieces.<br />
<br />
<b>Peak Geo:</b> Peak value applied to the input geo.<br />
<br />
<b>Scale Geo:</b> Uniform scale applied to the input geo ( pivot at centroid ).<br />
<br />
<b>Holes:</b> Create holes on the geometry <i>(new)</i><br />
<br />
<span style="font-size: large;"><u> Export:</u></span><br />
<br />
<b>Export Groups:</b> Put every pieces generated into a different primitive group.<br />
<br />
<b>Path: </b>Output path ( must end with ".obj" )<br />
<br />
<b>Export:</b> Export the mesh.<br />
<br />
<div style="text-align: center;">
<b><u><span style="font-size: large;"><a href="https://drive.google.com/file/d/0Bxphj2BNZ_qzbzBEYlpsUFNNbXM/edit?usp=sharing" target="_blank">Download WallGen Vononoï</a></span></u></b></div>
<br />
<div style="text-align: center;">
<i>If need more help: contact@guillaume-j.com</i></div>
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-52507217700754221282013-07-19T04:14:00.003-07:002013-07-19T04:14:39.824-07:00GJ Attribute <--> Bitmap ( Houdini )Here are 2 little utilities, "Attribute to bitmap" and "Bitmap to attribute"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-tLuHzk6RWuKwXAJ-RrIzb5ogrFTH1HZBiZEX2JpTweXMnTeMvPGvgHG1MbVTeXl1IeMGA-flNxcnHZQXG6WEFF7nqZR76CP6s4CT3ltEMPKrdcxuT3idYTjXcqx8EDdYfbTo1RqE_jc/s1600/attrTobitmap.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-tLuHzk6RWuKwXAJ-RrIzb5ogrFTH1HZBiZEX2JpTweXMnTeMvPGvgHG1MbVTeXl1IeMGA-flNxcnHZQXG6WEFF7nqZR76CP6s4CT3ltEMPKrdcxuT3idYTjXcqx8EDdYfbTo1RqE_jc/s320/attrTobitmap.jpg" width="320" /></a></div>
<br />
<br />
<u>Attribute to bitmap:</u><br />
<br />
Simple node which allows the user to bake attribute values to a bitmap (tga, exr, rat...).<br />
<br />
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0Bxphj2BNZ_qzX0NzMHZxTWZOcm8/edit" target="_blank">Download Attribute to bitmap</a></div>
<br />
<br />
<u>Bitmap to attribute:</u><br />
<br />
Simple SOP node which allows to read data from a bitmap to point attribute.<br />
<br />
- use only luminance toggle<br />
- Multiplier ( intensity )<br />
- Output Attribute Name<br />
- Change the class of the output attribute ( by default it's point ).<br />
<br />
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0Bxphj2BNZ_qzby1Ta1RER3p4OG8" target="_blank">Download Bitmap to attribute</a></div>
<br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-6581442400487485662013-07-18T14:15:00.002-07:002013-07-19T04:05:59.101-07:00GJ Attribute Math ( Houdini )Here is a new utility .otl: AttributeMath<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_BkWHc0VtPKYpVugM7Y5c-Q7Ue1ZtrST_Z_aLUyiBUYSp0XKOkgT0n7ssNV-gTFtD6gPqUt4OTXU8ihM3U-V5iSa55Wu-YthLNiJ_og6hw8SIPHCVppJUZhHJdCjFwdaNFz3wpwx2WV8/s1600/attrMath.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_BkWHc0VtPKYpVugM7Y5c-Q7Ue1ZtrST_Z_aLUyiBUYSp0XKOkgT0n7ssNV-gTFtD6gPqUt4OTXU8ihM3U-V5iSa55Wu-YthLNiJ_og6hw8SIPHCVppJUZhHJdCjFwdaNFz3wpwx2WV8/s320/attrMath.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
Format: Houdini .otl (Digital asset)<br />
<br />
Feature:<br />
<br />
SOP node which allow the user to do math operation between 2 attributes.<br />
<br />
Where A is an attribute and B is either an attribute or a constant, you can do:<br />
<br />
- A - B<br />
- A + B<br />
- A * B<br />
- A / B<br />
- A % B (modulo)<br />
- Remap A values according to a ramp<br />
- Fit Range A values<br />
<br />
Output values are stored in either attribute A or in a new attribute.<br />
<br />
<div style="text-align: center;">
<b><a href="https://docs.google.com/file/d/0Bxphj2BNZ_qzdlpyU1JRM3M0T0E" target="_blank">Download Attribute Math</a></b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<i><u>Examples:</u></i></div>
<div style="text-align: center;">
<i><u><br /></u></i></div>
<div style="text-align: center;">
<i><span style="font-size: x-small;">Add:</span></i></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBbQngglZ13zEgoXTVK8DQgkkkuTtDhkrBv-kZ2L9NeXqLqyvbBzB6_v7kPUmEX9XYHVVRONpTC8OgfT8VA_YfMc9F4uI_21TH-fP2u_PNWRCFmSP4HS7BGTWL5Gcggmt7mIttmqBcjz8/s1600/add.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBbQngglZ13zEgoXTVK8DQgkkkuTtDhkrBv-kZ2L9NeXqLqyvbBzB6_v7kPUmEX9XYHVVRONpTC8OgfT8VA_YfMc9F4uI_21TH-fP2u_PNWRCFmSP4HS7BGTWL5Gcggmt7mIttmqBcjz8/s400/add.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><i>Multiply by a constant:</i></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm4qKBb7W-mkjVP0EN0lxS255JcMTfubWmfMF7aJMxMVLSSiiCpGjcJuD0SVIMjC9E_REDz6sizMR63JNJGEGEX65ysEgII_9xvCkzmUP680z0PyoYkWyK6CGS-aRG4aQBBR5_Db6bXSo/s1600/multiBy2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm4qKBb7W-mkjVP0EN0lxS255JcMTfubWmfMF7aJMxMVLSSiiCpGjcJuD0SVIMjC9E_REDz6sizMR63JNJGEGEX65ysEgII_9xvCkzmUP680z0PyoYkWyK6CGS-aRG4aQBBR5_Db6bXSo/s400/multiBy2.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: x-small;"><i> Remap values by a ramp:</i></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrF1MNXxbPNteahW78EU7NGMavaQPulj3TdxPHi6qW9OvRxYPkvlJCwsWpNV4qKZSrIJrS2cWPMNju9W61Id_b58EVQ4cFKO9Su1zbSEYMtMrwldMevfvIHkmwcevh760TL3qZBjKMA2I/s1600/ramp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrF1MNXxbPNteahW78EU7NGMavaQPulj3TdxPHi6qW9OvRxYPkvlJCwsWpNV4qKZSrIJrS2cWPMNju9W61Id_b58EVQ4cFKO9Su1zbSEYMtMrwldMevfvIHkmwcevh760TL3qZBjKMA2I/s400/ramp.jpg" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-81054985625327018962013-07-11T15:19:00.002-07:002013-07-19T04:06:37.520-07:00GJ Attribut Visu ( Houdini )Here is a new simple utility otl, <i>AttributVisu</i>.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYlzVPSzhg4SQhv9SNNoUJMOYK5HdP9eaEFehwapoZIMYrwvOns5k2A4YmhD3DWyxboyTAQM_QOKBRKst6i7j_3Q-UGOFj3JFuK6DapEYjXSmPZ7J66oJa1DLDDZVf4i9MCw9E8XnZ4Lk/s1600/attributVisu.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYlzVPSzhg4SQhv9SNNoUJMOYK5HdP9eaEFehwapoZIMYrwvOns5k2A4YmhD3DWyxboyTAQM_QOKBRKst6i7j_3Q-UGOFj3JFuK6DapEYjXSmPZ7J66oJa1DLDDZVf4i9MCw9E8XnZ4Lk/s320/attributVisu.jpg" width="320" /></a></div>
<br />
<br />
Simple SOP node which allows the user to visualize attributs ( point, vertex, primitives and details ) in 3D view via a ramp color.<br />
Support any type of regular / custom attributs.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf9LjlhINLbVTlveJoSxOS9niwpKyRkRktwgdhm__mVYatepbHpHHIoKhaAL_eqbTXlreOVUvEEhDravskTsT6fvH-ew8qLLOsnenieu2ngfhVS0RkIB0MFw18EXFp5IaRA_7KmB6eXkE/s1600/qttributVisuUI.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf9LjlhINLbVTlveJoSxOS9niwpKyRkRktwgdhm__mVYatepbHpHHIoKhaAL_eqbTXlreOVUvEEhDravskTsT6fvH-ew8qLLOsnenieu2ngfhVS0RkIB0MFw18EXFp5IaRA_7KmB6eXkE/s400/qttributVisuUI.jpg" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="https://docs.google.com/file/d/0Bxphj2BNZ_qzaVV4c3FnOE1MTE0" target="_blank"><b>Download Attribut Visu</b></a></div>
<br />
<br />Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-83792408421161318012013-07-07T16:39:00.000-07:002013-07-17T04:44:04.217-07:00GJ Isolate Selection ( Houdini )Here is another utiliy: Isolate selection for Houdini<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhVb_a4YoZCVgQka9vljEk4rUNU3tG7ardQ-Qf5J2x1fUXrUj8SC032ylIkicObv9UHtYVZNZZQ_AMDwy8JezI75yavBbTXg0vs7wqyIFd3pQnfBlxDIFi1CK4FRACS3jBe5_PCV-tbQ/s1600/isolateSelection.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhVb_a4YoZCVgQka9vljEk4rUNU3tG7ardQ-Qf5J2x1fUXrUj8SC032ylIkicObv9UHtYVZNZZQ_AMDwy8JezI75yavBbTXg0vs7wqyIFd3pQnfBlxDIFi1CK4FRACS3jBe5_PCV-tbQ/s320/isolateSelection.jpg" width="320" /></a></div>
<br />
This python script allows the user to isolate an object ( by hiding all others ). Then to display back the objects when you exit the isolate mode.<br />
The script keeps in memory which nodes were displayed or hidden before the isolate process. ( it uses a hou.session python module ).<br />
<br />
Python Script for Houdini<br />
<br />
How to use:<br />
<br />
- Copy the .py file in "C:\Program Files\Side Effects Software\Houdini XX.X.xxx\python26\lib" or whatever python folder used by Houdini<br />
- Create a new tool in a shelf: Right-clic -> new tool<br />
- In tab "Script" write these two lines:<br />
<br />
import IsolateSelection<br />
reload(IsolateSelection)<br />
<br />
<span id="goog_1006166040"></span><span id="goog_1006166041"></span><a href="http://www.blogger.com/"></a>Select an object to isolate that object by a clic on the tool just created, clic again on that tool to display back all other nodes.<br />
<br />
<div style="text-align: center;">
<b><u><a href="https://docs.google.com/file/d/0Bxphj2BNZ_qzcDNRVjZfM1pCTEk/edit" target="_blank">Download Isolate Selection for Houdini</a></u></b><br />
<b><br /></b>
<b><br /></b></div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.comtag:blogger.com,1999:blog-5180161351292146290.post-17853830418437163092013-07-03T16:40:00.001-07:002013-07-19T04:07:27.534-07:00GJ Slope ( Houdini )I'm starting a new collection of utilities otls for houdini, here is the first one, called GJ_Slope.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkdBb4nsY0CLKlwutEArmmdqr5xlveEYgp9H5GOHEJ8-9Bi2CydmR9Bt2UmucwrTZjg6IfXYjL64Wzo0VI3wEPXcHMxKSPI9WB4lCrpk2Z_fa9-eTFpNvveJfu-8eBmg6XTnwydUjG1Js/s460/GJSlope.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkdBb4nsY0CLKlwutEArmmdqr5xlveEYgp9H5GOHEJ8-9Bi2CydmR9Bt2UmucwrTZjg6IfXYjL64Wzo0VI3wEPXcHMxKSPI9WB4lCrpk2Z_fa9-eTFpNvveJfu-8eBmg6XTnwydUjG1Js/s320/GJSlope.jpg" width="320" /></a></div>
<br />
<br />
It's a simple node which create a custom attribut driven by the slope of a surface.<br />
<br />
Feature:<br />
<br />
- Custom attribut name<br />
- Ramp multiplicator<br />
- Display value to Color ( Cd )<br />
- Mult / Add by constant<br />
- Invert value<br />
<br />
<div style="text-align: center;">
<b><u><a href="https://docs.google.com/file/d/0Bxphj2BNZ_qzOER3X3BYV2daVFk" target="_blank">Download GJ Slope</a></u></b></div>
<div style="text-align: center;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGTGVFxlVZw3DH0Hu6p0IMlqooapAwzf9tJN_T0GyZxSLzXPnQtaPmOKTmg2LKh51TqoLcEnwW2f2tfj98bE7VzE5P4PwoGCZs6LUq2Jk_QB_DoND4P6hEcOBjFdfTcl6VzWSKEdGViO4/s1026/GJ_Slope_ui.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGTGVFxlVZw3DH0Hu6p0IMlqooapAwzf9tJN_T0GyZxSLzXPnQtaPmOKTmg2LKh51TqoLcEnwW2f2tfj98bE7VzE5P4PwoGCZs6LUq2Jk_QB_DoND4P6hEcOBjFdfTcl6VzWSKEdGViO4/s400/GJ_Slope_ui.jpg" width="400" /></a></div>
<div style="text-align: center;">
<b><br /></b>
<br />
<div style="text-align: center;">
Also available on sideFX <a href="http://www.orbolt.com/asset/Guillaume_Jobst::GJ_slope" target="_blank"><b>orbolt.com</b></a> asset shop. </div>
</div>
Guillaume(j)http://www.blogger.com/profile/14633642032348825456noreply@blogger.com