<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
    <channel>
    <title>Adhi Hargo . NET</title>
    <link>http://adhihargo.net/cms/</link>
    <description>My Weblog on Programming and Animation</description>
    <language>en-us</language>           
    <generator>Nucleus CMS v3.64</generator>
    <copyright>&#169;</copyright>             
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
        <url>http://adhihargo.net/cms//nucleus/nucleus2.gif</url>
        <title>Adhi Hargo . NET</title>
        <link>http://adhihargo.net/cms/</link>
    </image>
    <item>
    <title>WACOM Tablet in Dual-Monitor Ubuntu System</title>
    <link>xml-rss2.php?itemid=22</link>
    <description><![CDATA[<p>While I have a couple of monitors lying around, only recently do I play around with them, hooking an extra LCD monitor to my laptop. Though Ubuntu handles this arrangement without a hitch, a small problem is the mapping from graphic tablet to the screen. By default, full 8:5 tablet area will be mapped to the whole 32:9 (double widescreen) desktop, which skews cursor movement and makes sketching/painting difficult.</p>

<p>With a bit of reading manpages and trying out tools provided with Wacom driver, I found <code>xsetwacom</code> lets me get what I want: the usual 1:1 tablet-to-screen coordinate mapping in a multi-monitor GNU/Linux system. I haven't found any GUI-based application, though, so the following procedures are strictly terminal-bound.</p><h3>Setting tablet device parameters</h3>

<p class="first">First, we have to know the exact name Ubuntu recognize our device as. There are two commands we can use:</p>

<ul>
<li><code>xinput list</code> lists all X input devices. Tablet graphics are under <em>Virtual core pointer</em> category.</li>

<li><code>xsetwacom list dev</code> lists only devices handled by Wacom X input device driver. It's suffixed with general type of the device, like <em>STYLUS</em>, <em>ERASER</em> or <em>TOUCH</em>. For my purpose, I ignore anything other than <em>STYLUS</em> device.</li>
</ul>

<p>In my case, it's &quot;Wacom Bamboo 4x5 Pen&quot;. Knowing the device's name, we can then invoke</p>

<pre class="brush: bash">
xsetwacom get &quot;Wacom Bamboo 4x5 Pen&quot; PARAMETER
</pre>

<p>to get the value of the specified device's <code>PARAMETER</code>, or</p>

<pre class="brush: bash">
xsetwacom set &quot;Wacom Bamboo 4x5 Pen&quot; PARAMETER VALUE
</pre>

<p>to set the value of the device's <code>PARAMETER</code> to <code>VALUE</code>.</p>



<h3>Mapping tablet area to a screen</h3>

<p class="first">We need either one of these two parameters to accomplish our goal:</p>

<ul>
<li><p><code>Screen_No</code> (defaults to <code>-1</code>, all screen), confines cursor as controlled by the stylus to any of available screens, numbered from <code>0</code>. In other words, we can get undistorted tablet:screen mapping, at the cost of the tablet being usable in one screen only.</p></li>

<li><p><code>TwinView</code> (defaults to <code>none</code>). With possible values of <code>none</code>, <code>horizontal</code> and <code>vertical</code>, this option lets us use the tablet in all of our screens, one at a time. To change screen, simply move the cursor to current screen's edge closest to an adjacent screen, and the cursor will jump to the same position <span style="text-decoration: underline;">in that other screen</span>. The following graphics (screenshot taken from Monitor Preferences) illustrates how it works in my monitor setup:</p>

<p class="image"><img src="http://i1120.photobucket.com/albums/l488/Adhi_Hargo/wacomtwinviewillust.png" alt="" /></p>

<p>It's constrained to a particular axis of alignment, though. So if your monitors are not all aligned in one axis (L-shaped monitor setup? :), you may get a less than satisfying result.</p></li>
</ul>

<p>I use the second option, using TwinView, although that means I have to cope with occasional annoyance when I try to click something and accidentally move the cursor too close to the edge, or when a window/dialog pops up in a screen the tablet's not currently used in (GIMP's <em>New Document</em> dialog comes to mind).</p>



<h3>Set parameters on startup</h3>

<p class="first">A caveat on using <code>xsetwacom</code> directly is that all parameter settings will be lost when the computer's reset, or the device plugged out. The driver's parameters must be reset each time the computer starts. I use the simplest way to automate this task, using <code>bash</code>'s <code>~/.profile</code> or <code>~/.bash_profile</code> script executed for login shell. These are relevant lines in my <code>~/.profile</code> script:</p>

<pre class="brush: bash">
xsetwacom set &quot;Wacom Bamboo 4x5 Pen&quot; TwinView Horizontal
xsetwacom set &quot;Wacom Bamboo 4x5 Pen&quot; PressCurve &quot;80 0 70 100&quot;
</pre>

<p>(See next section for explanation of <code>PressCurve</code> parameter). I'm about to test using <code>udev</code> rules files or Ubuntu's own Upstart system to automatically set Wacom driver parameters, when need arrives, but this arrangement is good enough for me right now.</p>



<h3>Further options</h3>

<p class="first">There's quite a lot of other Wacom device parameters we can tinker with through <code>xsetwacom</code>. We can see a list of available parameters by invoking <code>xsetwacom list param</code>. One other that I found useful is:</p>

<ul>
<li><p><code>PressCurve</code> (defaults to <code>0 0 100 100</code>), handle coordinates that plot bezier curve for pen pressure, in a 100x100 cartesian graph. The default value puts each handle right at each endpoint, resulting in a linear curve. I'm currently trying <code>80 0 70 100</code> which makes low pressure stroke easier to make, and the tablet <em>feels</em> a bit more pressure-sensitive, when using GIMP:</p>

<img src="http://i1120.photobucket.com/albums/l488/Adhi_Hargo/wacomdevicepressure.png" alt="" />

<p>GUI-oriented users can more easily configure this parameter using <a href="http://gtk-apps.org/content/show.php/Wacom+Control+Panel?content=104309"><code>wacom-utility</code></a>, from the screenshot of which I get the graph above.</p></li>
</ul>

<p>I tried most other options, but none seems useful to me. I hope this writing's useful to you!</p>]]></description>
    <category>General</category>
    <comments>xml-rss2.php?itemid=22</comments>
    <pubDate>Mon, 12 Sep 2011 16:53:42 +0700</pubDate>
</item><item>
    <title>Mimpi yang Belum Padam</title>
    <link>xml-rss2.php?itemid=21</link>
    <description><![CDATA[<p>Hari ini setahun yang lalu, saya berangkat ke Jogja dengan sebuah keyakinan bahwa jika kita ingin mewujudkan impian diri sendiri, kita harus mampu mendukung perwujudan mimpi orang lain. Bahwa jika kita ingin menjadi besar, kita harus mau membantu orang lain untuk tumbuh besar bersama. Setahun kemudian, semua orang telah berproses lebih matang namun belum ada satupun impian yang berhasil saya bantu wujudkan. "Apa yang salah?" adalah satu pertanyaan utama di benak saya.</p><p>Baru saja malam tadi saya saksikan "Kung Fu Panda 2" bersama dua rekan, dan disadarkan dengan masih absennya sebentuk semangat di kalangan animasi tanah air: gairah untuk berdikari secara kreatif, merdeka dari belenggu ekonomi hubungan majikan-buruh. Adalah wajar jika dalam prosesnya tumbuh, sebuah perusahaan menerima job membantu eksekusi ide pihak lain. Tetapi jika ada studio yang sejak awal dibangun diproyeksikan menjadi 'buruh', melulu menjahitkan ide orang lain, harus kita pertanyakan "apakah itu pola pikir bangsa yang mengaku merdeka?".</p>
 
<p>Hubungan buruh dengan majikan, penyedia jasa dengan klien, akan selalu ada. Kita toh perlu mencari sesuap nasi ("... dan sekarung berlian", ada yang menambahkan). Di negara maju pun studio yang menerima subkontrak dan memberi layanan outsource adalah hal yang lumrah (terutama jika industri inti yang menciptakan produk orisinal sudah matang), namun hal itu tidak harus menjadi belenggu kreativitas. Yang mencemaskan adalah jika seluruh perusahaan distrukturkan agar dapat menjadi buruh yang efisien. Agar dapat menjadi babu yang baik. Macam orang yang badan dan pikirannya dipermak demi kebutuhan majikan. Merdeka-kah orang semacam itu?</p>
 
<p>Ya, kita mungkin telah merdeka, namun mental kita masih terjajah. Kesempatan emas untuk berprestasi gemilang terbentang di depan mata, tapi kita merasa sudah cukup dengan kepeng emas. Tim kreatif yang mulai solid kita pecah demi peningkatan kapasitas produksi. Proses eksplorasi yang bagus kita sudahi prematur demi memenuhi tenggat produksi. Lingkungan kreatif kita sumpal dan isolasi demi citra bona fide. Masuk akal dari segi bisnis, tapi kapan kita akan menghasilkan karya yang dapat kita banggakan, kalau begini caranya?</p>
 
<p>Setidaknya, pengalaman memburuh yang singkat ini memberi saya wawasan tentang kondisi seperti apa yang ingin saya capai sementara ini. Pertama, berkebalikan dengan adagium bisnis "Waktu adalah Uang", bidang kreatif lebih cocok dengan adagium "<b>Uang adalah Waktu</b>". Kita membutuhkan pendapatan secukupnya agar tidak perlu pusing tentang uang, juga agar dapat 'membeli' cukup waktu untuk berlatih dan bereksplorasi agar karya yang dihasilkan lebih optimal. Betapa banyak proyek yang rilis setengah jadi akibat keterbatasan modal, yang juga berarti keterbatasan waktu (selain mungkin manajemen waktu yang masih payah).</p>
 
<p>Kedua, sepertinya akan lebih baik jika sebuah studio dimulai oleh seseorang yang <b>berpengalaman berkecimpung di dunia animasi</b>. Seseorang yang jerih payahnya pernah dihadapkan langsung dengan tenggat waktu (agar ada tenggangrasa dengan anggota tim, tahu bahwa dikejar tenggat saja menegangkan, dan tambahan tekanan manajer bisa jadi justru menyebalkan), yang telah mengalami langsung alur produksi profesional (agar tidak berlama-lama meraba alur yang tepat), yang telah merasakan satu tim dengan rekan2 beragam kemampuan dan keterampilan (agar tahu skill apa saja yang diperlukan dan yang harus diperbaiki).</p>
 
<p>Cukup sekian keluh kesah saya. Seperti biasa, tidak ada siapapun yang dapat saya harapkan selain diri sendiri untuk mewujudkan cita-cita, dan sementara saya harus kembali melangkah sendiri. 17 Agustus 2011, teriring doa untuk rekan2 terdekat agar jiwa raga kita tetap merdeka, dan semakin merdeka.</p>]]></description>
    <category>General</category>
    <comments>xml-rss2.php?itemid=21</comments>
    <pubDate>Wed, 17 Aug 2011 06:46:08 +0700</pubDate>
</item><item>
    <title>Flexible Blender Installation for Linux System</title>
    <link>xml-rss2.php?itemid=19</link>
    <description><![CDATA[<p><em>&quot;Inspired&quot; by <a href="http://fossgrafis.com/">FOSSGrafis.com</a>, I think my posts here will be mainly in English from now on :D Though I still won't promote it...</em></p>

<p>With newer official and experimental versions keep on coming frequently, keeping up with Blender development maybe a bit overwhelming to some Blenderheads. Most, I believe, will use whatever latest Blender version available, but sometimes, some of our Blender project will rely on an experimental or obsolete feature of an older Blender version. Such a situation demands a flexible way for us to:</p>

<ul>
<li>Install whatever Blender version we like,</li>
<li>As many as we like,</li>
<li>Access all of them relatively easily,</li>
<li>Decide whichever version as default,</li>
<li>Works for a renderfarm network.</li>
</ul>

<p>Tough, eh? Not when your operating system is Linux.</p>
<h3>01. Symbolic and Hard Links</h3>

<p class="first">There's the kernel of our solution: links. Basically, a <a href="http://en.wikipedia.org/wiki/Symbolic_link">symbolic link</a> is just a shortcut, a reference to the name of another file in another location. The difference with Windoze's <code>.lnk</code> or freedesktop.org's <code>.desktop</code> <a href="http://en.wikipedia.org/wiki/File_shortcut">file shortcut</a> is that we can actually treat this referencing file like the real one, up to a point. &quot;Deleting or overwriting the actual file from a symbolic link?&quot;... not really. But we can open and execute a program from a symbolic link to it, and that's what really matters here.</p>

<p>A <a href="http://en.wikipedia.org/wiki/Hard_link">hard link</a>, to complement our understanding of links in general, is an additional directory entry for an <em>existing</em> file in the same filesystem. Symbolic links can contain arbitrary filename, even for non-existing filenames, in arbitrary partitions, but not so for a hard link.</p>

<p>One way to make a link to a file, is to use the following command, omitting <code>--symbolic</code> to create a hard link:</p>

<pre class="brush: plain">ln --symbolic TARGET LINK_NAME</pre>


<p>An arguably easier way to create a link is through a GUI, like using GNOME's file manager Nautilus where you only have to drag a file using middle mouse button to a destination and choose <strong>&quot;Link Here&quot;</strong>, as illustrated here:</p>

<img src="http://adhihargo.net/media/1/20110509-link.jpeg" width="500" height="458" alt="20110509-link.jpeg" title="20110509-link.jpeg" />


<h3>02. A <code>bin</code> in our own <code>home</code></h3>

<p><em>(Please excuse the lame section title :)</em></p>

<p>My experience of Linux distros being limited to some Debian-based ones, mainly Ubuntu, I observe that all new Ubuntu installation doesn't make a <code>home/USERNAME/bin</code> directory, for whatever <code>USERNAME</code> we're using. One less directory for a new user to care about is better, I guess.</p>

<p>But actually, <code>~/bin</code> is an easy way for us to install any program we like, without having to constantly shifting to root user. Fortunately, Ubuntu is prepared for this kind of program management, for this code exists in <code>~/.profile</code> (you can check for yourself):


<pre class="brush: bash">
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
</pre>
</p>

<p>Just create a <code>bin</code> directory in your home directory, and you're good to go. Just extract a particular version of Blender wherever you like, such as <code>/media/disk1/progs/blender-2.57-linux-glibc27-x86_64</code>, make a link to <code>blender</code> executable there in <code>~/bin</code>. So, an example installation scheme would be:</p>

<ul>
<li><code>~/bin/blender249b</code> linking to <code>/usr/bin/blender</code> (system-wide install).</li>
<li><code>~/bin/blender254</code> linking to <code>/media/disk1/progs/blender-2.54-linux-glibc27-x86_64/blender</code></li>
<li><code>~/bin/blender257</code> linking to <code>/media/disk1/progs/blender-2.57-linux-glibc27-x86_64/blender</code></li>
<li><code>~/bin/blenderCycles</code> linking to <code>~/bin/blender25_cycles/blender</code></li>
</ul>

<p>... with executable permission for each <code>~/bin/blender*</code> files.</p>



<h3>03. Executables naming and its effect to an existing system</h3>

<p class="first">Now, how will it affect any existing Blender installation? A short peek at the previous code snippet in <code>~/.profile</code> confirms that user's <code>bin</code> directory (<code>$HOME/bin</code>) is prioritized over all other preexisting search paths (<code>$PATH</code>). If you're installing Blender through the OS's standard software distribution line, like Ubuntu's Synaptic, it's likely that an invocation of the command &quot;<code>blender</code>&quot; will execute Blender 2.49b (the latest &quot;stable&quot; version up until recently, before 2.57).</p>

<p>Using the multiple links we've created in <code>~/bin/</code>, we can easily override that setting, such that clicking a <code>.blend</code> file will open it in any Blender version of our choosing: simply rename or copy one of those link files to <code>blender</code>!</p>

<p>Managing multiple Blender installations this way is applicable in a renderfarm setting, where absent graphical user interface, we can still extract Blender distribution archives and manage symbolic links through secure shell.</p>
]]></description>
    <category>Blender</category>
    <comments>xml-rss2.php?itemid=19</comments>
    <pubDate>Mon, 9 May 2011 20:37:37 +0700</pubDate>
</item><item>
    <title>Format Berkas Perantara untuk Komposit Render</title>
    <link>xml-rss2.php?itemid=18</link>
    <description><![CDATA[<p>Saya masih meraba-raba cara kerja paling efisien dan fleksibel untuk mengolah komposit gambar menggunakan Blender. Proses render+komposit yang terakhir saya jalankan cukup fleksibel, tapi masih jauh dari efisien. Untuk animasi di bawah 2 menit, data yang harus saya kelola (termasuk berkas-berkas perantara) mencapai 60GB, dan di-render seminggu lebih dengan 4-5 komputer. <em>Sangat</em> tidak efisien untuk alur produksi serial animasi sebuah studio kecil. Proses optimasi yang saya bahas di sini berfokus pada format gambar yang dihasilkan proses render, sebagai input proses komposit.</p>

<p>Seperti tulisan sebelumnya, saya masih meminta agar rekan-rekan mempertimbangkan penggunaan OpenEXR, tapi sekarang dengan sedikit <em>caveat</em>. Sebagai ilustrasi, berikut output perangkat <code>identify</code> (bagian dari <a href="http://www.imagemagick.org/">ImageMagick</a>), untuk berkas-berkas hasil render adegan yang sama dalam beberapa format:</p><pre>
adhi@thinkpadr61i-adh:~/Desktop
$ for i in cube.*; do identify $i; done
cube.exr EXR 960x540 960x540+0+0 16-bit DirectClass 3.813MiB 0.010u 0:00.000
cube.png PNG 960x540 960x540+0+0 8-bit DirectClass 124KiB 0.030u 0:00.040
cube.tga TGA 960x540 960x540+0+0 8-bit DirectClass 1.483MiB 0.070u 0:00.079
cube.tif TIFF 960x540 960x540+0+0 8-bit DirectClass 116KiB 0.000u 0:00.000
adhi@thinkpadr61i-adh:~/Desktop
$
</pre>

<p>Setiap file tersebut sama-sama didapatkan dari prosedur Save Render Result, tanpa diolah kompositor atau program lain. Terlihat bahwa format OpenEXR sebagaimana didukung Blender menyimpan citra dalam pita data yang lebih lebar (16-bit) ketimbang format lain, meski semua format gambar tersebut menyediakan varian sampai 32-bit linear. Pertanyaannya kemudian adalah, apakah keunggulan relatif OpenEXR ini sepadan dengan hasil yang diinginkan? Untuk proyek-proyek yang telah dan akan kami tangani dalam waktu dekat ini, sepertinya belum. Kami belum menangani efek visual dan tidak mengejar kualitas visual realistik, apa lagi jika ia membuat proses pasca-produksi menghabiskan waktu terlalu lama.</p>

<p>Akhirnya setelah ditimbang-timbang, untuk proyek animasi selanjutnya sepertinya TARGA/TIFF/PNG sudah memadai :) OpenEXR akan tetap digunakan saat perlu Z-index, karena percobaan menyimpan Z-depth dalam format lain sering gagal (terjadi clipping). Berikut pemecahan render pass yang baru saya coba:</p>

<p class="image"><img src="http://adhihargo.net/media/1/20110502-renderpasses.png" width="565" height="698" alt="20110502-renderpasses.png" title="20110502-renderpasses.png" /></p>

<p>Untuk mayoritas render pass yang diperlukan, format output adalah TARGA. Patokan saya saat ini, bila informasi yang diperlukan bersifat visual (dapat langsung terlihat lewat penampil gambar biasa) dan tidak perlu <em>dynamic range</em> lebar, TARGA cukup aman untuk digunakan. Contohnya pass vektor normal (<em>kiri</em>), yang dapat digunakan untuk menciptakan pencahayaan semu <span style="text-decoration: underline;">setelah</span> proses render (<em>kanan</em>):</p>

<p class="image"><img src="http://adhihargo.net/media/1/20110502-postrender_lighting.png" width="969" height="552" alt="&lt;img src=&quot;postrender_lighting.png&quot; alt=&quot;&quot; /&gt;" title="&lt;img src=&quot;postrender_lighting.png&quot; alt=&quot;&quot; /&gt;" /></p>

<p>Di sisi lain, untuk informasi citra yang bersifat non-visual seperti vektor kecepatan atau informasi visual yang perlu <em>dynamic range</em> lebar, OpenEXR tetap pilihan yang paling aman untuk mempertahankan presisi/detail informasi. Contohnya pass faktor kabut yang mengalami efek pita karena berkurang jauh presisinya, saat disimpan dalam format TARGA (<em>kanan</em>) ketimbang format OpenEXR (<em>kiri</em>):</p>

<p class="image"><img src="http://adhihargo.net/media/1/20110502-exr_vs_tga.png" width="976" height="557" alt="&lt;img src=&quot;exr_vs_tga.png&quot; alt=&quot;&quot; /&gt;" title="&lt;img src=&quot;exr_vs_tga.png&quot; alt=&quot;&quot; /&gt;" /></p>

<p>Saya baru tahu bahwa prosedur pemisahan komponen render seperti ini umum digunakan studio animasi dan efek visual saat membaca buku Lee Lanier, <em>&quot;Professional Digital Compositing&quot;</em>, dalam bab mengenai render CG. Hanya saja masih perlu eksperimen sendiri untuk mengetahui sampai mana ia dapat diterapkan dalam alur produksi berbasis software open source.</p>

<p>Sudah tersiar kabar, bahwa proyek terbuka Blender Institute selanjutnya akan berfokus mengasah kemampuan Blender di bidang efek visual. Mungkin kita dapat berharap, selepas proyek ini, Blender dapat memanfaatkan kemampuan maksimal masing-masing format gambar. Dengan implementasi Blender yang sudah ada, saya mulai mendapat gambaran, apa kira-kira format file yang tepat untuk hasil render terbaik: format OpenEXR untuk <span style="text-decoration: underline;">pass render non-visual</span> dan <span style="text-decoration: underline;">citra <em>high dynamic range imaging</em></span>, dan format lain (terutama TARGA/TIFF/PNG) untuk pass visual yang <span style="text-decoration: underline;">tidak perlu presisi tinggi</span>.</p>
]]></description>
    <category>Blender</category>
    <comments>xml-rss2.php?itemid=18</comments>
    <pubDate>Mon, 2 May 2011 10:14:45 +0700</pubDate>
</item><item>
    <title>Komposit Video dalam Blender dan Efisiensi Tahap Pasca-Produksi</title>
    <link>xml-rss2.php?itemid=17</link>
    <description><![CDATA[<p>Dua-tiga hari ke depan, tahap pasca-produksi pembuatan video pembukaan serial <a href="http://dagelanbakoel.blogspot.com/">Dagelan Bakoel</a> akan selesai. Sambil menunggu proses render beberapa cut terakhir (yang paling lama), saya ceritakan saja sedikit pengalaman terkait tahap ini, terutama pada proses render dan video-compositing.</p><h3>Format Output Render: OpenEXR</h3>

<p class="first">Render dilakukan dalam dua tahap, yang pertama menghasilkan deretan gambar dalam format OpenEXR, dan yang kedua (untuk koreksi warna, tweaking hasil render, dan menambah beberapa efek lensa dan cahaya) menghasilkan video dalam format AVI Raw. Penggunaan OpenEXR mungkin perlu sedikit diberi justifikasi, meski sudah umum digunakan, karena ternyata masih ada studio yang menggunakan format-format lama seperti Truevision TGA (TARGA) dan PNG.</p>

<p><a href="http://www.openexr.com/">OpenEXR</a> adalah format gambar raster yang dikembangkan oleh Industrial Light &amp; Magic, anak perusahaan Lucasfilm Ltd. yang bergerak di bidang efek visual. Perbedaan utama OpenEXR dibanding format gambar umum lainnya adalah perekaman informasi per-pixel sebagai nilai floating-point, sehingga mampu menyimpan <em>dynamic range</em><sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> jauh lebih lebar dan warna lebih presisi ketimbang format gambar yang menggunakan integer. Bagi yang gemar akan detail-detail seperti ini, <a href="http://www.openexr.com/TechnicalIntroduction.pdf">dokumen ulasan teknis OpenEXR</a> berisi lebih banyak data menarik.</p>

<p>Blender sendiri telah mendukung format ini <a href="http://www.blender.org/development/release-logs/blender-242/high-dynamic-range-graphics/">sejak versi 2.42</a>. Sampai versi 2.57, fasilitas khusus OpenEXR yang dimanfaatkan Blender adalah dukungannya terhadap berbagai format kompresi dan jumlah kanal gambar yang tidak terbatas.</p>

<p>Kanal gambar ekstra dalam output Blender berformat OpenEXR adalah Z-Buffer. Kanal ini menyimpan informasi kedalaman dalam satuan Blender Unit, yang dapat diekstrak kembali untuk keperluan alpha-mask dan beberapa efek lensa seperti <em>depth of field</em>. Sebagaimana saya perlihatkan berikut ini, kanal Z-Buffer dari file gambar OpenEXR dapat dikonversi menjadi peta kedalaman dengan memperkecil Z-index (di sini saya bagi 1000) dan mengubah nilai integernya menjadi citra grayscale:</p>

<img src="http://adhihargo.net/media/1/20110418-openexr01.png" width="500" height="402" alt="Kanal Z-Buffer dalam file OpenEXR" title="Kanal Z-Buffer dalam file OpenEXR" />

<p>Setidaknya sekali, saya memanfaatkan kanal Z-Buffer dalam file hasil render ini. Saat itu, layer render yang seharusnya hanya berisi karakter di depan kamera, ternyata ditambahi seorang rekan dengan objek lain di belakangnya. Dengan konfigurasi node hampir seperti ilustrasi di atas, saya kemudian dapat membuat filter untuk mengisolasi dan menghilangkan objek selain yang berada dekat dengan kamera, sehingga proses render tidak perlu diulang.</p>



<h3>Render Layer</h3>

<p class="first">Memisahkan satu gambar menjadi beberapa lapis dapat memberi kita kendali lebih besar terhadap hasil akhir, dan (sampai batas tertentu) dapat pula membantu mempercepat proses render. Saya ambil contoh salah satu cut dalam video pembukaan Dagelan Bakoel, berikut:</p>

<img src="http://adhihargo.net/media/1/20110418-compose01.png" width="500" height="380" alt="Contoh komposit lapisan render dalam satu cut adegan." title="Contoh komposit lapisan render dalam satu cut adegan." />

<p>Gambar pada cut ini, di tengah, saya pisahkan menjadi empat lapis render. Lapisan latar belakang, kanan atas, adalah lapisan dengan waktu render yang cukup lama karena banyaknya pepohonan dengan jumlah mesh tinggi. Kamera tidak bergerak, sehingga saya dapat merender lapisan latar ini satu frame saja, alih-alih ratusan frame, dan menggunakan satu frame tersebut di sepanjang cut.</p>

<p>Tiga elemen gambar lain, yaitu jalan, karakter dan gerobak, saya pisahkan untuk keperluan penguatan bayangan. Konfigurasi bayangan untuk ketiga komponen gambar tersebut berlainan, sehingga harus saya urai ke dalam lapisan-lapisan render terpisah.</p>

<p>Masih banyak teknik komposit video lain untuk meningkatkan efisiensi produksi tanpa mengorbankan kualitas hasil, yang sepenuhnya memanfaatkan solusi perangkat open source (Blender, OpenEXR, Gimp). Meski sebagian besar teknik tersebut membutuhkan familiaritas dengan masing-masing perangkat, rata-rata masih kurang terdokumentasi. Beberapa tulisan mendatang yang tengah saya susun akan mendokumentasikan satu persatu trik komposit sederhana yang saya gunakan.</p>

<hr />
<p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a>  Rasio antara intensitas cahaya paling terang dan yang paling redup dalam sebuah gambar.</p>
]]></description>
    <category>Animation</category>
    <comments>xml-rss2.php?itemid=17</comments>
    <pubDate>Mon, 18 Apr 2011 16:09:55 +0700</pubDate>
</item><item>
    <title>Material, UV Unwrapping, Texturing dan Decal di Blender 2.5</title>
    <link>xml-rss2.php?itemid=16</link>
    <description><![CDATA[<p><em>Tulisan berikut sekadar saya duplikasi dari <a href="http://blenderindonesia.org/forum/viewtopic.php?f=28&t=777">Forum Blender Indonesia</a>, siapa tahu jadi lebih banyak yang bisa memanfaatkan.</em></p>

<p>Tulisan ini saya tujukan untuk sesama pemula Blender 2.5, tentang dasar2 material di Blender 2.5. &quot;Sesama&quot;, karena saya sendiri juga pemula dan menuliskan tutorial ini sembari membiasakan diri menggunakan Blender 2.5.</p>

<p>Selain Blender 2.5, kita juga akan menggunakan GIMP, sekalian saya belajar editor gambar ini.</p>
<h3>Material</h3>

<p class="first">Saya mulai dari kubus polos. Agar tutorial ini tidak membosankan bagi saya yang menulis, atau bagi Anda yang membaca dan mencoba, ada baiknya kita utak-utik sedikit. Saya pilih bentuk awal peti kayu saja:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss00.jpeg" alt="" /></p>

<p>Sambil objek peti kayu terpilih, masuk ke tab Material. Kita buat material baru, saya beri nama <strong>Kayu</strong>:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss01.jpeg" alt="" /></p>

<p>Selanjutnya, kita ubah sebentar layout jendela menjadi layout &quot;UV Editing&quot;. Mulai bagian ini nih, yang saya dulu nggak ngerti2:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss02.jpeg" alt="" /></p>



<h3>UV Unwrapping</h3>

<p class="first">UV Unwrapping, seperti namanya, seperti seakan &quot;membuka bungkusan&quot;, membuat sistem koordinat datar/planar (UV) dari sistem koordinat volumetrik (XYZ). Langkah pertama <em>unwrapping</em> adalah dengan menentukan posisi jahitan (<em>seam</em>) yang akan dibuka saat objek diratakan.</p>

<p>Ubah modus pemilihan mesh menjadi modus Edge &lt;Ctrl-Tab -&gt; 2&gt;. Pilih sisi-sisi pojok peti yang akan ditandai sebagai lokasi jahitan; pakai &lt;Alt-RClick&gt; untuk memilih lebih dari satu edge:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss03.jpeg" alt="" /></p>

<p>Perlu sedikit imajinasi dalam menentukan garis2 jahitan, membayangkan wujud planar objek setelah proses <em>unwrap</em>. Setelah selesai, pilih seluruh objek (&lt;A&gt;) lalu jalankan perintah menu Mesh -&gt; UV Unwrap -&gt; Unwrap:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss04.jpeg" alt="" /></p>

<p>Di jendela UV/Image Editor akan terlihat vertex2 objek terpilih dalam sistem koordinat UV. Anda bisa rapikan posisi setiap vertex; saya sendiri memilih hanya memutarnya sampai sisi panjang objek melintang horizontal. Pada tahap ini, saya simpan file .blend. Kebiasaan saya menambahkan indeks &quot;000&quot; di akhir nama file, agar saat menyimpan progresi hasil kerja saya selanjutnya, saya dapat menekan tombol &lt;+&gt; untuk menambahkan 1 pada indeks tersebut dan nama semua file tetap seragam:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-sssave.jpeg" alt="" /></p>

<p>Agar mudah melukis tekstur dalam editor eksternal, kita simpan layout UV ini dengan menjalankan perintah menu UVs -&gt; Export UV Layout. Pilih nama file, dan simpan:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss05.jpeg" alt="" /></p>

<p>Kita pindah ke GIMP dulu, sementara...</p>



<h3>GIMPing!</h3>

<p class="first">Dalam GIMP, buka file layout UV tadi. Karena berformat vektor SVG, GIMP membuka menu render untuk konversi ke format bitmap. Pilih resolusi yang diinginkan:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss06.jpeg" alt="" /></p>

<p>Pilih perangkat Bucket Fill &lt;Shift-B&gt;, ubah Fill Type menjadi Pattern fill. Buat layer baru di bawah layer layout UV, layer ini akan berisi pola paling dominan dalam tekstur. Dengan layer baru ini aktif, &lt;LClick&gt; di manapun dalam kanvas untuk membanjiri kanvas dengan pola kayu bingkai:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss07.jpeg" alt="" /></p>

<p>Berikutnya kita tentukan pola tekstur kayu penutup. Untuk memilih bidang tekstur tersebut saya gunakan Scissor Select Tool &lt;I&gt;, perangkat seleksi yang secara otomatis memilih jalur seleksi berdasarkan kontras tepian (hanya karena ini favorit saya, Anda bebas memakai perangkat seleksi yang lain, seperti Rectangle Select. Lha cuma kotak, ini...). &lt;LClick&gt; di keempat penjuru setiap bidang kayu penutup, lalu tekan &lt;Shift-Enter&gt; untuk menambahkan ke hasil seleksi sebelumnya. Ulang sampai semua bidang kayu penutup terpilih:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss08.jpeg" alt="" /></p>

<p>Untuk pola tekstur kedua ini kita bisa kembali menggunakan Bucket Fill, tapi karena iseng saya pakai saja Clone Tool &lt;C&gt;. Setelah memilih kuas yang berukuran cukup besar, dan menentukan pola tekstur kayu yang akan di-clone, sapukan kuas. Sesuai kebutuhan, Anda bisa melakukannya dalam layer yang sama dengan kayu bingkai, atau seperti saya, menggunakan layer baru. Karena seleksi tengah aktif, clone tekstur hanya akan diaplikasikan ke dalam bidang yang tengah terseleksi:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss09.jpeg" alt="" /></p>

<p>Dalam gambar di atas terlihat bahwa pola layout UV saya sembunyikan, karena pada tahap ini ia tidak diperlukan lagi. Setelah modifikasi kembali sesuai kebutuhan, simpan gambar ini dalam format PNG:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss10.jpeg" alt="" /></p>



<h3>UV Texturing</h3>

<p class="first">Kembali ke Blender, kita kembali dulu ke layout jendela Default. Dalam tab editor Texture, buat tekstur baru bertipe &quot;Image or Movie&quot;. Dalam group Image, pilih nama file PNG yang kita buat menggunakan GIMP. Dalam group Image Mapping, pilih cara ekstensi Clip karena kita hanya perlu tekstur ini dalam wilayah yang sudah ditentukan. Terakhir, pilih metode pemetaan UV di group Mapping:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss11.jpeg" alt="" /></p>

<p>Bila kita render scene ini &lt;F12&gt;, akan terlihat hasil kerja kita:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ssr01.jpg" alt="" /></p>

<p>Felicitación y celebración! Akhirnya kita berhasil juga memberi tekstur pada objek...</p>



<h3>Decal</h3>

<p class="first">... tapi tutorial ini belum selesai. Peti kayu ini akan digunakan untuk mengangkut bahan kimia beracun (cuekin saja, meski tidak masuk akal), dan perlu kita beri decal/stiker peringatan. Decal bisa saja digambar langsung pada file tekstur yang baru saja kita buat, tapi karena saya senang membuat yang mudah jadi sulit, kita akan menempatan tekstur decal berbasis objek eksternal. Pertama, saya pilih sisi objek yang membelakangi kamera, lalu membuat duplikat material terpisah (<strong>Kayu.001</strong>) untuk sisi tersebut, alasannya akan saya jelaskan nanti:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss12.jpeg" alt="" /></p>

<p>Dengan material asli (<strong>Kayu</strong>) terpilih, kita masuk ke tab Texture, lalu buat tekstur gambar baru, berisi gambar decal yang akan ditampilkan. Anda bisa dapatkan gambar decal yang saya gunakan <a href="/writings/blender/bdm/toxic.png%20">di sini</a>. Setting yang signifikan dalam tab ini adalah <em>clip image</em> (agar gambar tidak diperluas), dan <em>premultiply alpha</em> (nilai RGB dikalikan dulu dengan nilai Alpha, untuk memperhalus efek transparansi):</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ss13.jpeg" alt="" /></p>

<p>Dengan setting decal di atas kita dapatkan hasil render berikut (Anda mungkin perlu mengubah ukuran objek Empty):</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ssr02.jpg" alt="" /></p>

<p>Pemetaan tekstur berdasarkan objek eksternal menggunakan skala dan koordinat lokal objek tersebut untuk menentukan skala, lokasi dan orientasi tekstur. Dalam setting normal, tekstur decal selalu menghadap searah sumbu Z positif, sumbu X dan sumbu Y menjadi orientasi horizontal dan vertikal, secara berturutan. Sayangnya, cara ini memiliki satu kelemahan. Bila kita geser kamera agar melihat sisi bawah peti, kita dapatkan:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ssr03.jpg" alt="" /></p>

<p>Saya tidak tahu apa namanya (&quot;pokoknya kebalik, deh&quot;?), maka saya sebut saja <span style="text-decoration: underline;">proyeksi negatif</span> karena dihasilkan dari proyeksi tekstur searah sumbu Z negatif.</p>

<p>Karakteristik pemetaan tekstur berbasis objek eksternal ini membuatnya hanya cocok untuk scene statik, kecuali bila sisi belakang menggunakan material yang tidak memuat tekstur decal (ini fungsi material duplikat, tadi). Coba putar objek Empty sampai panah sumbu Z-nya membelakangi area yang kita beri material duplikat, sebelumnya. Kita dapatkan render seperti ini:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-uv-unwrapping-ssr04.jpg" alt="" /></p>

<p>dan bila kamera melihat sisi belakang peti, proyeksi negatif decal tidak lagi ditemukan. Decal bisa menjadi solusi penempatan material yang fleksibel dan mudah dianimasikan, sepanjang kita telah mengantisipasi proyeksi negatif.</p>

<p>Semoga tutorial ini bermanfaat :)</p>



<h3>Referensi</h3>


<ul>
<li>BlenderCookie.com - <a href="http://www.blendercookie.com/2010/05/19/tip-placing-decals-with-empties">Tip: Placing Decals with Empties</a></li>
</ul>
]]></description>
    <category>Blender</category>
    <comments>xml-rss2.php?itemid=16</comments>
    <pubDate>Mon, 18 Apr 2011 01:32:00 +0700</pubDate>
</item><item>
    <title>Pemodelan Tali/Jaring Menggunakan Kurva di Blender 2.5</title>
    <link>xml-rss2.php?itemid=15</link>
    <description><![CDATA[<p><em>Tulisan berikut sekadar saya duplikasi dari <a href="http://blenderindonesia.org/forum/viewtopic.php?f=27&amp;t=784">Forum Blender Indonesia</a>, siapa tahu jadi lebih banyak yang bisa memanfaatkan.</em></p>

<p>Tulisan ini saya tujukan untuk sesama pemula Blender 2.5, tentang pengeditan kurva di Blender 2.5. &quot;Sesama&quot;, karena saya sendiri juga pemula dan menuliskan tutorial ini sembari membiasakan diri menggunakan Blender 2.5.</p><h3>Pengeditan Kurva</h3>

<p class="first">Pertama, buat objek kurva bezier baru dalam 3D View &lt;Shift-A&gt;. Putar 90 derajat pada sumbu X &lt;R -&gt; X -&gt; 90&gt;, agar kurva tersebut berada dalam bidang koordinat X-Z. Masuk ke modus Edit &lt;Tab&gt;, lalu atur agar kedua nodus bezier kurva berjarak tepat 1 BU (Blender Unit), dan handle keduanya miring tepat 45 derajat. Jarak dan kemiringan ini hanya agar langkah2 selanjutnya lebih mudah; Anda boleh pakai sudut kemiringan lain.</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss01.jpeg" alt="" /></p>

<p>Bagaimana cara agar yakin bahwa jarak2 yang kita gunakan tepat? Dua fitur Blender dapat kita gunakan:</p>


<ul>
<li>Tekan dan tahan &lt;Ctrl&gt; saat mengubah apapun, untuk membatasi besar perubahan tersebut dalam interval tertentu. Untuk modifikasi objek 3D, besar interval tergantung pada ukuran grid terkecil yang terlihat pada 3D View.</li>
<li>Snap Selection to Grid &lt;Shift-S -&gt; 1&gt; akan meletakkan objek apapun yang tengah terpilih pada grid. Garis grid yang digunakan pun bergantung pada ukuran grid terkecil yang terlihat pada 3D View.</li>
</ul>


<p>Langkah selanjutnya, perpanjang kurva sesuai kebutuhan, dengan cara menekan &lt;Ctrl-LClick&gt; setiap 1 BU. Ukuran tersebut dapat dipastikan tepat dengan memanfaatkan perintah Snap Selection to Grid:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss02.jpeg" alt="" /></p>

<p>Pilih semua handle untuk sebagian nodus bezier baru tersebut, lalu geser sehingga membentuk gelombang sebagaimana nodus2 pertama (tetap gunakan snap):</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss03.jpeg" alt="" /></p>

<p>Pindah ke pandangan dari atas &lt;Numpad-7&gt;, buat duplikat link &lt;Alt-D&gt; kurva tersebut dan letakkan bersebelahan dalam jarak 1 BU (sejauh jarak antar lekukan pada kurva). Putar kurva duplikat tersebut 180 derajat pada sumbu sejajar kurva (sumbu X). Buat pula duplikat link keduanya dalam posisi tegak lurus:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss04.jpeg" alt="" /></p>

<p>Dari situ, menyelesaikan bentuk jaring sangatlah mudah: buat duplikat link kedua kurva yang bersebelahan, dan letakkan satu-persatu bersebelahan dalam jarak 2 BU. Untuk memberi wujud padat pada semua kurva tersebut (dalam tahap ini kurva masih belum dapat di-render), ubah setting geometri kurva:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss05.jpeg" alt="" /></p>




<h3>Keterampilan Pramuka</h3>


<p>Bila tombol &quot;3D&quot; dalam setting Shape kurva aktif (kurva bezier diperbolehkan berada dalam ruang 3D), kita dapat membuat simpul di ujung kurva agar setiap duplikat terlihat seakan saling mengikat (kemiringan handle semua nodus bezier mungkin juga harus diperkecil). Saya variasikan dengan membuat dua duplikat terpisah dan menjadikan mereka tali tepian jaring:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss06.jpeg" alt="" /></p>



<h3>Deformasi Jaring</h3>

<p class="first">Buat sebuah lattice, dan dalam <span style="text-decoration: underline;">modus Objek</span> buat agar ia seukuran dengan objek jaring (lattice yang diubah dalam modus Edit akan membuat objek target &quot;melompat&quot; saat modifier Lattice diterapkan). Untuk mempermudah deformasi, saya terbiasa menggunakan lattice satu lembar (ketebalan pada sumbu W = 1):</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss07.jpeg" alt="" /></p>

<p>Di antara beberapa solusi jika kita ingin mendeformasi jaring menggunakan objek lattice, saya biasa memilih cara paling sederhana, yaitu mengubahnya dulu menjadi mesh. Ubah semua kurva menjadi mesh &lt;Alt-C&gt;, gabungkan menjadi satu objek &lt;Ctrl-J&gt;, lalu beri modifier Lattice. Sebelum langkah terakhir ini, mungkin Anda ingin terlebih dahulu mengurangi jumlah vertex objek jaring menggunakan modifier Decimate (saya sendiri menggunakan nilai decimate 0.5, menyisakan separuh dari keseluruhan jumlah verteks awal). Lattice siap dideformasi:</p>

<p class="image"><img src="/writings/blender/bdm/bdm-modeling-jaring-ss08.jpeg" alt="" /></p>


<p>Semoga tutorial ini bermanfaat :)</p>
]]></description>
    <category>Blender</category>
    <comments>xml-rss2.php?itemid=15</comments>
    <pubDate>Sat, 16 Apr 2011 01:16:00 +0700</pubDate>
</item><item>
    <title>Tutorial Lama</title>
    <link>xml-rss2.php?itemid=14</link>
    <description><![CDATA[<p>Sebenarnya tutorial-tutorial ini sudah sangat lama, membahas versi Blender yang sudah relatif tertinggal (Blender 2.42 - 2.49b). Tapi kelihatannya masih bermanfaat, maka saya tampilkan lagi link ke keduanya (filenya sendiri nggak kemana-mana, sih...):</p><h3>Animasi Non-Linear dalam Blender</h3>

<p class="first">Tutorial pendek menggunakan fitur NLA Blender. Pembahasan dimulai dari kanvas kosong sampai jadi animasi (nggak jelas). [</p>

<p>(<a href="/writings/blender/nla01.pdf">PDF</a>, <a href="/writings/blender/nla01_msmp4.avi">hasil</a>)</p>


<h3>Kombinasi Animasi 3D dan Still 2D dengan Video Sequence Editor</h3>

<p class="first">Tulisan semi-tutorial yang membahas tahap-demi-tahap pembuatan animasi yang menggabungkan elemen 3D dan 2D dengan fasilitas Video Sequence Editor milik Blender (yang semakin canggih saja...).</p>

<p>(<a href="/writings/blender/openseq01.pdf">PDF</a>, <a href="/writings/blender/openseq01_msmp4.avi">hasil</a>)</p>


<h3>Pemodelan Presisi</h3>

<p class="first">Screencast pemodelan meja, tujuan utama membuatnya adalah memperlihatkan fasilitas-fasilitas dasar dalam Blender yang membantu pemodelan dengan skala yang relatif presisi (<a href="/writings/blender/MejaSederhana.swf">SWF</a>)</p>

<p><em>Have fun!</em></p>]]></description>
    <category>Blender</category>
    <comments>xml-rss2.php?itemid=14</comments>
    <pubDate>Wed, 13 Apr 2011 20:14:57 +0700</pubDate>
</item><item>
    <title>Layanan Renderfarm NumpangRender</title>
    <link>xml-rss2.php?itemid=12</link>
    <description><![CDATA[<p>Sudah ada yang tahu layanan renderfarm berbasis Blender, namanya <strong><em>NumpangRender</em></strong>? Saya tengah mencobanya untuk proyek profesional pertama saya di bidang animasi, dan hasilnya cukup memuaskan. Tidak banyak yang dibutuhkan untuk memanfaatkan layanan ini, hanya beberapa komputer yang terhubung melalui jaringan, cara membagi file .blend ke masing-masing komputer &quot;slave&quot;, dan cara komputer &quot;master&quot; mengendalikan dan memulai proses render pada setiap &quot;slave&quot;.</p>
<a href="xml-rss2.php?imagepopup=1/20110412-numpang_render1.png&amp;width=1366&amp;height=768&amp;imagetext=GAMBAR%3A+Contoh+sesi+render+dengan+4+%28empat%29+komputer+%26quot%3Bslave%26quot%3B." onclick="window.open(this.href,'imagepopup','status=no,toolbar=no,scrollbars=no,resizable=yes,width=1366,height=768');return false;" >GAMBAR: Contoh sesi render dengan 4 (empat) komputer &quot;slave&quot;.</a>

<h3>Distribusi File .blend</h3>

<p class="first">Mendengar kata &quot;distribusi&quot;, yang terpikir pertama di benak Anda pasti &quot;mengirim&quot; file. Teknik itu pula yang pertama saya kira <em>harus</em> dilakukan saat mulai mempelajari sistem render terdistribusi. Ternyata tidak harus demikian, karena ada banyak teknologi yang dapat kita gunakan untuk membagi file melalui jaringan. Meski pernah mencoba berbagi file menggunakan <a href="http://fuse.sourceforge.net/sshfs.html">sshfs</a> dan <a href="http://nfs.sourceforge.net/">nfs</a>, tapi sejauh ini saya merasa implementasi <em>file-sharing</em> yang paling mudah digunakan adalah menggunakan <a href="http://www.samba.org/samba/smbfs/">smbfs</a> dari paket Samba.</p>

<p>Dalam renderfarm konvensional, mungkin kedua cara yang saya coba sebelumnya itu lebih tepat untuk diterapkan. Saya memilih Samba terutama karena telah digunakan terlebih dahulu oleh rekan-rekan di studio, sehingga tidak perlu memperrumit infrastruktur produksi yang sudah ada. Pun pengoperasiannya tidak memerlukan keterampilan teknis khusus seperti solusi berbagi file lain.</p>



<h3>Eksekusi Tugas Render</h3>

<p class="first">Untuk mengeksekusi tugas render, diperlukan cara untuk mengakses setiap komputer &quot;slave&quot;. Cara yang saya gunakan adalah menggunakan <em><a href="http://en.wikipedia.org/wiki/Secure_Shell">secure shell</a></em>. Jika komputer &quot;slave&quot; yang dituju sudah me-mount direktori file .blend, proses render dapat dilakukan dari &quot;master&quot; seakan-akan tengah memproses file lokal. Proses render harus dilakukan <a href="?itemid=11">melalui baris perintah</a>, karena koneksi SSH saja tidak dapat mengakses konteks grafis yang diperlukan untuk menciptakan antarmuka grafis Blender yang familiar. Berikut contoh sesi render dengan NumpangRender:</p>

<pre class="brush: plain;">
cleo@cleo05-desktop:~$ ssh renderer@192.168.1.104
renderer@192.168.1.104's password:
Linux renderer-cleomotion 2.6.35-25-generic #44-Ubuntu SMP Fri Jan 21 17:40:48 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/

134 packages can be updated.
65 updates are security updates.

Last login: Sat Apr  9 10:11:32 2011 from cleo05-desktop.local
renderer@renderer-cleomotion:~$ cd /home/renderer/.gvfs/cakruk\ on\ cleo05-desktop/set/
renderer@renderer-cleomotion:~/.gvfs/cakruk on cleo05-desktop/set$ \
> blender -t 1 -b 01.35.blend -S image -a > /dev/null
Starting output to /tmp/01.350025_0121.mp4(ffmpeg)...
  Using type=2, codec=2, audio_codec=86016,
  video_bitrate=6000, audio_bitrate=128,
  gop_size=15, multiplex=0, autosplit=0
  render width=720, render height=576
Using global header
Writing frame 25, render width=720, render height=576
Video Frame PTS: 0
</pre>


<h3>Toleran Pada Pengguna Komputer &quot;Slave&quot;</h3>

<p class="first">Perhatikan opsi <code>-t</code> pada contoh eksekusi Blender di atas, karena ini merupakan karakteristik unik renderfarm NumpangRender. Namanya saja menumpang render, tentu bukan kita pengguna utama setiap komputer &quot;slave&quot;. Opsi <code>-t</code> saya pakai untuk membatasi jumlah thread (+/- ekivalen dengan jumlah core CPU) yang digunakan saat render. Saat komputer &quot;slave&quot; tengah digunakan kerja, biasanya saya hanya menggunakan 1 core untuk render (semua komputer produksi di sini adalah quad-core). Kalau sekadar digunakan baca Kaskus atau Facebook-an, saya pakai 2-3 core, dan begitu ditinggal pergi saya pakai seluruh beban prosesor.</p>

<p>Pemanfaatan komputer &quot;slave&quot; seperti ini membutuhkan komunikasi dan pemantauan manual, agar pemakai utama setiap komputer &quot;slave&quot; tidak merasa terganggu dengan kita yang sedang NumpangRender.</p>

<p>Demikian deskripsi singkat mengenai sistem renderfarm yang tengah saya gunakan, yang dengan kualitas hasil render yang ingin dicapai sekarang, adalah sistem yang cukup efektif memanfaatkan sumberdaya yang ada. Mungkin begitu dibutuhkan kualitas gambar yang jauh lebih tinggi kami mulai menggunakan sistem renderfarm terdedikasi (yang harus lebih terotomatisasi), namun saat ini NumpangRender sudah memadai.</p>
]]></description>
    <category>General</category>
    <comments>xml-rss2.php?itemid=12</comments>
    <pubDate>Tue, 12 Apr 2011 01:37:07 +0700</pubDate>
</item><item>
    <title>Menjalankan Proses Render Secara Offline</title>
    <link>xml-rss2.php?itemid=11</link>
    <description><![CDATA[<p>Menyambung <a href="?itemid=9">tulisan saya minggu lalu</a>, kali ini saya akan sedikit membahas beberapa komponen proses render yang dapat kita kendalikan secara offline (melalui baris perintah). Pendeknya tulisan ini bukan berarti hanya sedikit hal yang dapat kita lakukan di Blender melalui script Python.</p><p>Dengan API Python Blender seluruh data kontekstual Blender dapat diakses melalui modul <code>bpy.context</code>, termasuk objek Scene aktif dalam variabel <code>bpy.context.scene</code>. Objek tersebut, seperti semua objek bertipe <code>bpy.types.Scene</code> memiliki atribut <code>render</code> bertipe <code>bpy.types.RenderSettings</code>, dan lewat atribut inilah kita dapat mengubah konfigurasi hasil render.</p>

<p>Melihat <a href="http://www.blender.org/documentation/250PythonDoc/">rincian atribut</a> <code>bpy.types.RenderSettings</code> dapat kita lihat berbagai komponen proses dan hasil render yang dapat kita utak-utik, mulai dari resolusi dan format gambar, sampai jumlah thread yang digunakan untuk render. Karena sedemikian mudahnya mengakses semua setting tersebut, saya tidak akan membahasnya. Cukup atur setting, lalu panggil fungsi <code>bpy.ops.render.render(animation=True)</code> untuk memulai proses render... selesai!</p>

<p>Alih-alih, berikut ini saya hanya akan membahas dua kasus khusus yang tidak dapat langsung ditangani dengan trik pada tulisan sebelumnya.</p>


<h3>Render preview (menggunakan OpenGL)</h3>

<p class="first">Satu trik khusus membuat kita dapat me-render seluruh film yang tengah kita buat dengan sangat cepat, yaitu render preview. Bayangkan kita dapat segera menyaksikan karya kita, memeriksa kualitas animasi dan narasinya, tanpa perlu menunggu proses render yang terlalu lama. Render preview memanfaatkan pustaka OpenGL yang menggambar seluruh antarmuka Blender termasuk viewport 3D ke layar, sehingga meski ia mengorbankan kualitas visual, jenis render ini dapat dilakukan dengan sangat cepat.</p>

<p>Satu-satunya kendala adalah bahwa jenis render ini tidak dapat langsung dilakukan melalui baris perintah. Blender harus terlebih dahulu memiliki &quot;kanvas&quot; OpenGL, yang artinya proses render harus dimulai saat antarmuka grafis tersedia. Eksekusi perintah render dilakukan dengan injeksi perintah Python, dengan satu-satunya perbedaan adalah fungsi yang dipanggil. Bila render normal dipanggil dengan fungsi <code>bpy.ops.render.render</code>(animation=True), maka render OpenGL dipanggil dengan fungsi</p>

<pre>bpy.ops.render.opengl(animation=True, view_context=False)</pre>

<p>Parameter <code>view_context</code> harus bernilai <code>false</code> agar gambar tidak diambil dengan sudut pandang viewport manapun yang tengah aktif, melainkan dengan kamera.</p>



<h3>Menggabungkan gambar dan suara dalam satu file.</h3>

<p class="first">Sampai Blender 2.54, prosedur render melalui CLI belum dapat memasukkan audio ke dalam file video yang dihasilkan, meski semua setting render telah memperhitungkan keberadaan track audio. Yang ada, track audio file hasil hanya akan berisi suara berdecit atau kosong sama sekali. Trik yang saya gunakan adalah, lagi-lagi, melalui injeksi perintah Python. Contoh baris Makefile untuk proses ini adalah:


<pre>vid_opening_title.avi: seq_opening_title.blend renderseq.py
	blender $< --scene 'Scene' -P renderseq.py >> /dev/null

renderseq.py:
	@echo 'import bpy' > $@
	@echo 'bpy.ops.render.render(animation=True)' >> $@
	@echo 'bpy.ops.wm.exit_blender()' >> $@
</pre>
</p>

<p>artinya, untuk file <code>vid_opening_title.avi</code> yang membutuhkan track audio, diperlukan file <code>renderseq.py</code> (yang akan otomatis dibuat jika belum ada).</p>



<h3>Contoh kode</h3>

<p class="first">Semua trik di atas saya manfaatkan dalam menulis program pengelola renderfarm yang tengah saya rakit, PRAJA, yang saat ini masih dalam tahap eksperimen. Program tersebut terdiri atas beberapa komponen, meski satu-satunya komponen yang telah saya terbitkan adalah yang terkait dengan proses render di masing-masing slave. Itu pun masih berupa prototip dalam bahasa Python (komponen ini harus punya footprint sekecil mungkin dalam memori, hal yang mustahil saya capai bila memakai Python). Bagi rekan-rekan programmer yang menggunakan Mercurial, dapat mengambil komponen program tersebut dengan perintah


<pre>hg clone https://praja.googlecode.com/hg/</pre>
</p>

<p>atau mengunjungi <a href="http://code.google.com/p/praja">situs proyek Praja</a>.</p>
]]></description>
    <category>Animation</category>
    <comments>xml-rss2.php?itemid=11</comments>
    <pubDate>Thu, 17 Feb 2011 09:00:00 +0700</pubDate>
</item>
  </channel>
</rss>
