Archive for the 'Unity3d' Category

OSC (Open Sound Control)

OSC(Open Sound Control) 는 원래 음악장비와 컴퓨터간의 통신을 위해 만들어진 통신 프로토콜(protocol)이다.

명칭자체에 sound 라는 단어가 들어간것만 봐도 sound 와 밀접한 관계가 있음을 추측할 수 있을 것이다. 하지만 sound 와 관련된 본래의 목적이외에도 서로 다른 application 간의 통신 및 각종 네트워크 장비간의 통신에 상당히 많이 활용되고 있다. 이처럼 다양하게 사용되는 가장 큰 이유는 바로 직관적이면서도 사용하기 쉬운 메시지 전달방식에 있을 것이다. Multi touch 인터페이스에 사용되고 있는 TUIO 가 바로 OSC 를 기반으로 만들어진 플레임워크라는 사실에서 OSC 가 상당히 범용적으로 사용될 수 있다는 점을 예상할 수 있을 것이다.

OSC 가 물론 음악장비의 제어를 위해 만든어진 프로토콜인 만큼 OSC 를 구현한 상당수의 소프트웨어가 미디장비를 위한 소프트웨어이다. 그렇지만 통신 프로토콜인 만큼 음악장비 뿐만이니라 OSC 를 구현하는 모든 기기간에 통신을 위한 목적으로도 사용될 수 있다.

OSC 를 구현한 대표적인 소프트웨어중에 OSCulator 라는 소프트웨어는 iphone 및 Wiimote 과 같은 컨트롤러를 활용해 각종 미디장비를 제어할 수 있는 기능을 제공한다. mac 전용 소프트웨어이긴 하지만 상당수의 사운드제어 컨텐츠 개발에 사용되고 있으며 ipad 의 출시이후에 패드를 활용해 사운드 믹싱장비로 사용하고 있는 경우를 많이 찾아 볼 수 있을 것이다.

미디장비 자체는 어차피 하드웨어이기 때문에 OSCulator 과 같은 라우터 역할을 하는 소프트웨어를 이용해야지만 동적으로 사운드 장비 제어를 위한 프로그램과의 연결이 가능하다. 다시 말해 OSCulator 이 중간에 어탭터 형태로 연결되어 개발자가 만든 컨텐츠에서 OSC 를 구현한 메시지를 전송하게 되면 OSCulator 에서 그 메시지를 다시 미디 장비가 이해할 수 있는 신호로 변환해 주는 역할을 하게 된다. 사운드를 제어하는 인터랙티브 컨텐츠 제작을 원한다면 위 소프트웨어를 사용한다면 간단히 해결할 수 있을 것이다.

TouchOSC 도 OSC 를 구현한 대표적인 사례이다. 다만 이 소프트웨어는 iPhone,iPad 에서 사용되는 App 형태의 소프트웨어이다. 위 OSCulator 와 함께 iPhone 및 iPad 와 같은 무선 네트워크 장비를 활용해 사운드 제어를 하는데 상당히 효과적이다. 또한 전용 Editor 를 제공하여 사용자가 직접 iPhone 및 iPad 상에서의 UI 를 만들수 있어서 필자는 이 App을 사운드제어를 위한 목적으로 사용하기 보다는 오프라인 컨텐츠에서 캘리브레이션 메뉴제어를 위해 사용하고 있다. 물리적으로 멀리 떨어져있는 PC 에서 작동되는 컨턴츠 옵션을 변경하기 위해 iPhone 을 활용해 환경설정을 하는것이 여러모로 상당히 편하다.

기본적으로 TCP/IP 나 UDP 소켓을 사용하여 통신을 하는 구조이기 때문에 연결하는 host 와 port 번호만 유의하여 사용한다면 Flash/AIR 나 C++/.NET 환경에서도 별다르게 문제없이 사용가능할 것이다.


——————–

——————–

Unity & Flash – Friends

얼마전 San Francisco 에서 열린 Flash Gaming Summit 에서 Adode 가 Beta 버전의  Flash Player 인 Molehill 이 발표되었다.

이에 맞춰 Unity 가 Build platform 으로  Flash Player (Molehill) 를 지원하게 될거라는 충격적인 소식을 전했다. Flash Player 도 본격적으로 GPU 가속을 지원하기 때문에 Unity 가 Flash 를 지원할 수도 있을거란 생각을 가졌지만 실제로 이렇게 공식적인 지원을 발표할 줄을 몰랐다.

Unity 의  Web 3D 쪽에서 최대 약점인 낮은 플러그인 형태의 Player 배포율이 이 발표로 인해 한번에 해결될 수 있다는 의미이다. Unity 에서 제작하고 배포는 Flash Player 로 가능하다는 것이다. Flash 를 지원하는 만큼 개발언어도 ActionScript 를 지원한다. Unity 에서 제공하는 ActionScript API 를 이용하면 Flash 개발자도 Unity 에서 개발이 가능하다.

Flash 도 Molehill 로 인해 3D 컨텐츠를 개발가능할 수 있게 되었지만 아직은 low-level Shader 수준의 API 지원이라서 3D 개발에 있어 통합 IDE 가 없는 상태이다. 이 부족한 부분을 Unity 의 직관적인 tool 로 대체하여 개발한다면 Unity 와 Flash 양측다 득이 되는 제휴인것이다.

하지만 미래는 누구도 알 수 없다. 이 전략적 제휴로 인해 서로에게 기술이 흡수될 수도 있는 여지가 충분이 남아있다고 생각한다. Adobe 가 과연 3D IDE 를 어떤식으로 내놓을지 상당히 궁금해진다.

관련기사 : http://blogs.unity3d.com/2011/02/27/unity-flash-3d-on-the-web/

Online 3D Platform & Flash Developer

점점 온라인 플랫폼 시장이 3D 컨텐츠 중심으로 재편되어가는 것 같다. 사용자들은 기존에 경험하지 못했던 새로운 것을 원하고 시장은 늘 그 요구에 충족 시켜주는 구도로 볼때  어쩌면 자연스런 흐름이고 예정된 수순이였다.

온라인 3D 플랫폼은 크게 오픈소스 진영을 대표하는 WebGL 과  플러그인 기반의 Unity 3D 나 Adobe Flash 와 같은 기술이 대표적이다.

물론 Flash 는 현재 버전의 Flash Player 에서는 공식적으로 3D 게임과 같은 하드웨어 가속을 지원하지는 않지만 2011년도 전반기 내에 Molehill 이라는 low-level 의 GPU 가속 3D API 을 내놓을 것이라고 발표했다.
벌써 Alternativa3D 나 Away3D, Flare3D 같은  Flash 3D Framework 에서 도입하여 데모영상을 공개하였다. 영상만 가지고 속단할 수 없지만 기술문서에 따르면 기존의 Flash Player 10.1 에서의 렌더링 속도가 Z-buffer 가 없는 폴리곤 수천개를 30 fps 의 속도로 연산할 수 있었지만 새로운 API 에서는 Z-buffer 가 있는 폴리곤 수백만개를 full-hd 해상도에서 60 fps 의 속도로 연산가능하다고 한다.

이런 기술을 바탕으로 앞으로 Flash 를 이용하여 온라인 3D 게임을 개발 할 수 있는 환경이 점차 갖춰질 것으로 생각이 든다. 2D 개발에서의 개발편의성을 바탕으로 그동안 취약점으로 여겨졌던 3D 개발까지 본격적으로 지원된다면 Flash 기술은 다른 어떠한 플랫폼보다도 향후 시장을 선점할 수 있는 좋은 발판을 마련할 수 있을 것이다.

하지만 Flash 는 여전히 Flash Player 의 안정성 및 플러그인 기반에 따른 문제점을 드러내고 있다. 물론 Flash Player 가 플러그인이긴 하지만 보급율에 있어서 다른 플랫폼과는 거의 비교가 불가할 정도로 높기 때문에 사용자가 설치에 대한 거부감을 가질 수 있는 문제는 그렇게 많지는 않다.  그러나 점점 별도의 플러그인 없이 브라우저내에서 동작가능한 기술들이 속속 등장하면서 Flash 의 가장 큰 장점인 설치 보급률이 어찌 보면 의미없는 숫자가 될 가능성이 있다는 것이다.

Unity 3D 는  현재 나와있는 모든 플랫폼을 지원하는 유일한 엔진이다. Web,Standalone,Mobile(iOS,Android) 뿐만 아니라 Xbox,PS,Wii 와 같은 Console 게임도 지원이 가능하다. 또한 기존의 게임엔진과는 다르게 손쉬운 사용과 직관적인 툴로 인해 개발 생산성이 상당히 높다는 점이 장점이다.  이런한 무기들을 바탕으로 관련 개발자들이 전세계적으로 폭발적으로 늘어나는 추세이다. 실제로 Unity 제작사가 북미게임 웹진인 gamasutra 에서 세계 5대 게임 회사로 선정되었을 만큼 앞으로가 기대되는 엔진이다.

현재 Flash 가 점유하고 있는 수많이 온라인 캐쥬얼 게임이 Unity 3D 의 잠재시장이며 이미 많은 모바일 게임들이 Unity 를 이용하여 개발하고 있는 추세이다.

하지만 Unity 는 플러그인 방식으로서 사용하려면 사용자가 직접 설치과정을 거쳐야한다. 보급률이 아직까지는 웹에 사용할 만큼 높지 않은 관계로 어떤식으로 플레이어를 확산시키는가에 대한 문제를 가지고 있다. 반가운 소식은 google 크롬브라우저에 플러그인이 직접 임베드된다는 이야기가 있었다.

만약 그렇게 된다면 Unity 의 발목을 잡고 있었던 플레이어 보급률 확장에 있어 상당한 힘을 실어줄거라고 판단이 든다. 이 부분은 좀더 지켜봐야할 부분이다.

얼마전 Google Chrome 9 에서는 WebGL 을 기본적으로 지원한다고 발표했다. WebGL 은 그래픽카드의 하드웨어 가속기술을 사용하여 웹 브라우저 내에서 특별히 플러그인 없이 3D 컨텐츠를 원할하게 작동시킬 수 있는 기술이다. 이 기술을 활용하면 Web 에서 Flash Player 나 Unity Player 없이도 3D 컨텐츠를 사용할 수 있다는 의미이다. 어떻게 보면 가장 진일보하고 웹표준에 가장 근접한 기술이다. 하지만 이또한 모든 브라우저에서 WebGL 을 지원하는 않으며 기술 또한 표준화가 이루어질려면 적어도 몇년은 지나야 제대로된 컨텐츠를 제작할 수 있을것이다. 그리고 브라우저내에서 작동하는 방법으로 모든소스코드가 공개되는 문제가 들어나 얼마나 상용컨텐츠 제작회사들이 이를 이용할지 미지수이다.

그야말로 현재 온라인 3D 플랫폼은 춘추적국시대이다. 어떠한 플랫폼이 표준으로 자리잡을지 누구도 알 수 없다. 기술 변화속도가 워낙 빨라 현재의 유망기술이 한순간에 쓸모없는 기술로 변할 수 있다. 더욱이 어느 한개의 기술에 종속되어 개발하는 개발자라면 그 결과에 울고 웃을 수 있다라는 점은 자명한 사실이다. 물론 모든 유망한 기술들을 다 익히면 해결되는 문제이지만 그렇게 기술들이 호락호락하지 않다.

분명한 점이 현재의 흐름은 3D 라는 점이다. 그 기술이 Flash 가 되었건 Unity 가 되었건간에 중심은 3D 기술이다. 이 사실은 아마 변하지 않을 것으로 생각이 든다. 우선 3D 기술의 원리, OpenGL , Shader 등등 3D 에 기본적인 기술을 갖추어 준비한다면 앞으로 도래하는 3D 기술을 사용하는데 있어 상당한 우위를 점할 수 있을 것이다.

Flash Player 의 3D 가속지원으로 앞으로 누구나 공개된 영상처럼 3D 컨텐츠를 개발할 수 있다고 생각하는 플래시 개발자가 많을 것이다. 앞으로 공개되는 Flash 3D API 는 정말 Low-level 수준의 Shader API 이어서 전문적인 3D 개발자가 아니라면 쉽게 퀄리티 있는 3D 컨텐츠를 개발한다는 것이 생각보다 쉬운것이 아니다. 물론 Alternativa3D 나 Away3D, Flare3D 같은  Flash 3D Framework 가 이를 이용하여 좀더 쉽게 사용할 수 있도록 High-level 수준의 API 를 제공할 것이다. 하지만 기술적인 이해를 바탕으로 접근한 전문개발자들이 보다 기술대처에 빠르게 대응할것이고  제대로된  GPU 기능을 활용하여 멋진  3D 컨텐츠들을 만들어 낼것이다. 점점 개발자들 사이에서의 기술편차가 커질것이 분명하다.

플래시 … 상당한 매력적인 기술이다. 디자인 툴에서 출발해 현재는 개발툴로서 변화하였고 인터랙티브 컨텐츠에 있어서 어떠한 툴보다 경쟁력이 있는것은 사실이다. 또한 이런툴을 사용하는 플래시 개발자들도 Unity 나 HTML5 와 같은 향후 등장하는 기술들을 활용하여 인터랙티브한 컨텐츠 개발할 수 있는  상당한 경쟁력을 가지고 있다고 생각한다. 혹시나 미래에 Flash 기술이 사라진다고 해도 그걸 대체하는 기술들을 활용하는 사람들은 분명 플래시 개발자들이 한 축을 형성할 것이다.

플래시개발자들….새로운 기술에 대해 너무 두려워말자.

앞으로의 3D 기술들을 차근히 준비하면 분명 자신도 모르는 사이에 Gears of War 와 같은 컨텐츠를 Flash 에서 제작할 수 있을지도 모를일이다.

[Unity] Inverse Kinematics Solution

IK(Inverse Kinematics)는 주로 캐릭터 애니메이션 작업을 할때 사용되는 것으로 애니메이터가 일일이 캐릭터 관절의 회전으로 움직임을 만드는 것이 아닌 손끝이나 발끝과 같은 end effector 의 움직임에 따라 자연스럽게 그 이하 관절들이 움직일 수 있게 만들어 준다.

3D Max 나 Maya 같은 3D 모델링 툴내에서는 편하게 구현되어 있어서 단지 가져다 적용만 하면된다. 하지만 프로그래밍을 이용해 동적으로 제어할려면 실제로 구현하는 방법 밖에는 없다.

일반적으로 2D 공간에서의 IK 구현은 비교적 간단하게 만들 수 있지만 3D 상에서의 IK 는 상당히 까다롭다.

2D 에서의 회전축이 1개인 반면 3D 에서는 3개로 늘어나게 되어 일반적인 오일러 방식의 회전구현으로는 짐벌락(gimbal lock) 현상을 피할 수 없기 때문에 쿼터니안(Quaternion) 방식으로 하는것이 시행착오를 줄이는 방법이 될 것이다.

리서칭 해본 결과 다행히도 C++ 로 만든 IK 구현 소스 코드가 있어 Unity 에서 사용할 수 있게 C# 으로 포팅해 봤다.

http://www.darwin3d.com/gdm1998.htm#3DIKSTUFF

위 사이트에서 CCD3D.cpp 소스코드를 기반으로 하여 포팅하였는데 특별히 관절 움직임에 제한을 두지 않는다면 별다른 무리없이 동작한다.하지만 관절 회전값을 제한해 놓고 범위 이상으로 직접 움직인다면 갑작스럽게 튀는 현상이 발생한다.

Download the source file…

using UnityEngine;
using System.Collections;
 
///
 
///  Original source code :   http://www.darwin3d.com/gamedev/CCD3D.cpp
///  This class is ported on the original source code for Unity
/// 
 
public class IKSolverRestriction : MonoBehaviour
{
 
	[System.Serializable]
	public class BoneEntity
	{
		public Transform bone;
		public bool restrictionEnabled;
		public Restriction restrictionRange;
	}
 
	[System.Serializable]
	public class Restriction
	{
		public float xMin = 0.0f;
		public float xMax = 360.0f;
		public float yMin = 0.0f;
		public float yMax = 360.0f;
		public float zMin = 0.0f;
		public float zMax = 360.0f;
	}
 
	public Transform target;
	public BoneEntity[] boneEntity;
	public bool damping = false;
	public float dampingMax = 0.5f;
 
	private float IK_POS_THRESH = 0.125f;
	private int MAX_IK_TRIES = 20;
 
	void Start ()
	{
		if (target == null)
			target = transform;
	}
 
	void LateUpdate ()
	{
		Solve ();
	}
 
	public void Solve ()
	{
 
		Transform endEffector = boneEntity[boneEntity.Length - 1].bone;
		Vector3 rootPos = Vector3.zero;
		Vector3 curEnd = Vector3.zero;
 
		Vector3 targetDirection = Vector3.zero;
		Vector3 currentDirection = Vector3.zero;
		Vector3 crossResult = Vector3.zero;
 
		float theDot = 0;
		float turnRadians = 0;
		float turnDeg = 0;
 
		int link = boneEntity.Length - 1;
		int tries = 0;
 
		// POSITION OF THE END EFFECTOR
		curEnd = endEffector.position;
 
		// QUIT IF I AM CLOSE ENOUGH OR BEEN RUNNING LONG ENOUGH
		// SEE IF I AM ALREADY CLOSE ENOUGH
		while (tries < MAX_IK_TRIES && (curEnd - target.position).sqrMagnitude > IK_POS_THRESH) {
 
			if (link < 0) {
				link = boneEntity.Length - 1;
			}
 
			rootPos = boneEntity[link].bone.position;
			curEnd = endEffector.position;
 
			// CREATE THE VECTOR TO THE CURRENT EFFECTOR POS
			currentDirection = curEnd - rootPos;
			// CREATE THE DESIRED EFFECTOR POSITION VECTOR
			targetDirection = target.position - rootPos;
 
			// NORMALIZE THE VECTORS (EXPENSIVE, REQUIRES A SQRT)
			currentDirection.Normalize ();
			targetDirection.Normalize ();
 
			// THE DOT PRODUCT GIVES ME THE COSINE OF THE DESIRED ANGLE
			theDot = Vector3.Dot (currentDirection, targetDirection);
 
			// IF THE DOT PRODUCT RETURNS 1.0, I DON'T NEED TO ROTATE AS IT IS 0 DEGREES
			if (theDot < 0.99999f) {
 
				// USE THE CROSS PRODUCT TO CHECK WHICH WAY TO ROTATE
 
				crossResult = Vector3.Cross (currentDirection, targetDirection);
				currentDirection.Normalize ();
 
				turnRadians = Mathf.Acos (theDot);
				turnDeg = turnRadians * Mathf.Rad2Deg;
 
				if (damping) {
					if (turnRadians > dampingMax)
						turnRadians = dampingMax;
					turnDeg = turnRadians * Mathf.Rad2Deg;
				}
 
				boneEntity[link].bone.rotation = Quaternion.AngleAxis (turnDeg, crossResult) * boneEntity[link].bone.rotation;
 
				if (boneEntity[link].restrictionEnabled)
					CheckRestrictions (boneEntity[link]);
			}
 
			tries++;
			link--;
		}
	}
 
	void CheckRestrictions (BoneEntity boneEntity)
	{
 
		// FIRST STEP IS TO CONVERT LINK QUATERNION BACK TO EULER ANGLES
		Vector3 euler = boneEntity.bone.rotation.eulerAngles;
 
		// CHECK THE DOF SETTINGS
		if (euler.x > boneEntity.restrictionRange.xMax)
			euler.x = boneEntity.restrictionRange.xMax;
		if (euler.x < boneEntity.restrictionRange.xMin)
			euler.x = boneEntity.restrictionRange.xMin;
		if (euler.y > boneEntity.restrictionRange.yMax)
			euler.y = boneEntity.restrictionRange.yMax;
		if (euler.y < boneEntity.restrictionRange.yMin)
			euler.y = boneEntity.restrictionRange.yMin;
		if (euler.z > boneEntity.restrictionRange.zMax)
			euler.z = boneEntity.restrictionRange.zMax;
		if (euler.z < boneEntity.restrictionRange.zMin)
			euler.z = boneEntity.restrictionRange.zMin;
 
		// BACK TO QUATERNION
		boneEntity.bone.localRotation = Quaternion.Euler (euler);
	}
}

Project epilogue : Circle display, Interactive 3D Stereoscopic Movie

Hyper Circle 이라는 솔루션은 사용자가 직접 참여해서 3d 입체 컨텐츠를 좀더 몰입해서 체험할 수 있는 원형 디스플레이 시스템이다.

시스템 자체에 여러기술들이 한꺼번에 사용되어있어 정확하게 정의하기에 좀 복잡하기는 하지만 한마디로 사용자가 마음대로 조종할 수 있는 3D 입체영상이라고 생각하면 쉬울 것이다. 올해 초에 아바타라는 영화로 인해 3D 입체 영상이 엄청난 이슈가 되고 있고 현재도 많은 컨텐츠들이 3D 입체로 제작되고 있다.

이 솔루션은 이런 입체영상에서 한단계 더 나아가 사용자가 직접 참여해서 즐길 수 있는 인터랙티브한 요소를 첨가한 플랫폼이다.

Circle display

반경 3m 지름 약 6m 를 기준으로 120도 정도의 곡률을 가진 원형 스크린으로 구성되어있으며 이로 인해 일반적인 평면 스크린보다 사용자에게 상당한 몰입감을 주게 된다. 원래는 360도 형태의 완전한 원형스크린으로 구성하려 했지만 공간상의 제약으로 인해 일부분만 구현하게 되었다. 사람눈이 한번에 볼수 있는 각도가 120도 내외 인점에서 어찌 보면 부담스럽지 않은 곡률이라고 판단이 든다.

3D Stereoscopic movie

현재 가정용 3D TV 에서 사용하는 shutter glass 방식이 아닌 원편광방식으로 구현되었다. 일반적으로 극장에서 구현되는 방식과 같은것으로 현재의 비싼 3d 안경의 가격이 내려가지 않는 이상은 편광방식이 고수될 것 같다. 가장 이상적인것은 무안경식 3D 화면을 만드는 것이지만 현재까진 기술적인 한계로 인해 한동안은 답답한 안경을 쓰고 입체 컨텐츠를 즐겨야할 것이다.

Realtime Motion Controller

이전 프로젝트에서 사용했던 TOF(time of flight) 카메라인 Mesa 제품을 사용하여 사용자의 full body gesture 를 잡아낼 수 있는 동작 인식 시스템이다. 원리나 작동방식은 MS Kinect 와 흡사하다. 3d 카메라를 통해 촬영된 영상을 통해 사람 신체 관절을 인식하여 사용자의 움짐임을 파악하여 컨텐츠를 컨트롤 할 수 있다. 사용자가 카메라 앞에서 제자릴 걸음을 하게 되면 실제로 걷는 것과 같이 컨텐츠가 앞으로 진행하게 되고 몸을 좌우로 움직이게 되면 해당 방향으로 화면시점을 변경시킬 수 있다. 또한 양팔을 앞으로 뻗게 되면 공중을 날아올라 bird view 를 체험 할 수 있다.

Unity 3D

모든 컨텐츠 구성이 3d 형태로 일반적인 2D 개발 툴로는 구현에 한계가 있다. 이번 프로젝트에  본격적으로 Unity 를 개발툴로 사용하여 3d 비쥬얼을 제작하였다. 개발생산성은 기존에 사용했던 Adobe Flash 와 비교했을때 오히려 더 뛰어난것 같다. 다만 구현하는 범위가 3d로 확장된 만큼 훨씬 더 비쥬얼 표현이 자유로워졌기 때문에 발생하는 개발 범위 제한이 고민거리였다. 이 툴로 인해 비교적 하드웨어의 성능의 제약을 덜 받는 오프라인 인터랙티브 컨텐츠 제작에 상당한 힘을 실어줄 수 있을 것 같다.

2010.07.08~07.11 4D Art Performance 고궁박물관

2010.10.12~10.14  제 11회 세계 지식 포럼

Related articles

문화재와 첨단의 만남…”3D·4D로 더 생생하게”

신체 컨트롤러의 진화, 3D와 만나다

[Unity] Unity 3 preview : Lightmapping

Unity 3 에서 여러가지 새로운 기능들이 추가되었지만 가장 눈의 띄는 것중에 하나가 Beast 라는 lightmapping 툴이 통합된 점이다. 3D 에서 렌더링 퀄리티의 판단은 아마 광원(lighting) 과 그림자(shadow) 표현이 대부분을 차지할 것이다.

하지만 이런 프로세스를 게임과 같은 컨텐츠에서 실시간으로 처리하기에는 너무 프로세스의 양이 많기 때문에 정적인 광원과 그림자는 실시간으로 렌더링하지 않고 미리 라이트맵 이라는 것을 사용하여 좀더 사실적인 3D 환경을 구성한다.

view demo

이전 버전(2.6.x) 에서는 이런 라이트맵 생성을 3D Max 나 Maya 과 같은 외부 렌더링 툴을 이용하여 라이트맵을 베이킹하여 사용하였지만 3.0 버전에서는 Unity 에서  Beast 라는  라이트맵 툴이 이 역할을 대신 해 준다. 아래 메뉴가 unity 에 통합되어있는 라이트 맵툴에서 가장 옵션이 많은 부분이다. 기존의 다른 렌더러에 수많은 라이트 옵션에 비하면 상당히 간단한 편이다.

GI(global illumination) 기능을 사용한 실사의 라이팅 표현 및 라이트 UV 맵까지 자동으로 알아서 생성해줘서 일일이 맵을 잡아줘야하는 수고를 엄청 덜 수 있다. 하지만 고퀄리티의 라이트 표현을 하는 만큼 라이트 맵 렌더링 시간이 옵션에 따라 기하급수적으로 늘어날 수도 있어 적절하게 조절을 해야한다.

가장 렌더링 시간을 잡아먹는 부분이 라이트맵의 사이즈를 결정하는 Resolution 부분이다. 단위 unit 당 texture 를 나타내는  pixel 갯수를 얼마로 할지 나타내는 값으로 이 값이 커질수록 맵사이즈가 늘어나게되어 퀄리티가 정교해지긴하지만 상대적으로 렌더링 시간이 오래 걸리게 된다.

Download the source file….

[Unity] How to get a texture on the terrain

Unity 는 지형을 생성하고 디자인하는 방법이 마치 포토샾에서 이미지 리터칭하는 것과 같이 브러쉬를 이용하여 높이의 고저를 표현할 수 있다. 또한 지형에 텍스쳐를 드로잉하는 방법도 같은 방법으로 alpha map 이라고 하는 splat map 을 사용하여 해당 텍스쳐의 맵 데이타를 구분하여 저장, 각각을 서로 블렌딩하여 표현해주는 방법을 사용하고 있다.

하지만 툴자체에서 텍스쳐링을 하는 방법은 상당히 쉬운반면,  script 로 접근하여 해당 위치의 텍스쳐를 얻어내는 방법은 위 내용을 알지 못하고서는 상당히 난해한 내용일 수 있을 것이다.

만약 player 가 지형을 움직이고 있을 때 각각 다른 지형텍스쳐 위에서의  발자국 소리를 구현한다고 했을때 가장 명괘한 방법이 어떤것일까?

가장 먼저 쉽게 접근할 수 있는 방법으로는 collider 의 trigger mode 를 이용하여 체크하는 방법이 있다. 하지만 이 방법은 실내와 같이 명확하게 오브젝트 중심의 mesh 형태의 구성에 알맞다. 즉, 지형과 같은 오브젝트일 경우 실내에 비해 크기가 훨씬 커서 정확하게 collider 로 체크하는것이 비효율적일 수 있다.

여기에서 위에서 설명한 alpha map 을 활용하여 접근한다면 한결 수월하게 위 문제를 해결 할 수 있을 것이다. 우선 아래 지형 이미지와 코드를 살펴보자.

using UnityEngine;
public class PlayerHitCheck : MonoBehaviour
{
 
	private TerrainData terrainData;
	private Vector3 terrainPos;
	private string resultText;
 
	void Start ()
	{
		terrainData = Terrain.activeTerrain.terrainData;
		terrainPos = Terrain.activeTerrain.transform.position;
	}
 
	float textureIndex1;
	float textureIndex2;
 
	void Update(){
 
		int mapX = Mathf.RoundToInt(((transform.position.x - terrainPos.x) / terrainData.size.x) * terrainData.alphamapWidth);
		int mapZ = Mathf.RoundToInt(((transform.position.z - terrainPos.z) / terrainData.size.z) * terrainData.alphamapHeight);
 
		float[,,] splatmapData = terrainData.GetAlphamaps(mapX, mapZ, 1, 1); 
 
		textureIndex1 = splatmapData[0,0,0]; //grass texture
		textureIndex2 = splatmapData[0,0,1]; //sand texture
 
		resultText = " grass  : "+textureIndex1+"\n sand : "+textureIndex2;
 
	}
 
	void OnGUI(){
		GUI.BeginGroup (new Rect (10, 10, 200, 40));
		GUI.Box(new Rect (0, 0, 200, 40),resultText);
		GUI.EndGroup ();
	}
 
}

지형 텍스쳐는 간단하게 잔디와 모래 2종류로 구성되어있고 해당 텍스쳐 위로 FPC(First Person Controller) 가 접근할때 그 아래있는 텍스쳐의 alpha map 데이타를 추적하는 샘플이다. 가장 핵심적인 역할을 하는 부분이

//Method
//float[,,] GetAlphamaps (int x,int y,int width,int height)
 float[,,] splatmapData = terrainData.GetAlphamaps(mapX, mapZ, 1, 1);

이 부분으로 player 가 있는 영역을 기준으로  TerrainData 에서 3차원 배열 텍스쳐 값을 얻어내는 메서드이다. 이 메서드는 Unity 2.6.x 에서는 공식적으로 명문화된(undocumented) 메스드가 아니지만 Unity 3 에서는 문서화 되어 공식화 되었다. 2.6.x 버전사용자들도 물론 사용가능하다.

여기서는 player 바로 아래 1×1 픽셀 짜리 영역만 체크하면 되므로 width 와 height 값을 모두 1로 설정하였다. x,y 값은 alpha map 사이즈를 기준으로 한 player 의 정수 좌표를 의미한다. 더 넓은 영역을 추출하려면 width,height 값을 원하는 값만큼 설정하면 된다. 이를 통해  splatmapData 라는  3차원배열(float[,,]) 을 얻을 수 있는데 의미는 다음과 같다.

해당 영역에서의 alpha map 가중치(0~1)) = splatmapData[x축의 pixel index, z축의 pixel index , 텍스쳐 layer index]

예를들어 player 아래에 2×2 영역의 alpha map을 체크한다고 했을 때 아래와 같은 이미지로 정리할 수 있다.

샘플에는 2개의 텍스처만 사용했기 때문에 splatmapData 의 texture layer index가  1까지 존재하였지만 만약 더 등록한다면 등록된 순서대로 인덱스가 정해지게 된다.

위에서 설명했듯이 샘플의 경우는 1×1 픽셀 한개를 체크한 경우라 splatmapData[0,0,0], splatmapData[0,0,1] 과 같이 2개의 가중치만을 얻었다.

그리고 이 가중치는 0~1 까지의 범위의 값인데 해당텍스쳐의 알파값의 정도를 의미하는 것으로 이 값이 0일 경우는 해당 텍스쳐가 없는 경우이고 반대로 1일 경우는 해당 텍스쳐만 존재한다는 의미이다.

따라서 이 값을 사용하면 여러가지 텍스쳐가 알파블렌딩 된 지형텍스쳐를 사용한다고 해도 그 가중치에 맞게 player 발자국 소리를 조합하여 사용할 수 있을 것이다.

download sample files

Unity 3D Basic API Hierarchy

Unity 는 스크립트 언어로 Javascript 와 C# 를 지원하는데 둘의 차이는 크지 않다.  전반적인 구조는 일반적인 프로그래밍 언어와 마찬가지로 Object 를 중심으로 상속관계를 맺어가는 구조이다. 그리고 Component 와 Behaviour 를 주축으로 확장해 나가는 방식으로 구성되어있다.  간략한 형태로 아래와 같이 상속관계를 도식화하여 나타내보았는데 물론 하위에 수많은 확장클래스는 제외하고 어느정도 Unity 에서 가장 기본이 되는 것들 위주로 정리해 보았다.

왠만한 기능들은 엔진 자체에서 처리해 주는 것들이 많아 생각보다 Class 의 갯수가 많지 않다고 생각들 수 있지만 C# 을 기본 언어로 지원하는 만큼 C# 의 System namespace 의 기능들을 고스란히 사용할 수 있다는 점에서는 알아야 할 내용이 적다고는 할 수 는 없을 것이다.

그래도 강력한 비쥬얼 에디터를 지원하는 만큼 3D 공간을 머리속으로만 상상하면서 코딩하는 어려움을 상당부분 해결할 수 있으면서  그만큼 엉청난 코드의 양이 줄어들 수 있다는 점에서 정말 혁신적인 툴인것 같다.

Tween in Unity3D

심리스(seamless)한 컨텐츠 제작에 있어 필수적인 요소중 하나가 트윈(tween) 스크립트 일것이다. Flash 가 점점 인터랙티브 컨텐츠 제작툴로서 자리를 잡아가면서 TweenLite,Tweener 와 같은 Falsh Open API  트윈엔진들이 개발되어 트윈 스크립트에 대한 부담감을 상당히 덜어주었다. 사실 이런 트윈엔진들의 도움없이 정교한 script animation easing 조절이 쉽지 않을 뿐더러 컨텐츠 제작시에 오히려 주객전도가 되어 이런처리들을 하느라 많은 시간을 할애해야 하는 경우가 발생한다. 물론 간단한 이징공식을 이용하여 구현하는 것이 가능하긴하지만  이런경우는 다양한 이징함수의 움직임을 이용하여 좀더 다이나믹한 움직임을 구현하는것과는 분명 움직임에 있어 차이가 나는것이 사실이다. 따라서 새로운 개발툴을 접할 시에는 항상 이런 기본적인 트윈엔진의 유무를 살펴보곤한다.

Unity3D 를 다루면서도 이런 트윈엔진이 분명있을거라 생각하고 찾아봤는데 Flash 만큼은 아니지만 3~4개 정도 찾을 수 있었다. 다만, 아직 많이 사용하는 툴이 아니다 보니 개인적으로 만들어 쓰는 형태라 아직까지는 대부분 기능이 다양하지 못하고 체졔적이지 못한게 약간은 아쉬운 부분이긴하다. 그중에서도 가장 완성도가 높은 iTween 이라는 Unity3d Tween Engine 을 소개할까 한다.

우선 공식 사이트를 한번 살펴보자. 언듯보면 TweenLite,TweenMax 의 사용법과 비슷하다. 아니 거의 같다고 보면 된다.  그도 그럴것이 위 엔진들을 기반으로 해서 만들었다고 하니 사용경험이 있는 Flash 개발자들은 한두번만 사용한다면 어렵지 않게 적용할 수 있을 것이다.

private var targetGameObject : GameObject;
 
function Awake(){
	targetGameObject = gameObject;
}
 
function Start(){
	iTween.moveTo(tweenTarget,{"x":1.7,"y":3,"time":1.3,"transition":"easeInExpo","delay":1.2,"onComplete":"TweenComplete"});
}
 
function TweenComplete(){
 print("TweenComplete");
}

Unity3D 의 스크립트 언어가 Javascript / C# 으로 Flash  Actionscript 와 문법이 비슷한지라 기본적인 코드를 읽는데 큰 어려움이 없어 Flash 개발자가 접근하기 한결 수월 하다. 아마도 Flash 에서의 3D 구현에 아쉬움을 느낀 많은 Flash 개발자들의 참여로 인해 올한해 가장 기대가 되는 툴이기도 하다.

Game Development Tool : Unity3D

Integrated Editor Everything is done through Unity’s simple user interface. Thousands of hours of thought and spit-polish have gone into it. Read more

Graphical Power Unity has a highly optimized graphics pipeline for both DirectX and OpenGL. Read more

Asset Importing All major file formats are supported, and almost any art application can be used with Unity. Read more

One-Click Deployment Unity supports a wide range of platforms when you release your work to the come alive. Read more

Wii Publishing The industry’s most popular console just got a lot easier to develop for… Read more

iPhone Publishing Revolutionary game development comes to a revolutionary device. Read more

Shaders Unity’s shader system combines ease of use, flexibility and performance. Read more

Terrains Vast, densely foliaged landscapes that run smoothly on low-end hardware. Read more

Networking Go from single-player to full realtime multiplayer games. Read more

Physics Bring your interactions to life with the built-in Ageia PhysX™ physics engine. Read more

Audio & Video Mix realtime 3D graphics with streamed audio and video. Read more

Scripting Blazing fast .NET-based JavaScript and C#, with rich libraries and great documentation. Read more

Unity Asset Server The Unity Asset Server is an add-on product which adds version control to Unity. Read more

Shadow & Light Realtime soft-shadows and baked lightmaps, spiced up with halos and lens flares. Read more

Documentation We provide you with step by step tutorials, documentation and example projects. Read more

from http://unity3d.com

3D game 개발 툴로 많이 사용되고 있으며 인터페이스가 3D 모델링 툴과 비슷하여 모델링툴을 다뤄봤던 경험이 있다면 쉽게 접근할 수 있다.
특히 하드웨어 가속을 지원하고 있고 Flash 플레이어의 미미한 하드웨어 가속 기능과 비교했을때 엄청난(?) 성능을 보여주고 있어 인스톨레이션과 같은 웹이 아닌 다른 플랫폼의 컨텐츠를 제작할 때 상당한 힘을 발휘 할 것으로 보인다.
3D 게임 개발용도로 쓰이기 때문에 물리엔진이 탑재되어 있으며 각  오브젝트를 제어할 수 있는 스크립트 언어를 제공하여 궁극의 방향이라고 할 수 있는 3D 게임을 생각보다 쉽게 구현할 수 있는 환경을 제공해준다. 스크립트 언어는 자바스크립트와 C# 이 주로 사용되고 액션스크립트에 익숙한 플래시 개발자라면 쉽게 배울수 있다.

지원하는 플랫폼은 데스크탑,Wii 콘솔게임,i-phone 게임 뿐만아니라 Web 도 플래시 플레이어와 같이 플러그인 방식으로 지원한다.

아래 링크에 데모버전이 있는데 웹플러그인 방식이라 플레이어를 설치한 후에 확인하면 된다.

Demo site
http://unity3d.com/gallery/live-demos/tropical-par