June 29, 2015

Minion Speed Sculpt

Belloo!! Who wants Bana-na-naaa? :D

Minion Speed Sculpt - ariespranata
Minion Speed Sculpt
This is a recorded video of me doing the speed sculpt of Minion. I used ZBrush, did it in about 1 hour from scratch to final pose. However, the video was edited to 2x speed for more convenient view.

I actually used so many ZBrush special features in this making, such as ZSphere, ZRemesher, Fiber Mesh, and Transpose Master.

I hope you find this useful.
Thanks for watching and cheers! :D

April 28, 2015

Dark Knight

This is a personal project I did in my free time. Batman is a character which story always falls between the two polar opposites of moral value, good and evil; where everything is in grey area. So, I thought that it would be fun to think, "What if he falls into the dark side?" because generally, he is always perceived as the good guy.

The word "Fear" is what Batman is all about; so I use that keyword as the main concept in this demonic version of him.

PS: Coincidentally, this version resembles the "Nightmare Batman" version which I didn't know before until a friend told me. :)

I started with dynamesh in ZBrush, render it, and did some retouch in Photoshop.
Dark Knight
Dark Knight
Dark Knight 3D Model
Dark Knight 3D Model

Hope you guys like it.

March 24, 2015

Egyptian Royal Priest

This is my latest Character concept, an Egyptian Royal Priest. Well, it's been like more than a year since I created my own Character.. hehe.. been busy with other works that has nothing to do with 3D and stuffs. So, let's say that it's kinda my stress reliever. :p

I started with Dynamesh, without knowing what I'd create, until this guy appeared in my head and.. Ta Da! (just click on the image to see the better quality)

Egyptian Royal Priest Concept
Egyptian Royal Priest Concept

The left one is the clay render for you to see the model clearly and the right one is to give him more glorious look. Sorry that I didn't do the paint job on this guy because I was just way too lazy to do that.. Forgive me, ok? :p

By the way, this was also the first time I used my 1-month-old wacom pen tablet (finally, yay!) in ZBrush. I gotta admit that it helps a lot, compared to using mouse.

Hope you guys like it, and have a nice day.

November 11, 2014

Engraved Shotgun - Reverse Engineering

So here we go, I'd like to share one of my projects that might be interesting for you to look at. This project, for me personally, is kind of 'expansion' of what my knowledge and skill in 3D can do. So far, I've been doing 3D only for visualization and animation. But this one is for manufacturing industry, which is new to me.

I'm really grateful to meet some friends at Rannova Indonesia that gave me a chance to work with them in this project. The project is what we call a reverse engineering, a process of recreating something based on the existed thing which in this case is a wooden engraved shotgun body.

So this guy has a wooden shotgun with some engraving on it and he wanted this shotgun to be available for mass production. For a time being, it took a lot of time to produce the shotgun because it needs craftsmen, a human resources to do the job. Furthermore, since every craftsmen has different skill, it's hard to standardize the quality of the engraving. There comes an idea of how to make this product available to be created by machine.

This is the rendered image of final 3D file that I created based on the original product:
render 3D engraved shotgun - reverse engineering
Final 3D File for Prototyping

Then my friends at Rannova Indonesia did the rest, the process of milling and so on which I actually don't really understand. :p

Then after the long process, this is what we got:
First look of the Final Product
First look of the Final Product

It reminds me of Gunpla kits btw. LOL


November 07, 2014

[Freebies] MAXScript: Rendering AO Pass Made Easy

As you all know, there are many ways to create an Ambient Occlusion Pass. We can use the default Ambient Occlusion Pass in Render Element, use the mr_shader_element with AO shader set on it, or use the Material Override and do the render. The first two is much faster to do, but resulting in solid black background image that might be quite annoying when in compositing process. The last one needs some steps to do before doing the render, but we can set the background to solid white.

MaxScript Render AO Pass
MAXScript: Rendering AO Pass made easy
So I took some time learning MAXScript and decided to create this simple one that might help me do the task. So, what does this script do? This script is actually doing the third method mentioned above, in automatic way:

  • switch the renderer to mental ray
  • remove all lights
  • turning off FG (to speed up render a little bit)
  • create an AO material and apply it on ALL objects (you might want to hidden the objects you don't want to render)
  • set the background environment to white
  • set the gamma to 1.0 (so you won't get a washed-out AO)
  • do the render
  • saving the file (only if you set the Save File on your Render Setting)
  • then set everything back as if nothing happened

One nice thing about this script is you don't need to worry about what render engine you use for your main renderer. As long as mental ray is (by default) come as one package with your 3ds Max, then this will work. When you run this script, it will render the AO pass and leave your scene back as it was before the rendering process.

The installation is very easy. First you need to download the .ms file (link available below). Run your max, click on MaxScript - Run Script, then browse the downloaded file. Nothing happened but don't be panic, click on Customize - Customize User Interface. Then click on Toolbars tab, choose Main UI on the Group dropdown menu, and find ariespranata on the Category.

You should find the renderAO in the Action as shown in image above. Just drag it to your toolbar on top and the button will be created automatically there. Just click on that render AO button, and new window will appear.

Render AO Pass parameter dialog
There are some parameters that you might want to set to define the quality of your AO pass. The parameter setting is actually the same as the mental ray AO shader and I guess they are pretty much self-explained.

The "-suffix Name" is the text that will be used as a -suffix in your filename. This will only apply when you check the Save File on your Render Setting. No worries, if this script find the same file name, it will ask your permission first whether to replace it or not. Say that you have a file named "Interior.jpg", then the AO will be saved as "Interior_AO.jpg" at the same directory.

DOWNLOAD: MAXScript: Render AO Pass
NOTE: you might need to temporarily turn off your ad blocker. If you find this script useful, I'd be very grateful if you share this blog post instead of the direct link. :)

MAXScript: Render AO Pass version release
ver 1.0
- Initial Release, tested and developed on Max 2011. Update: tested also on Max 2013 and 2015.

If you have some idea to improve this script, please comment below. I'd love to hear that and I'll try to improve this script in my free time.


August 30, 2014

[Flash] Action Script 3.0 Basic Part I

Today, I will explain about the basic programming in ActionScript 3.0 (AS3) using Adobe Flash Professional. This is a very basic principle and it's actually the fundamentals of any programming language. You can use this principle to any programming language. The only difference is just the syntax (the way the code is written), but the concept remains the same.

So in this part 1, I will cover some basics about:
- Declaring Variable
- Conditional Statement
- Loop Statement

You can use this in any version of Flash Professional that supports ActionScript 3.0 (Macromedia Flash 8, CS, and CC version). Let's get started! :D

Creating New File

When we open Flash, there will be a Welcome Screen. With that many options, choose Create New File - ActionScript 3.0. Then we're ready to code, as simple as that. Note that if you use AS3 code in AS2 project, you will get error message when you compile the movie.

A few things to keep in mind before we begin to code in AS3:

- AS3 is case-sensitive language, meaning the uppercase and lowercase letter is recognized differently. For example, if we type a text data 'string' instead of 'String', then we'll get error. Because Flash recognizes 'String' (with capital S letter) instead of 'string' as a data type for text data. The easiest way to avoid that mistake, you can notice that the term will always change to blue color if Flash recognizes it as its default scripting term.
- Always use semicolon (;) to end a statement. It's recommended to use semicolon (;) to end each statement so you'll not find really hard when you learn other programming language that force you to use it. In Flash, it's actually not really necessary to use, you can simply use a line break (Enter), but still, I recommend you to use semicolon.
- You can access the ActionScript window by pressing F9, and compile the script by using Test Movie (Ctrl+Enter).
- Like any other programming language, AS3 will be executed in order from top to bottom lines. So in some cases, if the order is not right, then it will throw some errors. For example, we set a value to a variable before declaring that variable first will throw error because it's unable to find the variable. It's illogical to set a value to a non-existed variable.

Declaring Variable

So, what is variable? Variable is like a container to hold something, and this container have specific type to match with the content. For example, if we have a water container, then it should be used to contain water. So if we have a text variable, then we can use it to contain text data. Variables value can also be changed dynamically as long as the value is the same type as the variable type.

The syntax:
var var_name:var_type = value;
var_name is the variable name, you can name it everything you like with some conditions: variable name cannot contain only number or started by number, but combination of text+number is fine. Also it's recommended to avoid the same name as Flash default scripting term (when the text turns to blue). For example:
  • var 123:int; is incorrect
  • var 1ove:int; is incorrect
  • var a:int; is correct
  • var number01:int; is correct
  • var var:int; is incorrect since var is Flash default scripting term

var_type is the type of the variable. Normally, when we type var a:, then the autocomplete window will appear, showing the list of all available data type to help us get the right term. You can see it in the image below (the color might be different from yours because I have my actionscript color preferences set to my custom colors). :p
AutoComplete Feature in Flash Professional
AutoComplete Feature in Flash Professional
Now, let's try creating a variable. You can type this into your Actions window:
var a:int;
int is a data type for round number, it's derived from the word 'integer'.
trace() is a function to show a value of a variable. The value will be shown in the Output window when we compile the movie.

Now, hit Ctrl+Enter to execute the script. You will get 0 in the Output window. Why? because we didn't set any value to the variable a yet. Now set the value to 2.
var a:int = 2;
Hit Ctrl+Enter again and now it will show 2. That means that our variable 'a' now has a value, which is 2.

Now let's try a simple math:
var a:int = 2;
var b:int = 3;
var c:int;

c = a+b;
Hit Ctrl+Enter again and now you will see 5 in the output window. What exactly happened here? First, we create a variable a with value 2, variable b with value 3, and variable c with empty value. Then, we set the value of variable c by adding 'a' value (2) with 'b' value (3). Thus we get 5.

Conditional Statement

Conditional Statement is used when we need to check whether a condition is met or not.

The syntax:
if (condition){
    //Do something
condition is where we put something to check; I'll explain next with an example. Note that in this syntax, we use brackets {}. This is what we call a 'code block', a place where we can put some code to be executed when certain condition is met. Also, you can see the //, this is called a 'comment'. Anything that we put after the // will not be executed by the compiler (try yourself and see what you type turns to grey color), so it is good to use when we want to give notes.

Now, let's try a little example:
var a:int = 1;
if (a==1){
    trace("a is one");
What this code means? It means that we want to check whether the value of 'a' is equal to 1. Notice that I use == instead of =. When we want to check the value of a variable, we use ==is used when we want to set a value.

Then, what happened when the condition is met? Hit Ctrl+Enter and you can see 'a is one' text in your output window. Since the value of 'a' is equals to 1, it means the condition is met, so the code within the code block is executed, which is trace("a is one"). Wait, why use double quotes ("")? Whenever it's a text data (called String data type), we have to use " before and after the text. If we don't, Flash will throw errors. We can also use single quotes (') interchangeably if our text data contain double quotes, e.g. 'a is "one" ' . In Flash, every String data will turns to green color by default.

Now, what if the condition is not met? Let's modify our code a little:
var a:int = 2;
if (a==1){
    trace("a is one");
} else {
    trace("a is not one");
I change the value of 'a' to 2, and add an else clause. What does this else clause do? Whenever a condition is not met, the code within the else clause will be executed. If you don't give any else clause, then nothing will be executed. Now hit Ctrl+Enter, you should now see 'a is not one' text in your output window because the value of 'a' is 2 and not 1.

Let's make things a little bit more complicated. What if the condition to check is more than 1? If so, we can use the else if clause:
var a:int = 2;
if (a==1){
    trace("a is one");
} else if (a==2){
    trace("a is two");
} else {
    trace("a is not one nor two");
Now hit Ctrl+Enter again, you will see 'a is two' text in your output window. What happened here is Flash will first check, whether the value of 'a' is equals to 1, which is not. So, Flash will skip the first code block and jump to the second check: is value of 'a' equals to 2? It's true, so Flash runs the following code block, thus we get 'a is two' text in our output window. Note that once a condition is met, then Flash won't run the following else and else if clause (if there is any). In our case, the else clause won't be run because the condition (a==2) has been met.

Loop Statement

Loop Statement is used to execute some codes repeatedly for a specific number of times when a certain condition is met.

The syntax:
for (counter; condition; action){
    //Do Something
counter is any number variable, it's used as an iterator or starting number. The second parameter is condition, this is where we set a condition for our counter to meet. The last parameter is action, where we define how the counter will increase, decrease, or multiply. This action will be executed for every loop cycle.

Let's say we want to trace "Hello World!" for 5 times, in ancient-fashioned way, we can use:
trace("Hello World!");
trace("Hello World!");
trace("Hello World!");
trace("Hello World!");
trace("Hello World!");
Imagine when we need to trace that for a hundred times.. @.@
Instead, we can use this:
var i:int;
for (i=0; i<5; i++ {
    trace("Hello World!");
When you hit the magic button, Ctrl+Enter, you will find exactly the same result as the first one.
First, we start by declaring a variable 'i' with integer type, then followed by the for-loop statement.
- i=0 is how we set the starting number of our counter; we set it to 0.
- i<5 is the condition we set for our counter to meet.
- i++ has the same meaning as i=i+1, which will add 1 to our counter for each loop cycle. You can use any math operation of course to accommodate your need, increasing our counter by 1 for each loop cycle is what we most generally used.

To explain better how this for-loop statement works, we will modify our code a little:
var i:int;
for (i=0; i<5; i++ {
    //trace("Hello World!");
    trace("Hello World!, i="+i); //will trace the value of i
This will result:
How the For-Loop Statement Works
How the For-Loop Statement Works

You can see that our counter starts with 0, as we stated before i=0. Then after executing the trace() code, it increases by 1 for every loop cycle. The cycle stops when the counter reached 5, because it's no longer meet our i<5 or i is less than 5 condition. That's why the last trace() executed is when the counter value is 4.

So, this is the end of part 1. I hope this will be a useful tutorial, especially for those who wants to start learning AS3. Any positive comments are welcomed to make this tutorial better. :)