From 7c5cd1ab02881aeb8d805590f0a37c7244b48090 Mon Sep 17 00:00:00 2001 From: Gabriel Dunne Date: Tue, 29 Apr 2014 17:00:59 -0700 Subject: [PATCH] Organizing and styling. --- _config.yml | 7 +- _layouts/default.html | 22 ++--- _layouts/post.html | 7 +- _posts/2014-04-23-gh-td.markdown | 32 +++---- ...generativeforms-projectionmapping.markdown | 72 -------------- _posts/2014-04-24-tetra-field.markdown | 88 ++++++++++++++++++ _posts/2014-04-24-woodmitres.markdown | 13 +-- css/letter_gothic.ttf | Bin 0 -> 43968 bytes css/main.css | 65 +++++++++++-- index.html | 6 +- publish.sh | 1 + 11 files changed, 187 insertions(+), 126 deletions(-) delete mode 100644 _posts/2014-04-24-generativeforms-projectionmapping.markdown create mode 100644 _posts/2014-04-24-tetra-field.markdown create mode 100755 css/letter_gothic.ttf diff --git a/_config.yml b/_config.yml index aea8c54..e3cbc10 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,9 @@ -name : process notes +name : notes +author: Gabriel Dunne +author_url : http://gabrieldunne.com +author_email : gabe@gabrieldunne.com markdown : redcarpet pygments : true -permalink : /:month-:day-:year/:title.html +permalink : /:title.html baseurl : /process exclude: [ publish.sh ] \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html index 84a81e4..a782cc8 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -5,32 +5,24 @@ {{ page.title }} - - - - - +
+ {{ content }} +
+ + diff --git a/_layouts/post.html b/_layouts/post.html index 62d3293..8b85161 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -1,9 +1,12 @@ --- layout: default --- -

{{ page.title }}

+

{{ page.title }}

-

{{ page.date | date_to_string }}, by {{ page.author }}

+

+{{ page.date | date: "%Y/%m/%d" }}
+{{ site.author }} +

{{ content }} diff --git a/_posts/2014-04-23-gh-td.markdown b/_posts/2014-04-23-gh-td.markdown index 8328d3f..77bba62 100644 --- a/_posts/2014-04-23-gh-td.markdown +++ b/_posts/2014-04-23-gh-td.markdown @@ -3,30 +3,26 @@ layout: post title: "Grasshopper -> TouchDesigner Bridge" date: 2014-04-23 categories: articles -author : Gabriel Dunne --- -by Gabriel Dunne - ## Abstract -A proof-of-concept patch that sends polygon mesh geometry from Grasshopper to TouchDesigner realtime via OSC. - -## Software -[Rhino3D](http://rhino3d.com) -[Grasshopper3D](http://www.grasshopper3d.com/) -[TouchDesigner](https://www.derivative.ca/) - -## Grasshopper Plugins -[gHowl](http://www.grasshopper3d.com/group/ghowl) -[GhPython](http://www.food4rhino.com/project/ghpython) - - +A proof-of-concept patch that sends polygon mesh geometry from Grasshopper to TouchDesigner realtime via OSC. The ability to share mesh data between Grasshopper and TouchDesigner allows for a streamlined workflow when projection-mapping geometry. It eliminates a mesh export/import step, and doesn't rely on TouchDesigner's mesh editing tools. It streamlines the process of fabricating objects, as it closely links the fabrication process of the form to the projection mapping process. Grasshopper, a parametric geometry environment, allows for great control over the verticies, planes, and normals of a 3D mesh, which gets sent to the TouchDesigner graphics environment. Any changes to a mesh done in Grasshopper translates to TouchDesigner in real time. This is a proof of concept and unoptomized for large meshes. +### Software +- [Rhino3D](http://rhino3d.com) +- [Grasshopper3D](http://www.grasshopper3d.com/) + - [gHowl](http://www.grasshopper3d.com/group/ghowl) + - [GhPython](http://www.food4rhino.com/project/ghpython) +- [TouchDesigner](https://www.derivative.ca/) -The ability to share mesh data between Grasshopper and TouchDesigner allows for a streamlined workflow when projection-mapping geometry. It reduces the amount of mesh import/exporting, and doesn't rely on TouchDesigner for mesh editing, which is where Grasshopper excels. Additionally, it streamlines the process of fabricating objects, as it closely links the fabrication process of the form to the projection mapping process. Grasshopper, a parametric geometry environment, allows for great control over the verticies, planes, and normals of a 3D mesh, which gets sent to the TouchDesigner graphics environment via OSC. Any changes to a mesh done in Grasshopper will translate to TouchDesigner in real time. This is a proof of concept and unoptomized for large meshes. +### Screenshots +#### Rhino/Grasshopper +![](https://raw.githubusercontent.com/quilime/gh-td/master/screenshots/sender_gh.PNG) -TODO: [ screenshot ] +#### TouchDesigner +![](https://raw.githubusercontent.com/quilime/gh-td/master/screenshots/receive_01.PNG) -TODO: [ tutorial ] +### Source +[https://github.com/quilime/gh-td](https://github.com/quilime/gh-td) diff --git a/_posts/2014-04-24-generativeforms-projectionmapping.markdown b/_posts/2014-04-24-generativeforms-projectionmapping.markdown deleted file mode 100644 index 7bcb472..0000000 --- a/_posts/2014-04-24-generativeforms-projectionmapping.markdown +++ /dev/null @@ -1,72 +0,0 @@ ---- -layout: post -title: "Projection Mapping Generative Forms with Grasshopper and TouchDesigner" -date: 2014-04-24 -categories: articles -author: Gabriel Dunne ---- - -![Finished](https://farm6.staticflickr.com/5505/11228006956_0a33de14b9_c.jpg) - -This article is a documentation of a process for making generative geometric forms for use in projection mapping. - -# Requirements - -## Software -- [Rhino3D](http://rhino3d.com) -- [Grasshopper3D](http://www.grasshopper3d.com/) - - [gHowl](http://www.grasshopper3d.com/group/ghowl) - - [GhPython](http://www.food4rhino.com/project/ghpython) -- [TouchDesigner](https://www.derivative.ca/) - -## Hardware -- Digital Projector -- Windows PC with TouchDesigner supported videocard. - -## Fabrication Tools -- Laser Cutter - -## Materials -- 10mm Plywood Stock -- Cyanoacrylate Super Glue -- Neodynimum Magnets -- Angle Brackets -- Gap-filling paint/primer - -I arrived at this design during an experiment on rapid fabrication closely linked with the process of projection-mapping. It consists of a series of projection-mapped truncated tetrahedrons made out of 10mm plywood. They vary in size, orientation, and all have an arbirary boolean intersection with a vertical plane, allowing them all have unique placements on the wall. Rhino/Grasshopper was used to generate the geometry, and TouchDesigner was used for the projection graphics. The polygon mesh information used for projections are received by TouchDesigner from Grasshopper via my [Grasshopper -> TouchDesigner Bridge]({% post_url 2014-04-23-gh-td %}). - -This iteration does not include a solution mitered corners, due to the physical tendancies of the laser cutter, which simplifies the fabrication process considerably. My current process is designing a precise, repeatable solution for generating mitres when fabricating polygonal shapes. - -# Design - -The geometry was created in Grasshopper. - -[grasshopper patch/screenshot] - -Grasshopper process. - -# Fabrication Process - -![Lasering](https://farm4.staticflickr.com/3698/10585763365_b0047bf023_c.jpg) - -Forms were cut with a LaserSaur laser cutter from sheets of lightweight, low-grade 10mm ply. - -![Gluing](https://farm8.staticflickr.com/7308/10585766255_f3b95369ae_c.jpg) - -Panels are superglued together by hand. The interior support structure relies on two angle wedges, which are superglued to the interior of the forms. - -![Painting](https://farm8.staticflickr.com/7430/10585792186_6a42ecb673_c.jpg) - -After the glue dries (very I gave them multiple coats of white primer and gap filler. - -# Installation - -Ultra strong neodynium magnets were used as a mounting solution. I tried the methods of inserting large-headed nails or screws into the wall, or simply gaff-taping an opposing magnet. The gaff-tape method was a temporary, but works. - -[magnet shot] - -# Projection Mapping - -[touch designer graphics page/screenshot] - - diff --git a/_posts/2014-04-24-tetra-field.markdown b/_posts/2014-04-24-tetra-field.markdown new file mode 100644 index 0000000..071c673 --- /dev/null +++ b/_posts/2014-04-24-tetra-field.markdown @@ -0,0 +1,88 @@ +--- +layout: post +title: "Tetra Field" +date: 2014-04-24 +categories: articles +author: Gabriel Dunne +--- + +![Finished](https://farm6.staticflickr.com/5505/11228006956_0a33de14b9_c.jpg) + +*Tetra Field* +Gabriel Dunne +2014 +plywood, projector, touchdesigner, grasshopper + + +## Introduction + +*Tetra Field* consists of a series of projection-mapped truncated tetrahedrons laser-cut from 10mm bitch ply. They vary in size, orientation, truncation, and all have an arbirary boolean intersection with a vertical plane, resulting in each having unique placement on the wall. + +I arrived at this design during an experiment on rapid fabrication closely linked with the process of projection-mapping. + +Rhino/Grasshopper was used to generate the geometry, and TouchDesigner was used for the projection graphics. The polygon mesh information from Grasshopper is shared by TouchDesigner from via my [Grasshopper -> TouchDesigner Bridge]({% post_url 2014-04-23-gh-td %}). This allows the fabrication process of the object, and and the projection graphics to be highly linked and related. + +Further Software Iterations: This project did not solve the problem of aligning the projector to the sculptures. For this project, projecting and capturing GrayCode patterns would have been the most reliable method, but the shape of the objects was so simple, I mounted them on the wall, and knowing the projector distance, I oriented the graphics manually. For future iterations, I want to experiment with embedded fiber-optics in verticies that would be tracked with an IR camera for a precise, real-time alignment. A huge challenge involved in projection mapping objects is the sheer amount of time it takes to align projections, and creating a real-time mapping solution allows for articulated and or moving installations. + +Future Fabrication Iterations: This iteration does not include a solution mitered corners, due to the physical tendancies of the laser cutter, which simplifies the fabrication process considerably. My current process is designing a precise, repeatable solution for generating mitres when fabricating polygonal shapes. However, the lack of mitres in this design reveals a perfect channel between faces that highlights the polygon edge. + +## Materials + +### Software +- [Rhino3D](http://rhino3d.com) +- [Grasshopper3D](http://www.grasshopper3d.com/) + - [gHowl](http://www.grasshopper3d.com/group/ghowl) + - [GhPython](http://www.food4rhino.com/project/ghpython) +- [TouchDesigner](https://www.derivative.ca/) + +### Hardware +- DLP or LCD Projector +- Windows PC with TouchDesigner-supported videocard (NVidia). + +### Fabrication Tools +- Laser Cutter + +### Material List +- 10mm Plywood Stock trimmed to fit laser bed +- Cyanoacrylate Super Glue +- Neodynimum Magnets +- Angle Brackets +- Gap-filling paint/primer +- silicon caulk +- gaffers tape + + + +# Design + +Geometry was created in Grasshopper via the LunchBox toolkit. + +[grasshopper patch/screenshot] + +Grasshopper process. + +# Fabrication Process + +![Lasering](https://farm4.staticflickr.com/3698/10585763365_b0047bf023_c.jpg) + +Forms were cut with a LaserSaur laser cutter from sheets of lightweight, low-grade 10mm ply. + +![Gluing](https://farm8.staticflickr.com/7308/10585766255_f3b95369ae_c.jpg) + +Panels are superglued together by hand. The interior support structure relies on two angle wedges, which are superglued to the interior of the forms. + +![Painting](https://farm8.staticflickr.com/7430/10585792186_6a42ecb673_c.jpg) + +After the glue dries (very I gave them multiple coats of white primer and gap filler. The brazing of the laser on the plywood is a tough surface to paint completely white, and required multiple coats. + +# Installation + +Ultra strong neodynium magnets were used as a mounting solution. I tried the methods of inserting large-headed nails or screws into the wall, or simply gaff-taping an opposing magnet. The gaff-tape method was a temporary, but works. + +[magnet shot] + +# Projection Mapping + +[touch designer graphics page/screenshot] + + diff --git a/_posts/2014-04-24-woodmitres.markdown b/_posts/2014-04-24-woodmitres.markdown index 5ba55ac..35d9cac 100644 --- a/_posts/2014-04-24-woodmitres.markdown +++ b/_posts/2014-04-24-woodmitres.markdown @@ -1,12 +1,12 @@ --- layout: post -title: "Creating Arbitrary Mitre Angles in Wood Panels" +title: "Arbitrary Mitre Angles for Wood" date: 2014-04-24 categories: articles author: Gabriel Dunne --- -# Truncated Tetrahedron Stool/Table +## Truncated Tetrahedron Stool/Table I'm continuing my interations with the Tetrahedron model. I like using it for experiments because of it's a very basic "root" shape. This article will cover the creation of a truncated tetrahedron shape out of 3/4" material, with mitred joins. @@ -87,7 +87,7 @@ Tetrahedron! -# Truncation +## Truncation Now, we need to truncate our shape. @@ -156,7 +156,7 @@ Then, I make trace all the edges, do 3pt orients, and align them to the cutting -# Creating Thickness +## Creating Thickness We need to: 1. Offset mesh by .75 @@ -168,7 +168,7 @@ you only need to do this for each individual piece, and then duplicate them. -# Measuring the Mitre Angles +## Measuring the Mitre Angles We need to draw some guidlines for measuring perpendicular to the edge of the face. @@ -224,7 +224,8 @@ We have one more special angle to cut, for the parts of the form that rest on th We're done cutting! -# Assembly + +## Assembly We'll work upside down, and build the form up. Place the top of the form upside down on the worksurface diff --git a/css/letter_gothic.ttf b/css/letter_gothic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..75b31b1b36d6ffaef4a8b9b5d34286b8f51d935a GIT binary patch literal 43968 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 K>=MU)@cwVQ=8B;J literal 0 HcmV?d00001 diff --git a/css/main.css b/css/main.css index 8545e06..5217ea4 100755 --- a/css/main.css +++ b/css/main.css @@ -10,37 +10,70 @@ padding: 0; } +@font-face +{ + font-family: lettergothic; + src: url(letter_gothic.ttf); +} + html, body { height: 100%; } body { - background-color: #FFF; - font: 14px sans-serif; + background-color: #eee; + font: 12px menlo, "andale mono", monospace, sans-serif; } -h1, h2, h3, h4, h5, h6 { +h1,h2,h3, h4, h5, h6 { font-size: 1em; + color:#000; + line-height:1em; + font-weight:bold; + margin: 1em 0; +} +h1 { + margin:1em 0; + font-size:2.8em; + padding-bottom:0.1em; + text-align:center; + font-family:lettergothic; + border-bottom:1px solid #aaa; +} +h2, h3 { + text-align:center; + margin:3em 0 2em 0; + font-size:1em; + text-decoration:underline; +} +h3 { + text-align:left; + margin:1.5em 0 0.5em; } -h1 { margin: 2em 0; } -h2 { margin-top:1em; } p { margin: 1em 0; } a { color: #00a; } a:hover { color: #000; } a:visited { color: #a0a; } +blockquote { padding:1em; font-style:italic; } + +p { text-align:left; } + + /*****************************************************************************/ /* /* Home /* /*****************************************************************************/ .posts { + margin:0; + padding:0; list-style-type: none; margin-bottom: 2em; } .posts li { - line-height: 1.75em; + padding-bottom: .2em; } .posts span { @@ -48,6 +81,18 @@ a:visited { color: #a0a; } font-family: Monaco, "Courier New", monospace; } +/* sidebar */ +.sidebar { + position:fixed; + top:2em; + left:1em; + text-align:left; +} +.sidebar .meta { + text-align:left; +} + + /*****************************************************************************/ /* /* Site @@ -55,8 +100,9 @@ a:visited { color: #a0a; } /*****************************************************************************/ .site { - margin: 2em 8em 2em 2em; - max-width:800px; + margin: 2em auto 2em auto; + padding: 0 6em; + max-width: 800px; line-height: 1.5em; } @@ -93,6 +139,7 @@ a:visited { color: #a0a; } .meta { color: #aaa; + text-align:center; } .footer { @@ -148,6 +195,8 @@ a:visited { color: #a0a; } border: none; } +.post img { max-width:800px; } + /* terminal */ .post pre.terminal { border: 1px solid #000; diff --git a/index.html b/index.html index 43b8fb0..6d860a9 100644 --- a/index.html +++ b/index.html @@ -8,11 +8,11 @@ title: notes
    {% for post in site.posts %}
  • - {{ post.date | date_to_string }} - — {{ post.title }} + — + {{ post.date | date_to_string }}
  • {% endfor %}
- +
diff --git a/publish.sh b/publish.sh index 12091a3..138a90b 100755 --- a/publish.sh +++ b/publish.sh @@ -2,4 +2,5 @@ jekyll build +ssh quilime@quilime.com 'rm -rf /home/quilime/gabrieldunne-site/process' rsync -avz _site/ quilime@quilime.com:/home/quilime/gabrieldunne-site/process/ --delete -- 2.34.1