<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.johnkunz.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>kunz - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.johnkunz.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Special:Contributions/Admin"/>
	<updated>2026-04-28T08:17:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=ResourcesOld&amp;diff=1342</id>
		<title>ResourcesOld</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=ResourcesOld&amp;diff=1342"/>
		<updated>2025-12-31T20:19:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin moved page ResourcesOld to Resources: revert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Resources]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1341</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1341"/>
		<updated>2025-12-31T20:19:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin moved page ResourcesOld to Resources: revert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps] | [https://cc0-textures.com/ CC0 Textures]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
https://github.com/kiryha/Houdini&lt;br /&gt;
https://github.com/jhorikawa/HoudiniHowtos&lt;br /&gt;
https://github.com/jtomori/vex_tutorial&lt;br /&gt;
https://github.com/dchow1992/example_hips&lt;br /&gt;
https://github.com/pedohorse/educational-hips&lt;br /&gt;
https://github.com/alexwheezy/Mantra-LPE-Cookbook&lt;br /&gt;
https://github.com/jtomori/vfx_good_night_reading&lt;br /&gt;
https://github.com/lightReachers/hip-files/blob/main/waterBlast_v002.hipnc&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1340</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1340"/>
		<updated>2025-12-31T20:18:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin moved page Resources to ResourcesOld without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps] | [https://cc0-textures.com/ CC0 Textures]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
https://github.com/kiryha/Houdini&lt;br /&gt;
https://github.com/jhorikawa/HoudiniHowtos&lt;br /&gt;
https://github.com/jtomori/vex_tutorial&lt;br /&gt;
https://github.com/dchow1992/example_hips&lt;br /&gt;
https://github.com/pedohorse/educational-hips&lt;br /&gt;
https://github.com/alexwheezy/Mantra-LPE-Cookbook&lt;br /&gt;
https://github.com/jtomori/vfx_good_night_reading&lt;br /&gt;
https://github.com/lightReachers/hip-files/blob/main/waterBlast_v002.hipnc&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Main_Page&amp;diff=1339</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Main_Page&amp;diff=1339"/>
		<updated>2025-12-03T20:09:31Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Check out these [[Resources|useful resources]]&lt;br /&gt;
&lt;br /&gt;
Follow my live streams using this [[Stream_Scene_Share| Scene Share Shelf Script]]&lt;br /&gt;
&lt;br /&gt;
Want your Houdini to look like mine?  See this guide on [[Customizing_the_Houdini_Interface|Customizing Houdini]]&lt;br /&gt;
&lt;br /&gt;
== VEX Coding Resources ==&lt;br /&gt;
* [[VEX_Attribute_Glossary| VEX Attribute Glossary]]&lt;br /&gt;
* [[VEX_Wrangle_Snippets| Useful VEX Wrangle Snippets]]&lt;br /&gt;
* [[Mathematical_Functions_in_VEX| VEX Mathematical Functions]]&lt;br /&gt;
&lt;br /&gt;
== Recent Streams ==&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
File:content_thumbnail_2022_11_20.jpg|link=Live_2022.11.15#Part_2&lt;br /&gt;
File:content_thumbnail_2022_11_15.jpg|link=Live_2022.11.15&lt;br /&gt;
File:content_thumbnail_2022_09_16.jpg|link=Live_2022.09.16&lt;br /&gt;
File:content_thumbnail_2022_09_13.jpg|link=Live_2022.09.13&lt;br /&gt;
File:content_thumbnail_2022_09_11.jpg|link=Live_2022.09.11&lt;br /&gt;
&amp;lt;!--File:content_thumbnail_2022_09_06.jpg|link=Live_2022.09.06--&amp;gt;&lt;br /&gt;
&amp;lt;!--File:content_thumbnail_2022_09_04.jpg|link=Live_2022.09.04--&amp;gt;&lt;br /&gt;
File:content_thumbnail_2022_09_02.jpg|link=Live_2022.09.02&lt;br /&gt;
File:content_thumbnail_2022_08_26.jpg|link=Live_2022.08.26&lt;br /&gt;
File:content_thumbnail_2022_08_23.jpg|link=Live_2022.08.23&lt;br /&gt;
File:content_thumbnail_2022_08_21.jpg|link=Live_2022.08.21&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
test&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1338</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1338"/>
		<updated>2025-10-16T18:58:17Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps] | [https://cc0-textures.com/ CC0 Textures]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
https://github.com/kiryha/Houdini&lt;br /&gt;
https://github.com/jhorikawa/HoudiniHowtos&lt;br /&gt;
https://github.com/jtomori/vex_tutorial&lt;br /&gt;
https://github.com/dchow1992/example_hips&lt;br /&gt;
https://github.com/pedohorse/educational-hips&lt;br /&gt;
https://github.com/alexwheezy/Mantra-LPE-Cookbook&lt;br /&gt;
https://github.com/jtomori/vfx_good_night_reading&lt;br /&gt;
https://github.com/lightReachers/hip-files/blob/main/waterBlast_v002.hipnc&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1337</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1337"/>
		<updated>2025-10-12T18:55:08Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps] | [https://cc0-textures.com/ CC0 Textures]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
https://github.com/kiryha/Houdini&lt;br /&gt;
https://github.com/jhorikawa/HoudiniHowtos&lt;br /&gt;
https://github.com/jtomori/vex_tutorial&lt;br /&gt;
https://github.com/dchow1992/example_hips&lt;br /&gt;
https://github.com/pedohorse/educational-hips&lt;br /&gt;
https://github.com/alexwheezy/Mantra-LPE-Cookbook&lt;br /&gt;
https://github.com/jtomori/vfx_good_night_reading&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1336</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1336"/>
		<updated>2025-09-17T18:53:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
https://github.com/kiryha/Houdini&lt;br /&gt;
https://github.com/jhorikawa/HoudiniHowtos&lt;br /&gt;
https://github.com/jtomori/vex_tutorial&lt;br /&gt;
https://github.com/dchow1992/example_hips&lt;br /&gt;
https://github.com/pedohorse/educational-hips&lt;br /&gt;
https://github.com/alexwheezy/Mantra-LPE-Cookbook&lt;br /&gt;
https://github.com/jtomori/vfx_good_night_reading&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1335</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1335"/>
		<updated>2025-09-17T18:16:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
https://github.com/kiryha/Houdini&lt;br /&gt;
https://github.com/jhorikawa/HoudiniHowtos&lt;br /&gt;
https://github.com/jtomori/vex_tutorial&lt;br /&gt;
https://github.com/dchow1992/example_hips&lt;br /&gt;
https://github.com/pedohorse/educational-hips&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1334</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1334"/>
		<updated>2025-09-17T17:44:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1333</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1333"/>
		<updated>2025-09-17T17:40:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
https://github.com/3Dmattias/Houdini_Escapades/tree/main/hip&lt;br /&gt;
*/&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1332</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1332"/>
		<updated>2024-10-03T10:05:34Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.15, 10))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
[[File:vex_rand_color_from_normal_direction.gif | 340px | right]]&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_rand_color_from_normal_direction.hiplc|vex_rand_color_from_normal_direction.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(@N*2));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Group Unshared Edges ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int isBorderEdge(int pt0, pt1)  {   // test border using half edges&lt;br /&gt;
    int hedge = pointhedge(0, pt0, pt1); // try finding hedge&lt;br /&gt;
    if (hedge == -1 )   {&lt;br /&gt;
        hedge = pointhedge(0, pt1, pt0);  // try reversed hedge&lt;br /&gt;
        if (hedge == -1 ) return -1;  // invalid hedge&lt;br /&gt;
    }&lt;br /&gt;
    return hedge_equivcount(0, hedge) == 1; // 1 if border edge&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int pps[] = primpoints(0,@primnum); // current primitive's points&lt;br /&gt;
for(int i = 0; i&amp;lt;len(pps);  i++)   {&lt;br /&gt;
    int pt0 = pps[i]; // current pt&lt;br /&gt;
    int pt1 = pps[(i-1)%len(pps)]; // next point&lt;br /&gt;
    if( isBorderEdge(pt0, pt1) ) { setpointgroup(0, 'border', pps[i], 1); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[[File:vex_torus_knot_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_torus_knot_001.hiplc|vex_torus_knot_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=File:vex_rand_color_from_normal_direction.hiplc&amp;diff=1331</id>
		<title>File:vex rand color from normal direction.hiplc</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=File:vex_rand_color_from_normal_direction.hiplc&amp;diff=1331"/>
		<updated>2024-10-03T10:04:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=File:vex_rand_color_from_normal_direction.gif&amp;diff=1330</id>
		<title>File:vex rand color from normal direction.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=File:vex_rand_color_from_normal_direction.gif&amp;diff=1330"/>
		<updated>2024-10-03T10:03:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1329</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1329"/>
		<updated>2024-10-03T09:46:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.15, 10))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(@N*2));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Group Unshared Edges ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int isBorderEdge(int pt0, pt1)  {   // test border using half edges&lt;br /&gt;
    int hedge = pointhedge(0, pt0, pt1); // try finding hedge&lt;br /&gt;
    if (hedge == -1 )   {&lt;br /&gt;
        hedge = pointhedge(0, pt1, pt0);  // try reversed hedge&lt;br /&gt;
        if (hedge == -1 ) return -1;  // invalid hedge&lt;br /&gt;
    }&lt;br /&gt;
    return hedge_equivcount(0, hedge) == 1; // 1 if border edge&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int pps[] = primpoints(0,@primnum); // current primitive's points&lt;br /&gt;
for(int i = 0; i&amp;lt;len(pps);  i++)   {&lt;br /&gt;
    int pt0 = pps[i]; // current pt&lt;br /&gt;
    int pt1 = pps[(i-1)%len(pps)]; // next point&lt;br /&gt;
    if( isBorderEdge(pt0, pt1) ) { setpointgroup(0, 'border', pps[i], 1); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[[File:vex_torus_knot_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_torus_knot_001.hiplc|vex_torus_knot_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1328</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1328"/>
		<updated>2024-09-22T19:27:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values] | [https://www.motionforgepictures.com/height-maps/ Terrain Height Maps]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1327</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1327"/>
		<updated>2024-09-17T21:51:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
%rendercamera&lt;br /&gt;
%rendersettings&lt;br /&gt;
%bound(/cameras/camera1, fovscale = 1.1)&lt;br /&gt;
{ usd_istype(0, @primpath, &amp;quot;DiskLight&amp;quot;) }&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
usd_worldtransform&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;br /&gt;
&lt;br /&gt;
[https://renderman.pixar.com/resources/RenderMan_20/risLPEs.html LPEs]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1326</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1326"/>
		<updated>2024-09-17T21:50:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
%rendercamera&lt;br /&gt;
%rendersettings&lt;br /&gt;
%bound(/cameras/camera1, fovscale = 1.1)&lt;br /&gt;
{ usd_istype(0, @primpath, &amp;quot;DiskLight&amp;quot;) }&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;br /&gt;
&lt;br /&gt;
[https://renderman.pixar.com/resources/RenderMan_20/risLPEs.html LPEs]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1325</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1325"/>
		<updated>2024-09-17T21:49:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
%rendercamera&lt;br /&gt;
%rendersettings&lt;br /&gt;
%bound(/cameras/camera1, fovscale = 1.1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;br /&gt;
&lt;br /&gt;
[https://renderman.pixar.com/resources/RenderMan_20/risLPEs.html LPEs]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1324</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1324"/>
		<updated>2024-09-17T21:47:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
%rendercamera&lt;br /&gt;
%rendersettings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;br /&gt;
&lt;br /&gt;
[https://renderman.pixar.com/resources/RenderMan_20/risLPEs.html LPEs]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1323</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1323"/>
		<updated>2024-09-17T21:47:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
%rendercamera&lt;br /&gt;
%rendercamera&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;br /&gt;
&lt;br /&gt;
[https://renderman.pixar.com/resources/RenderMan_20/risLPEs.html LPEs]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1322</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1322"/>
		<updated>2024-09-01T11:21:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Torus Knot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.15, 10))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(v@N*8));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[[File:vex_torus_knot_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_torus_knot_001.hiplc|vex_torus_knot_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=File:vex_torus_knot_001.hiplc&amp;diff=1321</id>
		<title>File:vex torus knot 001.hiplc</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=File:vex_torus_knot_001.hiplc&amp;diff=1321"/>
		<updated>2024-09-01T11:20:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1320</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1320"/>
		<updated>2024-09-01T11:12:00Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Torus Knot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.15, 10))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(v@N*8));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[[File:vex_torus_knot_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1319</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1319"/>
		<updated>2024-09-01T11:11:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Torus Knot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.15, 10))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(v@N*8));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[[File:vex_torus_knot_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=File:vex_torus_knot_001.gif&amp;diff=1318</id>
		<title>File:vex torus knot 001.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=File:vex_torus_knot_001.gif&amp;diff=1318"/>
		<updated>2024-09-01T11:10:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1317</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1317"/>
		<updated>2024-08-09T19:40:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;br /&gt;
&lt;br /&gt;
[https://renderman.pixar.com/resources/RenderMan_20/risLPEs.html LPEs]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1316</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1316"/>
		<updated>2024-08-09T19:39:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini/nodes/lop/karmastandardrendervars.html Karma Standard Render Vars]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1315</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1315"/>
		<updated>2024-08-09T19:38:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;br /&gt;
&lt;br /&gt;
[https://www.sidefx.com/docs/houdini//solaris/vex.html Using VEX with USD]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1314</id>
		<title>Houdini USD Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Houdini_USD_Cookbook&amp;diff=1314"/>
		<updated>2024-08-09T19:37:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.sidefx.com/docs/houdini//solaris/pattern.html Primitive matching patterns]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1313</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1313"/>
		<updated>2024-07-30T17:54:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline] | [https://www.youtube.com/playlist?list=PLyzOQqMHGyYTsz7-jlj-SeOm6iC0v-7B3 5 Decades of digital art history on YouTube]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1312</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1312"/>
		<updated>2024-04-22T10:28:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
# For OSX you can simply launch the Houdini Terminal app, then export the HOUDINI_USER_PREF_DIR and launch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Special:Redirect/file/https://imgix.bustle.com/uploads/image/2022/9/14/6563cfe0-3ade-42bd-bb6a-5d4db8784a81-screen-shot-2022-09-12-at-121439-pm-min.png?w=1200&amp;amp;h=1200&amp;amp;fit=crop&amp;amp;crop=faces&amp;amp;fm=jpg]]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1311</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1311"/>
		<updated>2024-04-22T10:26:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
# For OSX you can simply launch the Houdini Terminal app, then export the HOUDINI_USER_PREF_DIR and launch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:https://imgix.bustle.com/uploads/image/2022/9/14/6563cfe0-3ade-42bd-bb6a-5d4db8784a81-screen-shot-2022-09-12-at-121439-pm-min.png?w=1200&amp;amp;h=1200&amp;amp;fit=crop&amp;amp;crop=faces&amp;amp;fm=jpg]]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1310</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1310"/>
		<updated>2024-04-22T10:26:09Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
# For OSX you can simply launch the Houdini Terminal app, then export the HOUDINI_USER_PREF_DIR and launch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
file:https://imgix.bustle.com/uploads/image/2022/9/14/6563cfe0-3ade-42bd-bb6a-5d4db8784a81-screen-shot-2022-09-12-at-121439-pm-min.png?w=1200&amp;amp;h=1200&amp;amp;fit=crop&amp;amp;crop=faces&amp;amp;fm=jpg&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1309</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1309"/>
		<updated>2024-04-22T10:23:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
# For OSX you can simply launch the Houdini Terminal app, then export the HOUDINI_USER_PREF_DIR and launch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://imgix.bustle.com/uploads/image/2022/9/14/6563cfe0-3ade-42bd-bb6a-5d4db8784a81-screen-shot-2022-09-12-at-121439-pm-min.png?w=1200&amp;amp;h=1200&amp;amp;fit=crop&amp;amp;crop=faces&amp;amp;fm=jpg]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1308</id>
		<title>Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Resources&amp;diff=1308"/>
		<updated>2024-04-01T17:04:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some useful resources to help you with Houdini.&lt;br /&gt;
&lt;br /&gt;
''' Geometry '''&lt;br /&gt;
&lt;br /&gt;
[http://threedscans.com/ Three D Scans] | [https://3d.si.edu/cc0 Smithsonian] | [https://wirewheelsclub.com/models/ Wire Wheels Club] | [http://www.graphics.stanford.edu/data/3Dscanrep/ Stanford 3D Scans] | [https://sketchfab.com/blogs/community/sketchfab-launches-public-domain-dedication-for-3d-cultural-heritage/ Sketchfab 3D Cultural Heritage] | [https://www.myminifactory.com/scantheworld/full-collection My Mini Factory] | [http://casual-effects.com/data/index.html Casual-Effects Data] | [http://www.sampleandhold.co.uk/downloads/ Sample and Hold] | [https://benedikt-bitterli.me/resources/ Benedikt-Bitterli.me] | [https://jangafx.com/software/embergen/download/free-vdb-animations/ EmberGen VDBs]&lt;br /&gt;
----&lt;br /&gt;
''' HDRIs '''&lt;br /&gt;
&lt;br /&gt;
[https://hdrihaven.com/hdris/ Poly Haven] | [http://themarichannel.com/all-hdr/ The Mari Channel] | [https://renderman.pixar.com/category/111-hdri Renderman] | [http://noemotionhdrs.net/ No Emotion HDRs] | [http://www.hdrlabs.com/sibl/archive.html HDR Labs SIBL]&lt;br /&gt;
----&lt;br /&gt;
''' Textures '''&lt;br /&gt;
&lt;br /&gt;
[https://ambientcg.com/categories ambientCG] | [https://3dtextures.me/ 3D Textures] | [https://www.cgbookcase.com/textures CG Bookcase] | [https://texturebox.com/ Texture Box] | [http://thepatternlibrary.com/ The Pattern Library] | [https://www.textures.com/ Textures.com] | [http://texturify.com/ Texturify] | [http://uvchecker.byvalle.com/ UV Grid Generator] | [https://physicallybased.info/ Physically Based Shader Values]&lt;br /&gt;
----&lt;br /&gt;
''' Tools '''&lt;br /&gt;
&lt;br /&gt;
[https://color.adobe.com/explore Adobe Color] | [https://www.iquilezles.org/apps/graphtoy/ Graphtoy] | [https://fonts.google.com/ Google Fonts] | [https://www.canva.com/colors/color-palettes/ Canva Color Palettes] | [https://www.canva.com/colors/color-palettes/ Hex Color Palettes] | [https://windmillart.net/?p=jsplacement Jsplacement] | [https://rainboxlab.org/tools/dume/ Dume] | [https://soulwire.co.uk/math-for-motion/ Math for Motion] | [http://foxcodex.html.xdomain.jp/index.html Periodic Table of Motion] | [https://mrviewer.sourceforge.io/ mrViewer] | [https://carbon.now.sh/ Carbon] | [https://github.com/anvaka/city-roads City Roads] | [https://pureref.com PureRef] | [https://redketchup.io/twitter-downloader Save mp4 and gif from Twitter] | [https://wumbo.net/glossary/ Math Glossary] | [https://ezgif.com/ EZgif Convert]&lt;br /&gt;
----&lt;br /&gt;
''' Inspiration '''&lt;br /&gt;
&lt;br /&gt;
[https://motionographer.com/tag/photoreal/ Motionographer Photoreal] | [https://www.stashmedia.tv/ Stash Magazine] | [http://artofstyleframe.com/ Art of Style Frame] | [https://www.artofthetitle.com/ Art of the Title] | [https://www.behance.net/galleries/motion/ Behance Motion Gallery] | [https://www.behance.net/search/projects/?search=Houdini%20FX Behance Houdini FX] | [https://www.sakugabooru.com/tag?name=&amp;amp;type=&amp;amp;order=count Sakuga Booru] | [http://ref-fx.com/ FX References] | [https://www.instagram.com/explore/tags/xuxoe/ Instagram #xuxoe] | [https://beforesandafters.com/ Before &amp;amp; Afters] | [https://butdoesitfloat.com/img/random But Does It Float] | [https://fyfluiddynamics.com/ FYFD] | [https://dribbble.com/tags/houdini Houdini Dribble] | [https://www.are.na/john-kunz are.na] | [http://foxcodex.html.xdomain.jp/index.html Motion Periodic Table] | [http://www.sylvain-nouveau.com/reffx/misc/ FX References] | [https://mr5ivethou5and.tumblr.com/archive mr5ivethou5and] | [https://timeline.lerandom.art/ Generative Art Timeline]&lt;br /&gt;
----&lt;br /&gt;
''' Houdini '''&lt;br /&gt;
&lt;br /&gt;
[https://www.houdinikitchen.net/2019/12/21/how-to-create-l-systems/ L Systems] | [https://procegen.konstantinmagnus.de/ procegen] | [https://hdbp.io/browse Houdini Blueprints] | [https://github.com/kiryha/Houdini/wiki/vex-for-artists VEX Guide for Artists] | [https://www.sidefx.com/contentlibrary/ SideFX Content Library] | [https://forums.odforce.net/topic/49522-tutorial-hip-library/ OdForce Tutorial .hip Library] | [https://www.sidefx.com/learn/getting_started/ SideFX Getting Started] | [https://forums.odforce.net/topic/24056-learning-vex-via-animated-gifs-bees-bombs/ OdForce Learning VEX Via Bees and Bombs] | [https://houdinigubbins.wordpress.com/ Houdini Gubbins] | [http://wordpress.discretization.de/houdini/ Houdini Tech Blog] | [https://www.sidefx.com/houdini-hive/houdini-hive-worldwide/ Hive] | [https://www.tokeru.com/cgwiki/index.php?title=Houdini Tokeru] | [https://ikrima.dev/houdini/basics/hou-crash-course/ Crash Course] | [https://jeremypaton.github.io/site/build/nodes/sop.html SOP Quick Reference] | [https://discord.gg/dbJrmM8 Kunz Discord Community] | [https://houdiniquicktips.weebly.com/ Quick Tips]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1307</id>
		<title>Useful</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1307"/>
		<updated>2024-03-12T21:33:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
# Python parameter expressions for translation X, Y and Z components&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[2]&lt;br /&gt;
# Python parameter expressions for roatation X, Y and Z components&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[2]&lt;br /&gt;
# Python parameter expressions for scale X, Y and Z components&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
flbk.py ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
import hou, toolutils, os, subprocess, shlex, time, shutil&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Define the directory to store flipbooks.  In this case, parent dir of folder containing the hip_file_path (same as $HIP/../ )&lt;br /&gt;
    flipbook_dir = os.path.join(os.path.abspath( os.path.join(hou.hipFile.path(), os.pardir, os.pardir) ), 'flip')&lt;br /&gt;
    if not os.path.exists(flipbook_dir):&lt;br /&gt;
        print('Creating directory: '+flipbook_dir)&lt;br /&gt;
        os.makedirs(flipbook_dir)&lt;br /&gt;
    jpeg_output_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME') + os.path.sep + '$F4.jpeg')&lt;br /&gt;
&lt;br /&gt;
    # Save a backup of the scene file to the flipbook dir&lt;br /&gt;
    tmp_backup_file = hou.hipFile.saveAsBackup()&lt;br /&gt;
    date_time = time.strftime(&amp;quot;%Y_%m_%d__%H.%M.%S&amp;quot;)&lt;br /&gt;
    backup_file_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME'), date_time+&amp;quot;_&amp;quot;+hou.hipFile.basename())&lt;br /&gt;
    backup_file_path = str(backup_file_path)&lt;br /&gt;
    if not os.path.exists(os.path.dirname(backup_file_path)):&lt;br /&gt;
        print('Creating directory: '+os.path.dirname(backup_file_path))&lt;br /&gt;
        os.makedirs(os.path.dirname(backup_file_path))&lt;br /&gt;
    # Rename and move the tmp_backup_file file to our destination path and filename&lt;br /&gt;
    shutil.move(tmp_backup_file, backup_file_path)&lt;br /&gt;
&lt;br /&gt;
    # Don't modifiy the existing settings (make a copy)&lt;br /&gt;
    flbk_settings = toolutils.sceneViewer().flipbookSettings().stash()&lt;br /&gt;
    # If OCIO is enabled don't apply gamma&lt;br /&gt;
    if toolutils.sceneViewer().usingOCIO():&lt;br /&gt;
        flbk_settings.overrideGamma(True)&lt;br /&gt;
        flbk_settings.overrideGamma(1.0)&lt;br /&gt;
    # Set the output path for flipbook frames&lt;br /&gt;
    flbk_settings.output(jpeg_output_path)&lt;br /&gt;
    if hou.licenseCategory() == hou.licenseCategoryType.Apprentice:&lt;br /&gt;
        flbk_settings.useResolution(1)&lt;br /&gt;
        flipbook_options.resolution((1280,720))&lt;br /&gt;
    else:&lt;br /&gt;
        # Disable the resolution override&lt;br /&gt;
        flbk_settings.useResolution(0)&lt;br /&gt;
&lt;br /&gt;
    if flbk_settings.sessionLabel() is '':&lt;br /&gt;
        flbk_settings.sessionLabel( str(os.getpid()) )&lt;br /&gt;
&lt;br /&gt;
    start_timer = time.perf_counter()&lt;br /&gt;
    seq_profile = hou.PerfMonProfile&lt;br /&gt;
    #global seq_profile&lt;br /&gt;
    seq_profile = hou.perfMon.startProfile(&amp;quot;Seq&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Keeps a history file of all the flipbooks performed in your user dir&lt;br /&gt;
    history_file = open(os.environ['HOME']+'/flbk.txt', 'a+')&lt;br /&gt;
    history_file.write(os.path.splitext(backup_file_path)[0]+'.mp4')&lt;br /&gt;
    history_file.write('\n')&lt;br /&gt;
    history_file.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Perform the flipbook&lt;br /&gt;
    toolutils.sceneViewer().flipbook(viewport=None, settings=flbk_settings, open_dialog=False)&lt;br /&gt;
&lt;br /&gt;
    seq_profile.stop()&lt;br /&gt;
    seq_profile.exportAsCSV(os.path.splitext(backup_file_path)[0]+&amp;quot;.csv&amp;quot;)&lt;br /&gt;
    # these .hperf files were too big&lt;br /&gt;
    #seq_profile.save(os.path.splitext(backup_file_path)[0]+&amp;quot;.hperf&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    jpeg_output_path = '&amp;quot;' + jpeg_output_path.replace('$F4', '%04d') + '&amp;quot;'&lt;br /&gt;
    #convert2mov_command ='/usr/local/bin/ffmpeg'&lt;br /&gt;
    convert2mov_command ='ffmpeg'&lt;br /&gt;
    convert2mov_command+=' -start_number '+str( int(flbk_settings.frameRange()[0]) )&lt;br /&gt;
    convert2mov_command+=' -framerate '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -apply_trc iec61966_2_1'&lt;br /&gt;
    convert2mov_command+=' -i '+jpeg_output_path&lt;br /&gt;
    convert2mov_command+=' -vf &amp;quot;scale=trunc(iw/2)*2:trunc(ih/2)*2&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -f mp4 -vcodec libx264 -pix_fmt yuv420p'&lt;br /&gt;
    convert2mov_command+=' -r '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -crf 22'&lt;br /&gt;
    convert2mov_command+=' -metadata title=&amp;quot;'+hou.getenv('HIPNAME')+'&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -metadata comment=&amp;quot;'&lt;br /&gt;
    convert2mov_command+='SOURCE SCENE: '+hou.hipFile.path()+'\n'&lt;br /&gt;
    convert2mov_command+='BACKUP SCENE: '+backup_file_path+'\n'&lt;br /&gt;
    convert2mov_command+='VERSION: '+hou.applicationVersionString()+'\n'&lt;br /&gt;
    convert2mov_command+='PLATFORM: '+hou.applicationPlatformInfo()+'\n'&lt;br /&gt;
    convert2mov_command+='OS: '+os.environ['HOUDINI_OS']+'\n'&lt;br /&gt;
    convert2mov_command+='USER: '+os.environ['USER']+'\n'&lt;br /&gt;
    convert2mov_command+='USERNAME: '+hou.userName()+'\n'&lt;br /&gt;
    convert2mov_command+='HOSTNAME: '+hou.machineName()+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED ON: '+date_time+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED IN: '+str(round(time.perf_counter() - start_timer, 2))+' seconds'&lt;br /&gt;
    convert2mov_command+='&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -x264opts colormatrix=bt709'&lt;br /&gt;
    mp4_output_path = '&amp;quot;' + os.path.splitext(backup_file_path)[0]+'.mp4' + '&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' '+mp4_output_path&lt;br /&gt;
    try:&lt;br /&gt;
        # The subprocess.run() function only exists in Python 3.5 and newer.&lt;br /&gt;
        subprocess.run(shlex.split(convert2mov_command), shell=True, capture_output=True, text=True, check=True)&lt;br /&gt;
    except:&lt;br /&gt;
        # Support versions of Python older then 3.5&lt;br /&gt;
        subprocess.Popen( shlex.split(convert2mov_command) ).wait()&lt;br /&gt;
&lt;br /&gt;
    # Remove the .jpegs generated by the flipbook&lt;br /&gt;
    jpeg_output_path = jpeg_output_path.strip('&amp;quot;\'')&lt;br /&gt;
    for file in [file for file in os.listdir(os.path.dirname(jpeg_output_path)) if file.endswith('.jpeg')]:&lt;br /&gt;
	    os.remove( os.path.join(os.path.dirname(jpeg_output_path), file) )&lt;br /&gt;
    print('Flipbook Finished: ' + mp4_output_path.strip('&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ffmpeg combine all .mkv files in a dir ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
ffmpeg -f concat -safe 0 -i &amp;lt;(find . -type f -name '*.mkv' -printf &amp;quot;file '$PWD/%p'\n&amp;quot; | sort) -c copy $PWD/output.mkv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1306</id>
		<title>Useful</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1306"/>
		<updated>2024-03-12T21:33:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
'''Python parameter expressions'''&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[2]&lt;br /&gt;
&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[2]&lt;br /&gt;
&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
flbk.py ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
import hou, toolutils, os, subprocess, shlex, time, shutil&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Define the directory to store flipbooks.  In this case, parent dir of folder containing the hip_file_path (same as $HIP/../ )&lt;br /&gt;
    flipbook_dir = os.path.join(os.path.abspath( os.path.join(hou.hipFile.path(), os.pardir, os.pardir) ), 'flip')&lt;br /&gt;
    if not os.path.exists(flipbook_dir):&lt;br /&gt;
        print('Creating directory: '+flipbook_dir)&lt;br /&gt;
        os.makedirs(flipbook_dir)&lt;br /&gt;
    jpeg_output_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME') + os.path.sep + '$F4.jpeg')&lt;br /&gt;
&lt;br /&gt;
    # Save a backup of the scene file to the flipbook dir&lt;br /&gt;
    tmp_backup_file = hou.hipFile.saveAsBackup()&lt;br /&gt;
    date_time = time.strftime(&amp;quot;%Y_%m_%d__%H.%M.%S&amp;quot;)&lt;br /&gt;
    backup_file_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME'), date_time+&amp;quot;_&amp;quot;+hou.hipFile.basename())&lt;br /&gt;
    backup_file_path = str(backup_file_path)&lt;br /&gt;
    if not os.path.exists(os.path.dirname(backup_file_path)):&lt;br /&gt;
        print('Creating directory: '+os.path.dirname(backup_file_path))&lt;br /&gt;
        os.makedirs(os.path.dirname(backup_file_path))&lt;br /&gt;
    # Rename and move the tmp_backup_file file to our destination path and filename&lt;br /&gt;
    shutil.move(tmp_backup_file, backup_file_path)&lt;br /&gt;
&lt;br /&gt;
    # Don't modifiy the existing settings (make a copy)&lt;br /&gt;
    flbk_settings = toolutils.sceneViewer().flipbookSettings().stash()&lt;br /&gt;
    # If OCIO is enabled don't apply gamma&lt;br /&gt;
    if toolutils.sceneViewer().usingOCIO():&lt;br /&gt;
        flbk_settings.overrideGamma(True)&lt;br /&gt;
        flbk_settings.overrideGamma(1.0)&lt;br /&gt;
    # Set the output path for flipbook frames&lt;br /&gt;
    flbk_settings.output(jpeg_output_path)&lt;br /&gt;
    if hou.licenseCategory() == hou.licenseCategoryType.Apprentice:&lt;br /&gt;
        flbk_settings.useResolution(1)&lt;br /&gt;
        flipbook_options.resolution((1280,720))&lt;br /&gt;
    else:&lt;br /&gt;
        # Disable the resolution override&lt;br /&gt;
        flbk_settings.useResolution(0)&lt;br /&gt;
&lt;br /&gt;
    if flbk_settings.sessionLabel() is '':&lt;br /&gt;
        flbk_settings.sessionLabel( str(os.getpid()) )&lt;br /&gt;
&lt;br /&gt;
    start_timer = time.perf_counter()&lt;br /&gt;
    seq_profile = hou.PerfMonProfile&lt;br /&gt;
    #global seq_profile&lt;br /&gt;
    seq_profile = hou.perfMon.startProfile(&amp;quot;Seq&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Keeps a history file of all the flipbooks performed in your user dir&lt;br /&gt;
    history_file = open(os.environ['HOME']+'/flbk.txt', 'a+')&lt;br /&gt;
    history_file.write(os.path.splitext(backup_file_path)[0]+'.mp4')&lt;br /&gt;
    history_file.write('\n')&lt;br /&gt;
    history_file.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Perform the flipbook&lt;br /&gt;
    toolutils.sceneViewer().flipbook(viewport=None, settings=flbk_settings, open_dialog=False)&lt;br /&gt;
&lt;br /&gt;
    seq_profile.stop()&lt;br /&gt;
    seq_profile.exportAsCSV(os.path.splitext(backup_file_path)[0]+&amp;quot;.csv&amp;quot;)&lt;br /&gt;
    # these .hperf files were too big&lt;br /&gt;
    #seq_profile.save(os.path.splitext(backup_file_path)[0]+&amp;quot;.hperf&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    jpeg_output_path = '&amp;quot;' + jpeg_output_path.replace('$F4', '%04d') + '&amp;quot;'&lt;br /&gt;
    #convert2mov_command ='/usr/local/bin/ffmpeg'&lt;br /&gt;
    convert2mov_command ='ffmpeg'&lt;br /&gt;
    convert2mov_command+=' -start_number '+str( int(flbk_settings.frameRange()[0]) )&lt;br /&gt;
    convert2mov_command+=' -framerate '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -apply_trc iec61966_2_1'&lt;br /&gt;
    convert2mov_command+=' -i '+jpeg_output_path&lt;br /&gt;
    convert2mov_command+=' -vf &amp;quot;scale=trunc(iw/2)*2:trunc(ih/2)*2&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -f mp4 -vcodec libx264 -pix_fmt yuv420p'&lt;br /&gt;
    convert2mov_command+=' -r '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -crf 22'&lt;br /&gt;
    convert2mov_command+=' -metadata title=&amp;quot;'+hou.getenv('HIPNAME')+'&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -metadata comment=&amp;quot;'&lt;br /&gt;
    convert2mov_command+='SOURCE SCENE: '+hou.hipFile.path()+'\n'&lt;br /&gt;
    convert2mov_command+='BACKUP SCENE: '+backup_file_path+'\n'&lt;br /&gt;
    convert2mov_command+='VERSION: '+hou.applicationVersionString()+'\n'&lt;br /&gt;
    convert2mov_command+='PLATFORM: '+hou.applicationPlatformInfo()+'\n'&lt;br /&gt;
    convert2mov_command+='OS: '+os.environ['HOUDINI_OS']+'\n'&lt;br /&gt;
    convert2mov_command+='USER: '+os.environ['USER']+'\n'&lt;br /&gt;
    convert2mov_command+='USERNAME: '+hou.userName()+'\n'&lt;br /&gt;
    convert2mov_command+='HOSTNAME: '+hou.machineName()+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED ON: '+date_time+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED IN: '+str(round(time.perf_counter() - start_timer, 2))+' seconds'&lt;br /&gt;
    convert2mov_command+='&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -x264opts colormatrix=bt709'&lt;br /&gt;
    mp4_output_path = '&amp;quot;' + os.path.splitext(backup_file_path)[0]+'.mp4' + '&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' '+mp4_output_path&lt;br /&gt;
    try:&lt;br /&gt;
        # The subprocess.run() function only exists in Python 3.5 and newer.&lt;br /&gt;
        subprocess.run(shlex.split(convert2mov_command), shell=True, capture_output=True, text=True, check=True)&lt;br /&gt;
    except:&lt;br /&gt;
        # Support versions of Python older then 3.5&lt;br /&gt;
        subprocess.Popen( shlex.split(convert2mov_command) ).wait()&lt;br /&gt;
&lt;br /&gt;
    # Remove the .jpegs generated by the flipbook&lt;br /&gt;
    jpeg_output_path = jpeg_output_path.strip('&amp;quot;\'')&lt;br /&gt;
    for file in [file for file in os.listdir(os.path.dirname(jpeg_output_path)) if file.endswith('.jpeg')]:&lt;br /&gt;
	    os.remove( os.path.join(os.path.dirname(jpeg_output_path), file) )&lt;br /&gt;
    print('Flipbook Finished: ' + mp4_output_path.strip('&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ffmpeg combine all .mkv files in a dir ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
ffmpeg -f concat -safe 0 -i &amp;lt;(find . -type f -name '*.mkv' -printf &amp;quot;file '$PWD/%p'\n&amp;quot; | sort) -c copy $PWD/output.mkv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1305</id>
		<title>Useful</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1305"/>
		<updated>2024-03-12T21:32:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
''Python parameter expressions''&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[2]&lt;br /&gt;
&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[2]&lt;br /&gt;
&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
flbk.py ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
import hou, toolutils, os, subprocess, shlex, time, shutil&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Define the directory to store flipbooks.  In this case, parent dir of folder containing the hip_file_path (same as $HIP/../ )&lt;br /&gt;
    flipbook_dir = os.path.join(os.path.abspath( os.path.join(hou.hipFile.path(), os.pardir, os.pardir) ), 'flip')&lt;br /&gt;
    if not os.path.exists(flipbook_dir):&lt;br /&gt;
        print('Creating directory: '+flipbook_dir)&lt;br /&gt;
        os.makedirs(flipbook_dir)&lt;br /&gt;
    jpeg_output_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME') + os.path.sep + '$F4.jpeg')&lt;br /&gt;
&lt;br /&gt;
    # Save a backup of the scene file to the flipbook dir&lt;br /&gt;
    tmp_backup_file = hou.hipFile.saveAsBackup()&lt;br /&gt;
    date_time = time.strftime(&amp;quot;%Y_%m_%d__%H.%M.%S&amp;quot;)&lt;br /&gt;
    backup_file_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME'), date_time+&amp;quot;_&amp;quot;+hou.hipFile.basename())&lt;br /&gt;
    backup_file_path = str(backup_file_path)&lt;br /&gt;
    if not os.path.exists(os.path.dirname(backup_file_path)):&lt;br /&gt;
        print('Creating directory: '+os.path.dirname(backup_file_path))&lt;br /&gt;
        os.makedirs(os.path.dirname(backup_file_path))&lt;br /&gt;
    # Rename and move the tmp_backup_file file to our destination path and filename&lt;br /&gt;
    shutil.move(tmp_backup_file, backup_file_path)&lt;br /&gt;
&lt;br /&gt;
    # Don't modifiy the existing settings (make a copy)&lt;br /&gt;
    flbk_settings = toolutils.sceneViewer().flipbookSettings().stash()&lt;br /&gt;
    # If OCIO is enabled don't apply gamma&lt;br /&gt;
    if toolutils.sceneViewer().usingOCIO():&lt;br /&gt;
        flbk_settings.overrideGamma(True)&lt;br /&gt;
        flbk_settings.overrideGamma(1.0)&lt;br /&gt;
    # Set the output path for flipbook frames&lt;br /&gt;
    flbk_settings.output(jpeg_output_path)&lt;br /&gt;
    if hou.licenseCategory() == hou.licenseCategoryType.Apprentice:&lt;br /&gt;
        flbk_settings.useResolution(1)&lt;br /&gt;
        flipbook_options.resolution((1280,720))&lt;br /&gt;
    else:&lt;br /&gt;
        # Disable the resolution override&lt;br /&gt;
        flbk_settings.useResolution(0)&lt;br /&gt;
&lt;br /&gt;
    if flbk_settings.sessionLabel() is '':&lt;br /&gt;
        flbk_settings.sessionLabel( str(os.getpid()) )&lt;br /&gt;
&lt;br /&gt;
    start_timer = time.perf_counter()&lt;br /&gt;
    seq_profile = hou.PerfMonProfile&lt;br /&gt;
    #global seq_profile&lt;br /&gt;
    seq_profile = hou.perfMon.startProfile(&amp;quot;Seq&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Keeps a history file of all the flipbooks performed in your user dir&lt;br /&gt;
    history_file = open(os.environ['HOME']+'/flbk.txt', 'a+')&lt;br /&gt;
    history_file.write(os.path.splitext(backup_file_path)[0]+'.mp4')&lt;br /&gt;
    history_file.write('\n')&lt;br /&gt;
    history_file.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Perform the flipbook&lt;br /&gt;
    toolutils.sceneViewer().flipbook(viewport=None, settings=flbk_settings, open_dialog=False)&lt;br /&gt;
&lt;br /&gt;
    seq_profile.stop()&lt;br /&gt;
    seq_profile.exportAsCSV(os.path.splitext(backup_file_path)[0]+&amp;quot;.csv&amp;quot;)&lt;br /&gt;
    # these .hperf files were too big&lt;br /&gt;
    #seq_profile.save(os.path.splitext(backup_file_path)[0]+&amp;quot;.hperf&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    jpeg_output_path = '&amp;quot;' + jpeg_output_path.replace('$F4', '%04d') + '&amp;quot;'&lt;br /&gt;
    #convert2mov_command ='/usr/local/bin/ffmpeg'&lt;br /&gt;
    convert2mov_command ='ffmpeg'&lt;br /&gt;
    convert2mov_command+=' -start_number '+str( int(flbk_settings.frameRange()[0]) )&lt;br /&gt;
    convert2mov_command+=' -framerate '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -apply_trc iec61966_2_1'&lt;br /&gt;
    convert2mov_command+=' -i '+jpeg_output_path&lt;br /&gt;
    convert2mov_command+=' -vf &amp;quot;scale=trunc(iw/2)*2:trunc(ih/2)*2&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -f mp4 -vcodec libx264 -pix_fmt yuv420p'&lt;br /&gt;
    convert2mov_command+=' -r '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -crf 22'&lt;br /&gt;
    convert2mov_command+=' -metadata title=&amp;quot;'+hou.getenv('HIPNAME')+'&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -metadata comment=&amp;quot;'&lt;br /&gt;
    convert2mov_command+='SOURCE SCENE: '+hou.hipFile.path()+'\n'&lt;br /&gt;
    convert2mov_command+='BACKUP SCENE: '+backup_file_path+'\n'&lt;br /&gt;
    convert2mov_command+='VERSION: '+hou.applicationVersionString()+'\n'&lt;br /&gt;
    convert2mov_command+='PLATFORM: '+hou.applicationPlatformInfo()+'\n'&lt;br /&gt;
    convert2mov_command+='OS: '+os.environ['HOUDINI_OS']+'\n'&lt;br /&gt;
    convert2mov_command+='USER: '+os.environ['USER']+'\n'&lt;br /&gt;
    convert2mov_command+='USERNAME: '+hou.userName()+'\n'&lt;br /&gt;
    convert2mov_command+='HOSTNAME: '+hou.machineName()+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED ON: '+date_time+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED IN: '+str(round(time.perf_counter() - start_timer, 2))+' seconds'&lt;br /&gt;
    convert2mov_command+='&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -x264opts colormatrix=bt709'&lt;br /&gt;
    mp4_output_path = '&amp;quot;' + os.path.splitext(backup_file_path)[0]+'.mp4' + '&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' '+mp4_output_path&lt;br /&gt;
    try:&lt;br /&gt;
        # The subprocess.run() function only exists in Python 3.5 and newer.&lt;br /&gt;
        subprocess.run(shlex.split(convert2mov_command), shell=True, capture_output=True, text=True, check=True)&lt;br /&gt;
    except:&lt;br /&gt;
        # Support versions of Python older then 3.5&lt;br /&gt;
        subprocess.Popen( shlex.split(convert2mov_command) ).wait()&lt;br /&gt;
&lt;br /&gt;
    # Remove the .jpegs generated by the flipbook&lt;br /&gt;
    jpeg_output_path = jpeg_output_path.strip('&amp;quot;\'')&lt;br /&gt;
    for file in [file for file in os.listdir(os.path.dirname(jpeg_output_path)) if file.endswith('.jpeg')]:&lt;br /&gt;
	    os.remove( os.path.join(os.path.dirname(jpeg_output_path), file) )&lt;br /&gt;
    print('Flipbook Finished: ' + mp4_output_path.strip('&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ffmpeg combine all .mkv files in a dir ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
ffmpeg -f concat -safe 0 -i &amp;lt;(find . -type f -name '*.mkv' -printf &amp;quot;file '$PWD/%p'\n&amp;quot; | sort) -c copy $PWD/output.mkv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1304</id>
		<title>Useful</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Useful&amp;diff=1304"/>
		<updated>2024-03-12T21:32:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractTranslates()[2]&lt;br /&gt;
&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractRotates()[2]&lt;br /&gt;
&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[0]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[1]&lt;br /&gt;
hou.Matrix4(hou.node(hou.ch('spare_input0')).geometry().attribValue('transform')).extractScales()[2]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
flbk.py ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
import hou, toolutils, os, subprocess, shlex, time, shutil&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Define the directory to store flipbooks.  In this case, parent dir of folder containing the hip_file_path (same as $HIP/../ )&lt;br /&gt;
    flipbook_dir = os.path.join(os.path.abspath( os.path.join(hou.hipFile.path(), os.pardir, os.pardir) ), 'flip')&lt;br /&gt;
    if not os.path.exists(flipbook_dir):&lt;br /&gt;
        print('Creating directory: '+flipbook_dir)&lt;br /&gt;
        os.makedirs(flipbook_dir)&lt;br /&gt;
    jpeg_output_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME') + os.path.sep + '$F4.jpeg')&lt;br /&gt;
&lt;br /&gt;
    # Save a backup of the scene file to the flipbook dir&lt;br /&gt;
    tmp_backup_file = hou.hipFile.saveAsBackup()&lt;br /&gt;
    date_time = time.strftime(&amp;quot;%Y_%m_%d__%H.%M.%S&amp;quot;)&lt;br /&gt;
    backup_file_path = os.path.join(flipbook_dir, hou.getenv('HIPNAME'), date_time+&amp;quot;_&amp;quot;+hou.hipFile.basename())&lt;br /&gt;
    backup_file_path = str(backup_file_path)&lt;br /&gt;
    if not os.path.exists(os.path.dirname(backup_file_path)):&lt;br /&gt;
        print('Creating directory: '+os.path.dirname(backup_file_path))&lt;br /&gt;
        os.makedirs(os.path.dirname(backup_file_path))&lt;br /&gt;
    # Rename and move the tmp_backup_file file to our destination path and filename&lt;br /&gt;
    shutil.move(tmp_backup_file, backup_file_path)&lt;br /&gt;
&lt;br /&gt;
    # Don't modifiy the existing settings (make a copy)&lt;br /&gt;
    flbk_settings = toolutils.sceneViewer().flipbookSettings().stash()&lt;br /&gt;
    # If OCIO is enabled don't apply gamma&lt;br /&gt;
    if toolutils.sceneViewer().usingOCIO():&lt;br /&gt;
        flbk_settings.overrideGamma(True)&lt;br /&gt;
        flbk_settings.overrideGamma(1.0)&lt;br /&gt;
    # Set the output path for flipbook frames&lt;br /&gt;
    flbk_settings.output(jpeg_output_path)&lt;br /&gt;
    if hou.licenseCategory() == hou.licenseCategoryType.Apprentice:&lt;br /&gt;
        flbk_settings.useResolution(1)&lt;br /&gt;
        flipbook_options.resolution((1280,720))&lt;br /&gt;
    else:&lt;br /&gt;
        # Disable the resolution override&lt;br /&gt;
        flbk_settings.useResolution(0)&lt;br /&gt;
&lt;br /&gt;
    if flbk_settings.sessionLabel() is '':&lt;br /&gt;
        flbk_settings.sessionLabel( str(os.getpid()) )&lt;br /&gt;
&lt;br /&gt;
    start_timer = time.perf_counter()&lt;br /&gt;
    seq_profile = hou.PerfMonProfile&lt;br /&gt;
    #global seq_profile&lt;br /&gt;
    seq_profile = hou.perfMon.startProfile(&amp;quot;Seq&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # Keeps a history file of all the flipbooks performed in your user dir&lt;br /&gt;
    history_file = open(os.environ['HOME']+'/flbk.txt', 'a+')&lt;br /&gt;
    history_file.write(os.path.splitext(backup_file_path)[0]+'.mp4')&lt;br /&gt;
    history_file.write('\n')&lt;br /&gt;
    history_file.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    # Perform the flipbook&lt;br /&gt;
    toolutils.sceneViewer().flipbook(viewport=None, settings=flbk_settings, open_dialog=False)&lt;br /&gt;
&lt;br /&gt;
    seq_profile.stop()&lt;br /&gt;
    seq_profile.exportAsCSV(os.path.splitext(backup_file_path)[0]+&amp;quot;.csv&amp;quot;)&lt;br /&gt;
    # these .hperf files were too big&lt;br /&gt;
    #seq_profile.save(os.path.splitext(backup_file_path)[0]+&amp;quot;.hperf&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    jpeg_output_path = '&amp;quot;' + jpeg_output_path.replace('$F4', '%04d') + '&amp;quot;'&lt;br /&gt;
    #convert2mov_command ='/usr/local/bin/ffmpeg'&lt;br /&gt;
    convert2mov_command ='ffmpeg'&lt;br /&gt;
    convert2mov_command+=' -start_number '+str( int(flbk_settings.frameRange()[0]) )&lt;br /&gt;
    convert2mov_command+=' -framerate '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -apply_trc iec61966_2_1'&lt;br /&gt;
    convert2mov_command+=' -i '+jpeg_output_path&lt;br /&gt;
    convert2mov_command+=' -vf &amp;quot;scale=trunc(iw/2)*2:trunc(ih/2)*2&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -f mp4 -vcodec libx264 -pix_fmt yuv420p'&lt;br /&gt;
    convert2mov_command+=' -r '+str(hou.fps())&lt;br /&gt;
    convert2mov_command+=' -crf 22'&lt;br /&gt;
    convert2mov_command+=' -metadata title=&amp;quot;'+hou.getenv('HIPNAME')+'&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -metadata comment=&amp;quot;'&lt;br /&gt;
    convert2mov_command+='SOURCE SCENE: '+hou.hipFile.path()+'\n'&lt;br /&gt;
    convert2mov_command+='BACKUP SCENE: '+backup_file_path+'\n'&lt;br /&gt;
    convert2mov_command+='VERSION: '+hou.applicationVersionString()+'\n'&lt;br /&gt;
    convert2mov_command+='PLATFORM: '+hou.applicationPlatformInfo()+'\n'&lt;br /&gt;
    convert2mov_command+='OS: '+os.environ['HOUDINI_OS']+'\n'&lt;br /&gt;
    convert2mov_command+='USER: '+os.environ['USER']+'\n'&lt;br /&gt;
    convert2mov_command+='USERNAME: '+hou.userName()+'\n'&lt;br /&gt;
    convert2mov_command+='HOSTNAME: '+hou.machineName()+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED ON: '+date_time+'\n'&lt;br /&gt;
    convert2mov_command+='EXECUTED IN: '+str(round(time.perf_counter() - start_timer, 2))+' seconds'&lt;br /&gt;
    convert2mov_command+='&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' -x264opts colormatrix=bt709'&lt;br /&gt;
    mp4_output_path = '&amp;quot;' + os.path.splitext(backup_file_path)[0]+'.mp4' + '&amp;quot;'&lt;br /&gt;
    convert2mov_command+=' '+mp4_output_path&lt;br /&gt;
    try:&lt;br /&gt;
        # The subprocess.run() function only exists in Python 3.5 and newer.&lt;br /&gt;
        subprocess.run(shlex.split(convert2mov_command), shell=True, capture_output=True, text=True, check=True)&lt;br /&gt;
    except:&lt;br /&gt;
        # Support versions of Python older then 3.5&lt;br /&gt;
        subprocess.Popen( shlex.split(convert2mov_command) ).wait()&lt;br /&gt;
&lt;br /&gt;
    # Remove the .jpegs generated by the flipbook&lt;br /&gt;
    jpeg_output_path = jpeg_output_path.strip('&amp;quot;\'')&lt;br /&gt;
    for file in [file for file in os.listdir(os.path.dirname(jpeg_output_path)) if file.endswith('.jpeg')]:&lt;br /&gt;
	    os.remove( os.path.join(os.path.dirname(jpeg_output_path), file) )&lt;br /&gt;
    print('Flipbook Finished: ' + mp4_output_path.strip('&amp;quot;'))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ffmpeg combine all .mkv files in a dir ➔&lt;br /&gt;
&amp;lt;syntaxhighlight lang='python'&amp;gt;&lt;br /&gt;
ffmpeg -f concat -safe 0 -i &amp;lt;(find . -type f -name '*.mkv' -printf &amp;quot;file '$PWD/%p'\n&amp;quot; | sort) -c copy $PWD/output.mkv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Live_2022.11.15&amp;diff=1303</id>
		<title>Live 2022.11.15</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Live_2022.11.15&amp;diff=1303"/>
		<updated>2024-03-09T23:25:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Part 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Foam Sprayers =&lt;br /&gt;
[[File:content_thumbnail_2022_11_15.jpg | 960px]]&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This was my attempt trying to recreate the foam techniques from [https://xk.studio/XKR_002-PROTECT the amazing PROTECT project from XK Studio].  Shown below is one of the frames from their project that I used as reference.&lt;br /&gt;
&lt;br /&gt;
[[File:2022_11_15_XK-Studio-XKR_002-Protect3.jpeg | 960px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For more insight in to their process and development, take a look at their video here: [https://twitter.com/xk_studio/status/1575807058355445760/video/1 XK Studio BTS]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below are some of my results while testing and iterating on simulation settings.&lt;br /&gt;
&lt;br /&gt;
[[File:2022_11_15_foam_settings_flbk.gif| 960px]]&lt;br /&gt;
&lt;br /&gt;
= Video On Demand =&lt;br /&gt;
== Part 1 ==&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Zd1PIjUXyhU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 00:00 Introduction&lt;br /&gt;
* 00:50 Flipbook iterations&lt;br /&gt;
* 06:10 Scene walkthrough&lt;br /&gt;
* 06:30 Vellum wire simulation setup&lt;br /&gt;
* 09:50 Setting up the FLIP emission source&lt;br /&gt;
* 12:33 Initial velocity for FLIP emission&lt;br /&gt;
* 14:10 Procedural noise from rest coordinates&lt;br /&gt;
* 15:28 FLIP simulation overview&lt;br /&gt;
* 15:50 VEX wrangle to control divergence&lt;br /&gt;
* 18:50 Surface tension settings&lt;br /&gt;
* 20:35 Post simulation workflow&lt;br /&gt;
* 23:10 Visualize shader noise from rest attribute&lt;br /&gt;
* 39:10 Visualize age particle attribute&lt;br /&gt;
* 44:18 Visualizing divergence in FLIP simulation&lt;br /&gt;
* 51:00 Wrapping up and overview&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Part 2 ==&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/bmGEJe4bVe4&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 00:16 Introduction&lt;br /&gt;
* 02:30 Adjusting Vellum bend stiffness&lt;br /&gt;
* 02:40 Rotating emitters&lt;br /&gt;
* 03:10 Increase Vellum substeps for inter-frame motion&lt;br /&gt;
* 03:35 Update flipsource and rest assignment&lt;br /&gt;
* 04:50 Flatten all surface VDBs into one&lt;br /&gt;
* 06:58 Divergence and viscosity control using VEX&lt;br /&gt;
* 12:15 Visualizing rest texture coordinates&lt;br /&gt;
* 13:20 Using and age and life to find emission time&lt;br /&gt;
* 15:50 How emission time is used to offset texture coordinates&lt;br /&gt;
* 17:50 VEX calculation of particle emission time&lt;br /&gt;
* 18:30 Using sin funtion with emission time&lt;br /&gt;
* 25:00 Redshift procedural noise from the rest attribute&lt;br /&gt;
* 28:30 Scaling and adjusting the noise&lt;br /&gt;
* 29:00 Visualize the noise value&lt;br /&gt;
* 32:45 Comparing noise results when rest attribute is used&lt;br /&gt;
* 36:30 Using RS State VOP to retrieve the rest attribute&lt;br /&gt;
* 38:40 Using color ramps with rest&lt;br /&gt;
* 39:10 Visulaizing displacement quality wireframe&lt;br /&gt;
* 43:00 Subsurface radius and color&lt;br /&gt;
* 49:00 Detecting and removing droplets after the sim&lt;br /&gt;
* 57:50 Customizing the Houdini menu&lt;br /&gt;
* 59:00 Wrapping up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scene File =&lt;br /&gt;
== Part 1 ==&lt;br /&gt;
[[:File:22_11_15_foam_sprayers_pt1.hiplc | 22_11_15_foam_sprayers_pt1.hiplc]]&lt;br /&gt;
&lt;br /&gt;
== Part 2 ==&lt;br /&gt;
[[:File:22_11_20_foam_sprayers_pt2.hiplc | 22_11_20_foam_sprayers_pt2.hiplc]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1302</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1302"/>
		<updated>2024-02-01T20:28:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
# For OSX you can simply launch the Houdini Terminal app, then export the HOUDINI_USER_PREF_DIR and launch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1301</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1301"/>
		<updated>2024-02-01T20:28:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
// For OSX you can simply launch the Houdini Terminal app, then export the HOUDINI_USER_PREF_DIR and launch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1300</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1300"/>
		<updated>2023-08-04T16:21:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Plexus Effect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.15, 10))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(v@N*8));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1299</id>
		<title>VEX Wrangle Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=VEX_Wrangle_Snippets&amp;diff=1299"/>
		<updated>2023-08-04T16:21:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Plexus Effect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Translate ==&lt;br /&gt;
[[File:vex_offset_position.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Offset the position of geometry&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_offset_position.hiplc|vex_offset_position.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {1, 0, 0};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Taper ==&lt;br /&gt;
[[File:taper_vex_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reduces the circumference by scaling along the XZ plane based on the height of the geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:taper_vex_001.hiplc|taper_vex_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float taper = relbbox(0,@P).y;&lt;br /&gt;
// Remap the taper range&lt;br /&gt;
taper = fit01(taper, 1, fit01(sin(@Time*PI/5)*0.5+0.5, 2.5, .5));&lt;br /&gt;
// Apply the taper by scaling along the X and Y axis&lt;br /&gt;
@P *= set(taper,1,taper);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Boxify ==&lt;br /&gt;
[[File:vex_boxify_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Distorts the geometry, morphing it into a box shape&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_boxify_001.hiplc|vex_boxify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, @P+clamp(normalize(@P)*1.75,vector(-1),vector(1)) * (1.0-length(max(abs(@P)))), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spherify ==&lt;br /&gt;
[[File:vex_spherify_001.gif | 340px | right]]&lt;br /&gt;
Distorts the geometry into a sphere shape&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_spherify_001.hiplc|vex_spherify_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
vector size = getbbox_size(0);&lt;br /&gt;
size = min(size); // Largest component&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P *= (1.0/size);&lt;br /&gt;
@P = lerp(@P, normalize(@P), chf('blend'));&lt;br /&gt;
@P *= size;&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stretch ==&lt;br /&gt;
[[File:vex_stretch_001.gif | 340px | right]]&lt;br /&gt;
Stretch the geometry across it's X axis&lt;br /&gt;
&lt;br /&gt;
Add one component of position to itself to stretch the geometry away from it's center.  You can control the amount of stretching by multiplying the position before adding it to itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_stretch_001.hiplc|vex_stretch_001.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector centroid = getbbox_center(0);&lt;br /&gt;
@P -= centroid;&lt;br /&gt;
@P.x += @P.x*chf('amt');&lt;br /&gt;
@P += centroid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shape Blending ==&lt;br /&gt;
[[File:vex_position_blend.gif | 340px | right]]&lt;br /&gt;
Blend between point attributes to produce a morph effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_position_blend.hiplc|vex_position_blend.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = lerp(@P, @opinput1_P, chf('blend'));&lt;br /&gt;
@N = lerp(@N, @opinput1_N, chf('blend'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snap to Grid ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_snap_to_grid.gif | 340px | right]]&lt;br /&gt;
Snap ([https://en.wikipedia.org/wiki/Quantization_(signal_processing) quantize]) point positions to a grid for a downres effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_snap_to_grid.hiplc|File:vex_snap_to_grid.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float grid_scale = chf('grid_scale');&lt;br /&gt;
@P = rint(@P*grid_scale)/grid_scale;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make 2D ==&lt;br /&gt;
[[File:vex_setcomp.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
You can use the setcomp function to zero out a component of a vector, resulting in a two dimensional surface.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_setcomp.hiplc|vex_setcomp.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the X component to zero, planar 2D in YZ&lt;br /&gt;
setcomp(@P, 0, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Y component to zero, planar 2D in XZ&lt;br /&gt;
setcomp(@P, 0, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Set the Z component to zero, planar 2D in XY&lt;br /&gt;
setcomp(@P, 0, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Swizzle Coordinate System ==&lt;br /&gt;
[[File:vex_swizzle_vector_components.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
Shuffle the components of a vector using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_swizzle_vector_components.hiplc|vex_swizzle_vector_components.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.zyx;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Switch between Y up and Z up coordinates using [https://www.sidefx.com/docs/houdini/vex/lang.html#dot-operator swizzle]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P = @P.xzy * set(-1,1,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Twirl ==&lt;br /&gt;
[[File:vex_twirl.gif | 340px | right]]&lt;br /&gt;
Twirl the geometry around the Y axis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_twirl.hiplc|vex_twirl.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * set(r,1,r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = chf('angle');&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
r = pow(r, chf('pow'));&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle) * r;&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
alt&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float angle = @P.y*900;&lt;br /&gt;
vector origin = set(0,0,0);&lt;br /&gt;
&lt;br /&gt;
vector d = v@P*set(1,0,1) - origin;&lt;br /&gt;
float r = length(d);&lt;br /&gt;
float beta = atan(d.x, d.z) + radians(angle);&lt;br /&gt;
v@P = origin + r * set(sin(beta), 0, cos(beta)) + set(0,@P.y,0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
alt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
pos.x = (@P.x * cos(a)) - (@P.z * sin(a));&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
pos.z = (@P.x * sin(a)) + (@P.z * cos(a));&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
@P = set( (@P.x * cos(a)) - (@P.z * sin(a)), @P.y, (@P.x * sin(a)) + (@P.z * cos(a)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
vector pos = @P;&lt;br /&gt;
float u = atan2(pos.x, pos.z);&lt;br /&gt;
float r = length(pos * {1, 0, 1});&lt;br /&gt;
pos = set(sin(u-a), pos.y, cos(u-a)) * r;&lt;br /&gt;
pos.y = @P.y;&lt;br /&gt;
@P = pos;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float a = chf('angle') * length(@P * {1, 0, 1});&lt;br /&gt;
float u = atan2(@P.x, @P.z);&lt;br /&gt;
float r = length(@P * {1, 0, 1});&lt;br /&gt;
@P = set(sin(u-a), @P.y, cos(u-a)) * r;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Peak ==&lt;br /&gt;
[[File:vex_push_surface_along_normals.gif | 340px | right]]&lt;br /&gt;
Move the surface along it's normals, producing an inflation effect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_push_surface_along_normals.hip|vex_push_surface_along_normals.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += normalize(@P) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exploded View ==&lt;br /&gt;
[[File:vex_exploded_view.gif | 340px | right]]&lt;br /&gt;
Moves each packed piece outward from the geometry centroid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_exploded_view.hiplc|vex_exploded_view.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += (@P - getbbox_center(0)) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Point Jitter ==&lt;br /&gt;
[[File:vex_point_jitter.gif | 340px | right]]&lt;br /&gt;
Move each point in a random direction with a spherical distribution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_point_jitter.hip|vex_point_jitter.hip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += sample_sphere_uniform(rand(@elemnum+chf('seed'))) * chf('scale');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Plexus Effect ==&lt;br /&gt;
[[File:vex_plexus.gif | 340px | right]]&lt;br /&gt;
Connect nearby points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_plexus.hiplc|vex_plexus.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
foreach(int pt; nearpoints(0, @P, 0.5, 250))    {&lt;br /&gt;
    if(pt &amp;gt; @ptnum)&lt;br /&gt;
        addprim(0, 'polyline', @ptnum, pt);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Nearest Point ==&lt;br /&gt;
Draw a line to the closest point of the second input&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, vector(point(1,'P',nearpoint(1,@P)))) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Connect to Closest Surface Position ==&lt;br /&gt;
Draw a line to the closest surface position&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
addprim(0, 'polyline', @ptnum, addpoint(0, minpos(1,@P) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Rotation of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a random orientation&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector r = sample_direction_uniform(rand(@primnum));&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
rotate(x, PI*pow(rand(@primnum-666),0.5), r);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Randomize the Scale of Packed Primitives ==&lt;br /&gt;
Update the transform intrinsic to a apply a random scale&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
vector s = rand(i@primnum);&lt;br /&gt;
s = s.yyy;  // Uniform Scale&lt;br /&gt;
matrix3 x = primintrinsic(0,'transform',i@primnum);&lt;br /&gt;
scale(x, s);&lt;br /&gt;
setprimintrinsic(0,'transform',i@primnum,x);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Random Color from Normal Direction ==&lt;br /&gt;
Generate random colors based on the surface normal, adjust the multiplier to control the amount of colors&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = rand(rint(v@N*8));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iterative Face Insetting ==&lt;br /&gt;
Recursive divide and inset edges, [https://twitter.com/d_gfx/status/1452718124579520512 via @d_gfx], excellent use of [https://www.sidefx.com/docs/houdini/vex/arrays.html arrays]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int pts[] = primpoints(0,@primnum); vector pos[];&lt;br /&gt;
int edge_div_pts[]; vector edge_div_pos[];&lt;br /&gt;
foreach( int pt; pts ) &lt;br /&gt;
    append(pos, vector(point(0,'P',pt)));&lt;br /&gt;
for( int i = 0; i &amp;lt; chi('iterations'); i++ )    {&lt;br /&gt;
    resize(edge_div_pts,0); // empty&lt;br /&gt;
    resize(edge_div_pos,0); // empty&lt;br /&gt;
    for( int j = 0; j &amp;lt; len(pts); j++ ) {&lt;br /&gt;
        append(edge_div_pos, lerp( pos[j], pos[(j+1)%len(pts)], chf('div_ratio') ));&lt;br /&gt;
        append(edge_div_pts, addpoint(0, edge_div_pos[-1])); // [-1] grabs the last item from an array&lt;br /&gt;
    }&lt;br /&gt;
    for (int k = 0; k &amp;lt; len(pts); k++ ) {&lt;br /&gt;
        addprim(0, 'poly', pts[k], edge_div_pts[k], edge_div_pts[(k+2)%len(pts)]);&lt;br /&gt;
    }&lt;br /&gt;
    pts = edge_div_pts;&lt;br /&gt;
    pos = edge_div_pos;&lt;br /&gt;
}&lt;br /&gt;
addprim(0, 'poly', edge_div_pts);&lt;br /&gt;
removeprim(0,@primnum,1); // Remove the input prim and any points belonging to it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Iridescent Color Function ==&lt;br /&gt;
[[File:vex_iridescent.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Produce an iridescent color ramp from any varying value, [https://www.shadertoy.com/view/XlcBR7 from shadertoy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_iridescent.hiplc|vex_iridescent.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float amt = dot(@N, set(0,1,0))*0.5+0.5;&lt;br /&gt;
v@Cd =  (0.5 + 0.5 * cos( PI*2*( amt + set(0,1,2)/3) ) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Colors from HSV Colorspace ==&lt;br /&gt;
[[File:vex_hsvtorgb_rainbow_001.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can easily control the hue, while keeping the saturation and value the same using the [https://www.sidefx.com/docs/houdini/vex/functions/hsvtorgb.html hsvtorgb] function.&lt;br /&gt;
&lt;br /&gt;
This allows you to easily create rainbows, gradients, perform hue rotations and produce complimentary colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_hsvtorgb_rainbow_001.hiplc|vex_hsvtorgb_rainbow_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb( set(relbbox(0,@P).z - @Time/5 + dot(@N,set(0,1,0))/2, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rainbow Cycle with frac function ==&lt;br /&gt;
[[File:rainbow_cycle_w_frac_VEX.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the [https://www.sidefx.com/docs/houdini/vex/functions/frac.html frac] function, you can cycle through a rainbow over a desired amount of elements.&lt;br /&gt;
&lt;br /&gt;
This is then offset by adding the current time to the fractional value, which produces the scrolling effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_frac_rainbow_cycle_001.hiplc|vex_frac_rainbow_cycle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
v@Cd = hsvtorgb(set(frac(@elemnum/8.0)+@Time/10, 1, 1));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loop Over All Attributes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
string pt_attrs[] = detailintrinsic(1,'pointattributes');&lt;br /&gt;
foreach( string pt_attr; pt_attrs ) {&lt;br /&gt;
    if( pt_attr ~= 'attr_name*' ) {&lt;br /&gt;
        setpointgroup(0, pt_attr, @ptnum, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Faces Across Bounding Box ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
if( relbbox(0,@P).x &amp;lt; rand(@primnum) )&lt;br /&gt;
    removeprim(0,@primnum,1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Torus Knot ==&lt;br /&gt;
[https://prideout.net/knotgl/ Online Knot Viewer]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
float u = float(@ptnum)/(@numpt-1);&lt;br /&gt;
u += @Time/10.0;&lt;br /&gt;
u %= 1.0;&lt;br /&gt;
u *= PI * 2;&lt;br /&gt;
float r = 2.0;&lt;br /&gt;
float q = 2;&lt;br /&gt;
float p = 3;&lt;br /&gt;
f@u = u;&lt;br /&gt;
@P.x += cos(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.y += sin(u*q) * (cos(u*p)+r);&lt;br /&gt;
@P.z += sin(u*p);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Circle ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_circle.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a circle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_circle.hiplc|vex_map_grid_to_circle.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float theta = @P.x;&lt;br /&gt;
float radius = @P.y/2;&lt;br /&gt;
@P = 0;&lt;br /&gt;
@P.x = sin(theta*PI*2 ) * radius;&lt;br /&gt;
@P.y = cos(theta*PI*2 ) * radius;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remap Grid to Sphere ==&lt;br /&gt;
&lt;br /&gt;
[[File:vex_map_grid_to_sphere.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Working with polar coordinates to map a square onto a sphere.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_map_grid_to_sphere.hiplc|vex_map_grid_to_sphere.hiplc]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
@P += {0.5, 0.5, 0}; // Remap the grid to zero to one range&lt;br /&gt;
float phi = @P.x;&lt;br /&gt;
float theta = 1.0-@P.y;&lt;br /&gt;
@P.x = sin(theta*PI*1 ) * cos(phi*PI*2 )/2;&lt;br /&gt;
@P.z = sin(theta*PI*1 ) * sin(phi*PI*2 )/2;&lt;br /&gt;
@P.y = cos(theta*PI*1 )/2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Quad ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,0)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(1,0,1)) );&lt;br /&gt;
addvertex(0,prim,addpoint(0,set(0,0,1)) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Grid ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
for(int i = 0; i&amp;lt;8; i++)    {&lt;br /&gt;
    for(int j = 0; j&amp;lt;8; j++)    {&lt;br /&gt;
        int prim = addprim(0,'poly');&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
        addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make a Circle ==&lt;br /&gt;
[[File:vex_make_circle.gif | 300px | right]]&lt;br /&gt;
&lt;br /&gt;
This example shows how you can generate a circle or N sided polygon using a for loop, sin and cos.&lt;br /&gt;
&lt;br /&gt;
Run the code in detail mode with an attribute wrangle.&lt;br /&gt;
&lt;br /&gt;
This is essentially the same idea as the [https://www.sidefx.com/docs/houdini/nodes/sop/circle.html circle] node but hopefully a beneficial example to see how this type of geometry is generated via VEX.&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_make_circle_001.hiplc|vex_make_circle_001.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
int prim = addprim(0,'poly');&lt;br /&gt;
int seg = chi('segments');&lt;br /&gt;
for( int i = 0; i&amp;lt;seg; i++ )  {&lt;br /&gt;
    float u = float(i)/seg * 2*PI;&lt;br /&gt;
    addvertex(0, prim, addpoint(0, set(sin(u),0,cos(u))) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Groups to Attribute ==&lt;br /&gt;
[https://zybrand.xyz/groups-to-attribute-with-vex From zybrand]&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
//convert numbered groups to a numbered attribute&lt;br /&gt;
string groups[] = detailintrinsic(0, &amp;quot;primitivegroups&amp;quot;);&lt;br /&gt;
int prim = @primnum;&lt;br /&gt;
string elemnum;&lt;br /&gt;
&lt;br /&gt;
foreach(string i; groups)&lt;br /&gt;
{&lt;br /&gt;
    //if the current primitive is in group i&lt;br /&gt;
    if(inprimgroup(0,i,prim) == 1)&lt;br /&gt;
    {&lt;br /&gt;
        elemnum = re_find(r&amp;quot;\d{3,6}&amp;quot;,i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
s@number = elemnum;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Looping Curl Noise ==&lt;br /&gt;
[[File:2022_12_11_looping_curl_noise.gif | 340px | right]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's possible to achieve seamless looping animation from curl noise by blending between two noises.&lt;br /&gt;
&lt;br /&gt;
In this example one noise function is evaluated at the current time, and a second noise function is evaluated at the time shifted back by the desired loop duration.&lt;br /&gt;
&lt;br /&gt;
The result of these two noise functions are blended from one to the other over the duration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:File:vex_looping_noises.hiplc|vex_looping_noises.hiplc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
// Position x Frequency&lt;br /&gt;
vector p = @P*0.5;&lt;br /&gt;
// Speed&lt;br /&gt;
float s = 0.5;&lt;br /&gt;
// Loop Length (in seconds)&lt;br /&gt;
float l = 5;&lt;br /&gt;
// Time % duration&lt;br /&gt;
float t = (@Time%l);&lt;br /&gt;
// Blending&lt;br /&gt;
vector v0 = curlgxnoise(p + set(0,0,0,t*s));&lt;br /&gt;
vector v1 = curlgxnoise(p + set(0,0,0,(t-l)*s));&lt;br /&gt;
@P += lerp(v0,v1,frac(@Time/l)) * 0.35;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--== Make a Grid ==&lt;br /&gt;
 for(int j = 0; j&amp;lt;4; j++)    {&lt;br /&gt;
    int prim = addprim(0,'poly');&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i+1,0,j+1)) );&lt;br /&gt;
    addvertex(0,prim,addpoint(0,set(i,0,j+1)) );&lt;br /&gt;
 }--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=File:vex_plexus.hiplc&amp;diff=1298</id>
		<title>File:vex plexus.hiplc</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=File:vex_plexus.hiplc&amp;diff=1298"/>
		<updated>2023-08-04T16:18:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=File:vex_plexus.gif&amp;diff=1296</id>
		<title>File:vex plexus.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=File:vex_plexus.gif&amp;diff=1296"/>
		<updated>2023-08-04T16:15:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1295</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1295"/>
		<updated>2023-08-03T21:45:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1294</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1294"/>
		<updated>2023-08-03T21:38:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
&amp;lt;syntaxhighlight lang='bash'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1293</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1293"/>
		<updated>2023-08-03T21:38:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
&amp;lt;syntaxhighlight lang='shell'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1292</id>
		<title>Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.johnkunz.com/index.php?title=Notes&amp;diff=1292"/>
		<updated>2023-08-03T21:37:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
https://www.sidefx.com/faq/question/how-do-i-set-up-the-houdini-environment-for-command-line-tools/&lt;br /&gt;
&lt;br /&gt;
https://www.sidefx.com/docs/houdini/basics/config_env.html&lt;br /&gt;
&lt;br /&gt;
https://help.autodesk.com/view/ARNOL/ENU/?guid=arnold_for_houdini_ah_getting_started_ah_Installation_html#using-a-wrapper-script&lt;br /&gt;
&amp;lt;syntaxhighlight lang='C'&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# path to houdini install&lt;br /&gt;
HOUDINI_ROOT=&amp;quot;/opt/hfs18.0.348&amp;quot;&lt;br /&gt;
# source houdini environment&lt;br /&gt;
cd ${HOUDINI_ROOT}&lt;br /&gt;
source houdini_setup&lt;br /&gt;
cd - &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
# make a fresh houdini prefs&lt;br /&gt;
export HOUDINI_USER_PREF_DIR=/tmp/__HVER__&lt;br /&gt;
# launch houdini&lt;br /&gt;
houdini $@ &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/PCUskrvHEyU&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://www.youtube.com/watch?v=F73jwtPeZ4A&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/S-UAi_VA9Ck&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152761107/LOccitane-Immortelle-Divine LOccitane-Immortelle-Divine]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/750079702&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Hidden Film --&amp;gt;&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot; &amp;gt;https://vimeo.com/587822198&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:057267152198639.6319ae685bf2b.gif | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/152198639/Rings-Of-Power-Opening-Sequence-%28fanart%29 Rings Of Power Opening Sequence]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/112310559/CYMATIC CYMATIC]&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/164712533/FLIP-ROCKS FLIP-ROCKS]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;youtube&amp;quot; dimensions=&amp;quot;960x540&amp;quot; urlargs=&amp;quot;modestbranding=1&amp;amp;showinfo=0&amp;quot;&amp;gt;https://youtu.be/Ml4rwqT8H9s&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/LiterallyAKing/status/1569059332611870722 Chladni figures thread]&lt;br /&gt;
&lt;br /&gt;
[https://www.experienceperception.com/black-panther-moe.html Black Panther Titles]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Cymatics#Influences_on_art_and_music Cymatics]&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/nandocosta_art/status/1574796018713243648 Nando's google grain]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/images/7/78/Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration.pdf Jenny_Hans_Cymatics_A_Study_of_Wave_Phenomena_and_Vibration]&lt;br /&gt;
&lt;br /&gt;
[https://fyfluiddynamics.com/2022/11/recreating-the-rings-of-power-opening/?doing_wp_cron=1668464126.1629459857940673828125 recreating-the-rings-of-power-opening]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/313133329&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.behance.net/gallery/85706605/Audible-Theater-Cymatics Audible-Theater-Cymatics]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/752026986&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/832884950&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x540&amp;quot;&amp;gt;https://vimeo.com/426969163&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:6027523799.mp4 | 960px]]&lt;br /&gt;
&lt;br /&gt;
[https://versostudio.es/#portfolio versostudio]&lt;br /&gt;
[https://www.behance.net/gallery/149957151/Verso-Studio-Teaser-Reel]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;embedvideo service=&amp;quot;vimeo&amp;quot; dimensions=&amp;quot;960x400&amp;quot;&amp;gt;https://vimeo.com/658608284&amp;lt;/embedvideo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://twitter.com/panoplycreative/status/1572618162776211464 Intermission ~ A Panoply Curiosity]&lt;br /&gt;
&lt;br /&gt;
[https://monoskop.org/Software_art Software Art]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>