Monthly Archives: February 2016

Project 2 by Win Zaw

The final product in all it’s glory. For this project, there were a couple of hurdles that i’ve had to overcome. Firstly, i’ve had to create the 3d assets using a 3d software (maya). After I was done creating the 3d models and textures, i’ve had to create a terrain.

Firstly, i created a terrain model in unity and sculpted the terrain. I made sure that the edges of the terrain remained untouched as i wanted to create an infinite terrain script. If the terrain was even a little elevated, the end result would be an obvious seam.  I’ve also made an attempt to sculpt the terrain manually in Mudbox using a displacement mapping. This worked to a certain limit. However, as the process of converting object to terrain is time consuming, i’ve decided against it.


Once i was done with sculpting the terrain, i created a base texture, which would be the grass. I would then add another layer, which would be the soil. I would vary the texture to create a sense of erosion. Afterwards, i would create a grass texture and add in the trees using a paint function. The idea would be to create a dense forest in one area.

Afterwards, i created a couple of pillars and added an audio source to each of them. I initially had trouble adjusting the spread and minimum distance, but after much troubleshooting, i found out that the problem was from multiple audio listeners. I kept it to one and found that the audio now softened with distance.

I added a few ambient tracks from my recordings in Labrador Park. One was of the forests, one was at the docks, one was the sound of winds blowing and another one was a track from Radiohead callled “Bloom”. I chose that song as it inspired me to design the look of the project. In order to have the audio elements loop, i went to Premiere pro, cut off the front end of the audio and stuck it at the back, then i softened the front half and add the cut off section to blend in.

In creating this environment, i hope to make people immersed in the spaces of Labrador park. In future, i might also consider adding even more audio sources to more correctly. However, as a lot of the time had been spent on research and development, I’ve had little time to collect more audio samples and blend them in.

I added the infinite terrain script in C# (see below)


using UnityEngine;
using System.Collections;

public class InfiniteTerrain : MonoBehaviour
public GameObject PlayerObject;

private Terrain[,] _terrainGrid = new Terrain[3,3];

void Start ()
Terrain linkedTerrain = gameObject.GetComponent<Terrain>();

_terrainGrid[0,0] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[0,1] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[0,2] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[1,0] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[1,1] = linkedTerrain;
_terrainGrid[1,2] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[2,0] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[2,1] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
_terrainGrid[2,2] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();


private void UpdateTerrainPositionsAndNeighbors()
_terrainGrid[0,0].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x – _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[0,1].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x – _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[0,2].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x – _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.z – _terrainGrid[1,1].terrainData.size.z);

_terrainGrid[1,0].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[1,2].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.z – _terrainGrid[1,1].terrainData.size.z);

_terrainGrid[2,0].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
_terrainGrid[2,1].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[2,2].transform.position = new Vector3(
_terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
_terrainGrid[1,1].transform.position.z – _terrainGrid[1,1].terrainData.size.z);

_terrainGrid[0,0].SetNeighbors( null, null, _terrainGrid[1,0], _terrainGrid[0,1]);
_terrainGrid[0,1].SetNeighbors( null, _terrainGrid[0,0], _terrainGrid[1,1], _terrainGrid[0,2]);
_terrainGrid[0,2].SetNeighbors( null, _terrainGrid[0,1], _terrainGrid[1,2], null);
_terrainGrid[1,0].SetNeighbors(_terrainGrid[0,0], null, _terrainGrid[2,0], _terrainGrid[1,1]);
_terrainGrid[1,1].SetNeighbors(_terrainGrid[0,1], _terrainGrid[1,0], _terrainGrid[2,1], _terrainGrid[1,2]);
_terrainGrid[1,2].SetNeighbors(_terrainGrid[0,2], _terrainGrid[1,1], _terrainGrid[2,2], null);
_terrainGrid[2,0].SetNeighbors(_terrainGrid[1,0], null, null, _terrainGrid[2,1]);
_terrainGrid[2,1].SetNeighbors(_terrainGrid[1,1], _terrainGrid[2,0], null, _terrainGrid[2,2]);
_terrainGrid[2,2].SetNeighbors(_terrainGrid[1,2], _terrainGrid[2,1], null, null);

void Update ()
Vector3 playerPosition = new Vector3(PlayerObject.transform.position.x, PlayerObject.transform.position.y, PlayerObject.transform.position.z);
Terrain playerTerrain = null;
int xOffset = 0;
int yOffset = 0;
for (int x = 0; x < 3; x++)
for (int y = 0; y < 3; y++)
if ((playerPosition.x >= _terrainGrid[x,y].transform.position.x) &&
(playerPosition.x <= (_terrainGrid[x,y].transform.position.x + _terrainGrid[x,y].terrainData.size.x)) &&
(playerPosition.z >= _terrainGrid[x,y].transform.position.z) &&
(playerPosition.z <= (_terrainGrid[x,y].transform.position.z + _terrainGrid[x,y].terrainData.size.z)))
playerTerrain = _terrainGrid[x,y];
xOffset = 1 – x;
yOffset = 1 – y;
if (playerTerrain != null)

if (playerTerrain != _terrainGrid[1,1])
Terrain[,] newTerrainGrid = new Terrain[3,3];
for (int x = 0; x < 3; x++)
for (int y = 0; y < 3; y++)
int newX = x + xOffset;
if (newX < 0)
newX = 2;
else if (newX > 2)
newX = 0;
int newY = y + yOffset;
if (newY < 0)
newY = 2;
else if (newY > 2)
newY = 0;
newTerrainGrid[newX, newY] = _terrainGrid[x,y];
_terrainGrid = newTerrainGrid;


I also added an FPS camera and adjusted the movement parameters. (eg. Jump, mouse sensitivity, running speed and walking speed.)


  1. public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
  2. public RotationAxes axes = RotationAxes.MouseXAndY;
  3. public float sensitivityX = 15F;
  4. public float sensitivityY = 15F;
  5. public float minimumX = -360F;
  6. public float maximumX = 360F;
  7. public float minimumY = -60F;
  8. public float maximumY = 60F;
  9. float rotationY = 0F;
  10. void Update ()
  11. {
  12. if (axes == RotationAxes.MouseXAndY)
  13. {
  14. float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
  15. rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
  16. rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
  17. transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
  18. }
  19. else if (axes == RotationAxes.MouseX)
  20. {
  21. transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
  22. }
  23. else
  24. {
  25. rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
  26. rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
  27. transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
  28. }
  29. }
  30. void Start ()
  31. {
  32. // Make the rigid body not change rotation
  33. if (rigidbody)
  34. rigidbody.freezeRotation = true;
  35. }


I also added in a global fog to create a fading effect, so objects in the distance would blend in with the skies. As for the skies itself, i added a default unity skybox.


Assignment 1 by winzaw


IMPORTANT NOTE: (I’m restricted by file size, so while there are certain processes i can show, there will be those that i will not be able to show like curves and poly lasso. I hope you are already acquainted with some of the concepts.)

psd2 psd1

Just to clear things up, the images I’ve screen capped are to show the layer and level function. I will be making references to these process afterwards.


map 001 map002

052313paris1609 052313paris1652 052313paris1892 Switzerland-antique-vintage-map

The first image is the final selected composition for “cartographer”. For this one, i spliced a couple of maps using a poly lasso tool and changed the levels in photoshop so as to match the colors. In certain extreme cases, i’ve had to desaturate the colors before adding a color masking layer on top of them. I would then use the poly lasso tool again to create the letters, this time making sure that the selection would follow the contours of the streets and buildings. After selecting my entire name, i would create a new layer and use a paint bucket tool to splash a color before setting a screen filter on top of it . I would later use a mouse and a brush tool to create the lines. To keep the lines straight, I would use the “shift” function.

The classical map design (2nd image) was one of the styles that i wanted to use. However, i was worried that I would not be able to show my name clearly enough, so i left it as it is.




My attempt at making a lino cut. An embarrassing mistake since the letters that were pasted was inverted. A friend of mine suggested that i used a transparency paper or a piece of cellophane so that the inverted image could be reverted back to it’s lateral form.

bio002 bio003a bio002a bio003

Various attempts at “biotic”. The original picture that was done in black and white was a little off centre, so i used a warp tool and positioned the words back in the middle. For the vertical version, I didn’t finish the top right hand portion and didn’t even work on the letters as i was just experimenting. However, I wanted to test if the fonts would come out right, so i used a clone stamp tool, borrowing elements from the bottom to paste in on the top. Afterwards, i used another layer and used a mouse and brush tool to paint the letters on top. I liked how the letter “Z” looked like, so i replicated it on the second attempt. One thing to note was that the second image looked larger

006 chaotic 001 chaotic 001a chaotic

This concept came in at a close second, since I felt that the art style for this was a little too similar to “Graphomaniac”. The idea with this one was to create a planet of ethereal chaos. As for the execution, this one was a little less straightforward. Apart from the white swirls, the rest of the elements are recycled from the original image. First of all, i set the wheel to the center of the composition and duplicated the left half of the wheel before inverting it and using a soft eraser to make the merger more seamless. Afterwards, i removed the shapes from the scanned image and looked for those that resembled my name. Afterwards, i used a clone stamp tool to replicate the crosshatches. This particular part was slightly trickier as there were very little crosshatch sources that i was able to grab onto. Once that was done, i cleaned the edges to form an oblate spheroid shape. I added a few sprinkles and swirls using a brush tool. For the darkened version, i used the solaris poster as a source of inspiration. I overlaid the second scanned image ( 3rd) and placed it in the background. Afterwards, i used a soft eraser to create a glowing effect for the planet. Finally, i added another layer for the swirls that crossed over to the darkness.

swirl swirl001 swirl002

Variants for the “ethereal” concept. This one was straightforward enough. I used a swirly font and duplicated it before setting it as a multiply mask. I would later select the color range for the original scan and apply the color on the letters.(So now the letters are transparent)

swirl003 swirl004

The top two were my first attempts into creating a swirly design. I initially wanted to draw a maze with my name, but was skeptical as the message could be interpreted as ” confusing” rather than intricate. I also saw a few people research into that concept, so i avoided using it as i felt that the novelty would wear out soon.


text 002 text 003 text 005 text006

Variants for “hypergraphia” The inspiration for this came very easily as i was doodling on my sketchpad. I was also inspired by a few artists that have this condition, namely Tommy Mchugh and Robert shields. (sadly, both have passed away) People with this condition have the tremendous urge to write and draw, no matter what. It doesn’t matter what the final outcome would be as the process would be more important than the destination. In my late secondary school to polytechnic days, I would be inspired by them and condition myself to write on a book for every 5 minutes. (this would also severely affect my ability to sleep.Thankfully i don’t do this anymore) The final outcome for this concept was easy as all i had to do was write on a piece of paper repeatedly until i filled up the page.

tree 001006 tree001a tree004

Design variants for natural. In both cases, the letters are a little hard to spot. In my second attempt, i used a multiply layer and colored it. Afterwards, I added a hue layer and changed the bark to green so as to make the letters stand out. This is one of the few compositions that required the viewer to read it vertically and be able to sift out the letters out of a form.


(TL;DR) All in all, this entire project was a technical challenge, albeit a fun one. The main challenge was to create an image physically and add to it in photoshop without using a stylus to DRAW it out. The second main challenge was to create all these images as quickly and as efficiently as possible so as to leave time for other assignments, something that wouldn’t have been possible had i used traditional medium throughout.




Trip to Labrador Park

Labrador Park, located at the southern part of Singapore, was once used as a defensive position by the British to fend off against the Japanese. Among the many war relics are the bunkers, pill boxes and six inch 37-ton guns. When the Japanese arrived in Singapore, they came from the northern coast instead of the southern coast which the British expected. No Japanese ships passed through and as a result, much of the defensive positions at the fort were put to waste. The battle of Bukit Chandu, now known as Bukit Panjang also took place near the vicinity of Labrador Park.

In November 2001, it was announced that the place was to be turned into a nature reserve. I’ve had some luck finding some of the listed species of animals my trip there; I’ve seen several species of birds and even a Komodo dragon!

Since I’ve been to the place before, I’ve decided to revisit the place on my bicycle. I’ve also made an extra effort into exploring the place by visiting the open area near Port road. It was drizzling at the time, but usually there would be Indian foreign construction workers playing cricket as the place is immensely huge. On top of that, I’ve visited the bunkers deep into the reserve and although the six inch cannons were replicas, I’ve gotten a sense of what it was like to defend the place. According to some websites, there are tunnels that lead from Labrador park to sentosa.

After I was done with the natural reserve, I cycled to the edge of the park and enjoyed the view of Harborfront. I watched as the locals fished out their catch. Some even waded to the shores to catch the crabs.

Labrador_Park_Old_Fort show_resize_image labrador-park-six-inch-gun

For my research, I have also traveled to the newly opened kranji marsh. I was told that there were crocodiles there, but they weren’t there at the time of my visit.