Game – Methods of Loci

Course: Fall 2013 – Building Virtual World

Role: Programmer in team of 5 (2 programmers, 2 artist, 1 sound designer)

Introduction:

Methods of Loci is a two-week project in round 1 of Building Virtual World course of Carnegie Mellon University Entertainment Technology. Our team was assigned to use Microsoft Kinect (Infrared depth based motion sensor that tracks body skeleton joints’ position) to create a game of character B helping character A to rid character A’s fear.

Preview:

Web – WYSIWYG Gallery

Course: Spring 2012 – CGT 356: Web Programming, Development and Data Integration

Type: Individual Project

Demo:  Scenes of Purdue (Super Admin: admin, Password: php)

Introduction:

The purpose of this site is to provide a common location where anybody can come, browse through the images, and use an appropriate image for whatever their needs may be. These images need to stay in an organized directory structure and cataloged and maintained in a database. The database should hold the categories available and image information such as filename and description.

The system will allow three types of access: 1) User, 2) CategoryAdmin and 3) SuperAdmin. A User can only browse through the images and download them. A CategoryAdmin can login and add, delete, change, etc the images for their particular category. A SuperAdmin can login and add, delete, change, etc. images for the entire university, as well as manage users. Administrators can also browse through their available images, upload new images, delete old images, create new categories of images, and enter descriptions of each image.

Using PHP and MySQL knowledge acquired from CGT 356 and jQuery knowledge acquired from CGT 353. I accomplished this WYSIWYG (What you see is what you get) dynamic content management system with user experience as my highest priority.

Preview:

CGT 356 Project 2

Game – Unity 3D Platform Game

Course: Spring 2013 – CGT 490: Video Game Development and Design

Role: Individual Project

Introduction:

In this individual lab assignment, we were required to use Unity 3D engine to build a 2D platform game involving controlling sprite sheet, walking motion, jumping motion, collecting keys and opening the door if all key has been collected. Some extra add-on functions to this lab: multiple keys, particle effects, teleportation, moving platforms, parallax background and player death.

This game will be constantly updated as the project is still in development.

Preview:

Game

Play:

Unity Web Player

Download

Credits:
Background music composed by: Eric Skiff
City image: http://madetobeunique.com/
Cloud images: http://bit.ly/WeI2Ze
Sky image: http://bit.ly/10QwPTk

Updates:
2013.1.22 Ex02 v2

  • Replaced parallax cloud background with 2 layers of sprite sheet animation
  • Replaced city background to a fancier one
  • 1.5x faster than it was to achieve a more challenging game-play experience

Prototype – My “Project Glass”

Introduction:

Inspired by Google’s Project Glass. I started a project of making my own Android powered monoscopic wearable computer. I used following components in this project:

  1. Myvu Solo Plus Video Glasses (Modified to use only one eye)
  2. Rikomagic MK802 II Android 4.0 Dongle
  3. USB Powered HDMI to Composite Converter Box
  4. 5V 15000mAh Li-ion Battery Pack
  5. Bluetooth Keyboard and Mouse

By combining these components together plus a little modification, this prototype system can be carried around in a small bag and can display a fully functional Android 4.0 OS controlled by wireless keyboard and mouse.

For detailed information about how to modify the Myvu Solo Plus Video Glasses, please visit my life blog at: http://tianweiliu.wordpress.com

Prototype:

Photo Jan 04, 7 08 33 PM

App – Reel Interaction Final Presentation

Course: Fall 2012 – CGT 411: Contemporary Problems in Applied Computer Graphics (Senior Design)

Role: Lead Developer/Architecture Designer in team of five

Introduction:

Reel Interaction is a CGT 411/450 capstone group at Purdue University researching Augmented Reality in film production. For film production companies who need to visualize an interaction between actors and graphics, Reel Interaction is a product that allows users the ability to visualize graphical interaction in real-time. Unlike current methods that rely on physical placeholders, our product utilizes virtual placeholders which more accurately represent the final vision.

We built a Augmented Reality Unity 3D stage which connected to four Microsoft Kinect sensor servers under Open Sound Control protocol. I act as lead developer/programmer in the team.

Early Demo:

Video (Please jump to 25:50 for demo):

Sample OSC Server Code:

                            bool somethingTracked = false;
                            foreach (Joint joint in data.Joints)
                            {
                                if (joint.TrackingState == JointTrackingState.Tracked)
                                    somethingTracked = true;
                                // prepare the message to send
                                OscElement message = new OscElement("/tracker/" + data.TrackingId + "/" + joint.JointType.ToString(), joint.Position.X, joint.Position.Y, joint.Position.Z, joint.TrackingState.ToString());

                                // add joint message to bundle
                                bundle.AddElement(message);
                            }
                            if (data.TrackingState == SkeletonTrackingState.Tracked)
                            {
                                somethingTracked = true;
                                foreach (BoneOrientation orientation in data.BoneOrientations)
                                {
                                    OscElement message = new OscElement("/orientation/" + data.TrackingId + "/" + orientation.StartJoint.ToString(), orientation.AbsoluteRotation.Quaternion.X, orientation.AbsoluteRotation.Quaternion.Y, orientation.AbsoluteRotation.Quaternion.Z, orientation.AbsoluteRotation.Quaternion.W);
                                    // add orientation message to bundle
                                    bundle.AddElement(message);
                                }
                            }
                            if (somethingTracked)
                            {
                                if (OSCSender.logBlock != null)
                                    OSCSender.logBlock.Text = "Sending data of skeleton #" + data.TrackingId;
                                //send bundle
                                bundle.DateTime = DateTime.Now;
                                OSCSender.oscSender.Send(bundle);
                            }

Web – Shipping/Billing Management System

Course: Spring 2012 – CGT 356: Web Programming, Development and Data Integration

Role: Individual Project

Demo: Shipping/Billing Management System (Login: admin, Password: php)

Introduction:

In this project, we were required to build a shipping/billing management system for customers to login and create/edit/delete their shipping and billing information using PHP and MySQL knowledge we acquired from CGT 356. Ajax and jQuery were implemented as an experiment to handle PHP to MySQL calls which was beyond the project requirement.

Preview:

CGT 356 Project 1

App – User orientation tracking using iPhone gyroscope

Course: Fall 2012 – CGT 411: Contemporary Problems in Applied Computer Graphics (Senior Design)

Role: Lead Developer/Architecture Designer in team of five

Introduction:

During our senior design, we needed a way of tracking user orientation. After research, we found that iPhone 4 and later has built-in gyroscope and Charlie Roberts had written a perfect app for transmitting iPhone gyroscope data using Open Sound Control protocol. We modified our Unity Open Sound Control client so it would also receive OSC messages from iPhone.

Demo Video:

Sample Unity 3D Client Code:

	// Update is called once per frame
	void Update ()
	{
		if (oscClient == null)
			return;
		else {
			OscBundle oscPack = (OscBundle)oscClient.Receive ();
			if (oscPack != null) {
				TimeSpan latency = TimeSpan.FromSeconds (Time.deltaTime);
				if (oscPack.DateTime.Year != 1)
					latency = DateTime.Now.Subtract (oscPack.DateTime);
				if (GUI_FPS != null)
					GUI_FPS.guiText.text = "FPS: " + (int)(1f / Time.deltaTime) + " Ping: " + latency.Milliseconds.ToString () + "ms";
				foreach (OscElement oscElement in oscPack.Elements) {
					if (oscElement != null) {
						//Debug.Log("Receiving data from: " + oscElement.Address);
						string[] key = oscElement.Address.Split ('/');
						if (oscElement.Args.Length == 6 && key.Length == 2) {
							if (key [1] == "gyro") {
								this.transform.localRotation = Quaternion.Euler (new Vector3 (0, 180f -(float)oscElement.Args [4] * 360f, 0));
							}
						}
					}
				}
			}
		}
	}

Web/Game Developer