System.out.println("Hello, World");

'프로그래밍/3D 프로그래밍'에 해당되는 글 13건

  1. 2012.09.03 유니티 ResourceManager
  2. 2012.08.30 유니티 이동
  3. 2012.08.30 유니티 Rect
  4. 2012.08.29 4. Transform
  5. 2012.08.29 3. 유니티 Component와 GameObject 1
  6. 2012.08.28 2. 유니티 스크립트 컴파일
  7. 2012.08.28 1. 유니티 OnGUI, Start(), Update() 등등
  8. 2012.04.20 3D프로그래밍 - 정리
  9. 2012.04.20 3D프로그래밍 - 카메라
  10. 2012.04.19 3D게임프로그래밍기본 - 변환 1



Posted by 김마농



Vector2D A;

Vector2D B;


A.Set(1,1);

B.Set(4,2);

Vector2D tmp = B - A;

tmp.normalize();

m_reDraw.x += tmp.x;

m_reDraw.y += tmp.y;


A와 B의 방향벡터를 구한다. 그후 정규화 시키고 A의 x에다 방향벡터 x를 계속 더해 주고

A의 y에다 방향벡터의 y를 계속 더해주면 직선으로 이동하게 된다.

Posted by 김마농

Rect

Rect 구조는 주로 2차원 작업에 사용되며 UnityGUI 시스템은 위치 카메라뿐만 아니라 광범위하게 사용된다.

new Rect(float left, float top, float width, float height)

  [사각형  위치   ]   [  너비    ] [    높이   ]

Posted by 김마농

1. Transform

- Scene의 모든 개체는 변화된다. 개체의 위치, 회전 그리고 스케일을 저장하기 위해 사용되어진다. 

  모든 변호나은 계층적으로 위치, 회전, 및 규모를 적용할 수 있는 부모를 가질 수 있다. 이것은 계층패널에

  서 볼 수 없었던고, enemerator를 지원하고 자식들을 통해서 루프할 수 있다.



변수 

 

position 

전체 공간에서 변환의 위치 

localPosition 

부모의 변환에 대해 상대적인 변환 위치 

eulerAngles 

오일러 각도에서의 회전 

localEulerAngles 

부모의 변환 회전에 대해 상대적인 오일러 각도에서의 회전 

right 

전체 공간에서 빨간 축의 변환 

up

전체 공간에서 초록 축의 변환 

forward 

전체 공간에서 파란 축의 변환 

 rotation

전체 공간에 저장된 변환의 위치 

localRotation 

부모의 변환 회전에 대해 상대적인 변환 회전 

localScale

부모에 대해 상대적인 변환 스케일 

parent 

부모의 변환 

worldToLocalMatrix 

지역공간에서 전체공간으로부터의 지점을 변환한 매트릭스(읽기 전용) 

localToWorldMatix 

전체공간에서  지역공간으로부터의 지점을 변환한 매트릭스(읽기 전용)

 root

계층 구조에서 최상위 변환을 되돌려라 

childCount 

변환이 가진 자식의 수 

lossyScale 

개체의 글로벌 스케일(읽기 전용) 



 함수

 

 Translate

방향과 거리의 변환을 움직이라 

Rotate 

회전을 적용한다. Z축, X축, Y축(순서대로) 

RotateAround 

변환을 회전하라 Axis 통해 지나가는 point 전체 좌표에 angle 각도 

LookAt 

[타겟]의 현재 위치에서 앞으로 벡터 점을 변환하고 회전한다. 

TransformDirection 

Direction 지역 공간에서 전체 공간까지 변환한다.

InverseTransformDirection

반대로 Direction 지역공간에서 전체 공간까지 변환한다. 

TransformPoint 

position 지역공간에서 전체 공간까지 변환한다. 

InverseTransformPoint

반대로 postion 지역공간에서 전체 공간까지 변환한다.

DetachChildren 

Unparents의 모든 자식 

Find 

자식을 찬는다. 

IsChildOf 

자식을 변환한다. 


Posted by 김마농

1. GameObject

- Object로 부터 상속 : 유니티 Scene들 안에서 모든 속성들을 위한 Base 클래스


 변수

 

 isStatic

 만약 게임오브젝트가 static이면 Editor는 오직 API를 명시한다.

 transform

 개체의 위치, 회전, 그리고 스케일

 rigidbody

 물리학 시뮬레이션을 통해 개체의 위치 제어

 camera

 카메라는 플레이어가 월드를 바라보는 장치

 light

 Light는 유니티 조명의 모든 요소들을 제어할 수 있다.

 animation

 애니메이션 컴포넌트는 애니메이션을 재생하기 위하여 사용된다.

 constantForce

 힘이 지속적으로 적용된다. 개체에 지속적인 힘을 적용하는데 사용되는 작은 클래스

 renderer

 렌더는 객체가 화면에 나타나게 만드는것.

 audio

 3D에서 오디오 소스를 표현하는 방식

 guiText

 GUI에서 텍스트 문자열이 표시된다.

 networkView

 네트워크 멀티 플레이어 게임의 재료

 guiTexture

 2D GUI에서 텍스쳐 이미지가 사용된다.

 collider

 모든 collider의 기본 클래스

 hingeJoint

 2개의 rigidbody의 HingleJoing 그룹과 함께 Hinge에 의해 연결된 이동 제한한다.

 particleEmitter

 입자 방출을 위한 스크립트 인터페이스

 layer

 게임 오브젝트 안에 있는 레이어

 active

 GameObjecr가 활성되었나 true/false 지정한다.

 tag

 태그는 게임 오브젝트를 규명하기 위해 사용된다. 사용하기전 매니저에서 선언한다.



Posted by 김마농

1. Standard Assets, Pro standard Assets, 혹은 Plugins 아래의 모든 스크립트 컴파일

-> 이 폴더내의 스크립트들은 다른 폴더의 스크립트를 "직접적으로 접근 할 수 없다.(참조 불가능)

클래스나 변수를 직접적으로 참조 할 수는 없지만 GameObjec.SendMessage를 통해 간접적으로 가능하다.


2. Standard Assets/Editor, Pro standard Assets/Editor 혹은 Plugins/Editor의 컴파일 

-> 메뉴 아이템이나 커스텀 위자드처럼 UnityEditor 네임 스페이스를 사용하는 에디터 코드를 작성하고자 한다면 이 폴더내에 스크립트가 있어야 한다.


3. Editor의 컴파일

-> 2번과 같이 UnityEditor 네임 스페이스를 사용하지만 표준 폴더(Standard Assets)이외의 위치에 있는 스크립트를 컴파일한다. 모든 이전 그룹을 참조가능하지만 4번 그룹은 참조가 불가능하다.


4. 그밖의 모든 스크립트의 컴파일

-> 위 그룹중 어디에도 속하지 않은 스크립트. 

이 그룹에 속한 스크립트는 1번 그룹의 모든 스크립트를 접근가능하게 되며 스크립트 언어간 교차호출이 가능하게 된다. 예를 들어 자바스크립트에서 C# 스크립트를 사용하고 싶다면 C#스크립트를 Standard Assets 폴더내에 자바 스크립트를 밖에 둔다. 이 상태에서는 자바스크립트가 직접 C# 스크립트를 호출 할 수 있다.

Posted by 김마농

유니티 내부의 스크립팅은 동작들(behaviours)이라 불리는 스크립트 오브젝트들을 게임 오브젝트들에 Attatch 시킴으로써 이루어진다. 스크립트 오브젝트를 내부의 서로 다른 함수들은 어떤 이벤트들상에서 호출된다.


1. OnGUI : 렌더링 및 GUI 이벤트를 처리한다.

- GUI.DrawTexture : 사각형내의 텍스쳐를 그린다.

- 매개변수

Position : 화면의 직사각형내에 질감을 그릴 수 있다.

image : Texture 표시

scalemode : 그것의 비율내에서 얻을 수 있는 비율에 맞지 않는 이미지를 확장한다.

alphaBlend : 알파로 표시

ImageAspect : 비율이 원본 이미지에 사용된다.


2. Start()

- Start는 라이프 사이클 중 딱 한번 호출된다. Awake와 차이점은 스크립트 인스턴스가 활성화된 경우에만 시작된다. Awake는 항상 어떤 기능을 사용하기전에 호출되어 초기화 시킬수 있다.

- 모든 스크립트 인스턴스는 Awake)가 호출된뒤 Star()가 실행된다.


3. Update()

- 매 프레임마다 호출되어 실행될 함수

- Update는 게임 행동의 여러 종류를 구현하는 가장 일반적인 함수

- 하나의 프레임이 렌더링 되기전에 호출된다.


4. Texture2D

- 2D 텍스쳐를 처리하기 위한 클래스


5. Resources.Load

- Resources 폴더내의 하위 경로에 저장된 파일을 불러온다. 하위 경로에 파일이 발견되면 파일을 반환하고, 그렇지 않은 경우 null이 반환된다. 하위경로는 Resources 폴더와 상대적인 경로를 가지며, 확장자는 반드시 제외되어야 한다. 

ex)Resources.Load("파일명")


6. Awake() -> Start() -> Update() -> LateUpdate()

Posted by 김마농

GetMessage와 PeekMessage

- GetMessage는 메세지 큐에서 메세지 정보(msg)를 가져오는 작업을 한다. 

  여기서 약간 특이한 작업을 하는데, 메세지가 있으면 TRUE, 없으면 FALSE가 아닌 비활성화(대기상태)가 된다. 한마디로 메세지가 

  올때까지 대기한다. 대기상태가 되면 프로그램을 메모리를 최소화하며 <데드타임>에 들어가게 된다.

 

- PeekMessage는 GetMessage와 비슷한 일을 처리하지만 메시지가 있으면 True를, 없다면 FALSE를 반환하는게 큰 차이점이다.


프레임 스킵

 - PC사양이 딸려서 계속 화면에 그리기가 어렵다면 그리는 것을 포기하여 렉걸린것처럼 보이게 하는걸 의미한다.


다이렉트는 가상의 공간(백버퍼)에 그리고 프론트버퍼로 출력한다. 이것을 더블 버퍼링이라 하며 이유는 장치와 장치사이 연산속도가 제일 느리기 때문이다.


다이렉트 객체 생성 -> 디아비스 생성 -> 그릴준비 완료(back 버퍼) ->BeginScene이 그려야 한다. ->EndScene-> 화면 출력 - >백어퍼 삭제 ->Loop돔


UpdateData()와 Render()는 서로 분리시켜야 한다.

 - UpdateData는 좌표계산을 하며, Render는 그려주는 역할을 한다. 이 둘을 따로 분리하면 프레임속도가 높아지며 게임속도가 빨라진다. 



Posted by 김마농

○ 카메라

 - 3차원 게임에서 카메라는 시점을 의미한다. 3D게임의 화면에 보이는 모든 것은 카메라를 통해서 보여지는 것이다.

    3자의 입장에서 바라보면 캐릭터의 눈 위치에 카메라가 위치하여 캐릭터의 움직임에 따라 카메라의 방향과 위치가 변하는 것이다.


○ 변환 파이프 라인

 - 변환파이프라인의 목적은 하나의 이미지를 만들고 게이머의 화면에 그것들을 보여주기 위한 것이다.

    파이프 라인은 기하적인 데이터를 하나의 물체나 장면으로 표현하는 역할을 하며, 그것들로부터 2차원의 이미지를 만들어낸다.



○ 모델 공간(Model Space)

 - 일반적으로 하나의 캐릭터를 표현할 때 모델공간이라 불리는 하나의 좌표계에서 정점의 위치를 저장한다.

 - 로컬 좌표계를 이야기한다.


○ 전역공간(World Space)

 - 3차원 공간상의 최종적인 원점의 좌표계

 - 게이머의 화면에 보여질 모든 물체들을 위한 절대적인 레퍼런스 역항을 수행

 - 게임의 오브젝트들은 월드 공간의 좌표를 가지고 있다.


☆ 월드 변환(World Transform)

- 박스와 실린더가 각각 존재한다.

- 따로 따로 모델링된 실린더와 박스는 각각의 좌표계를 갖는다. 이것이 로컬 좌표계이다.

  이것들은 그냥 3차원 공간상에 배치하게 되면 원점을 공유한다.

- 2개의 물체를 따로따로 출력하기 위해서는 물체가 사용하는 로컬 좌표계가 아닌 월드 좌표계를 도입해야 한다.

- 즉 '실린더의 로컬좌표계 -> 월드 좌표계"와 "박스의 로컬 좌표계 -> 월드 좌표계"라는 2개의 변환이 필요하다.

- 일반적으로 3차원 그래픽에서 변환을 행렬을 사용한다고 해으니 로컬 좌표계->월드 좌표계는 행렬 변환이라는 것을 알 수 있다.

- 이런식으로 로컬 좌표계를 월드 좌표계로 변환하는 행렬을 변환 행렬(Transform Matrix)이라 한다. 


○ 시점공간(Eye Space)

 - 카메라가 바라보는 공간을 시점공간이라고 한다.

 - 시점이 그 공간 좌표계의 원점이 된다.


○ 절단 공간(Clip Space)

 - 어떤 물체가 보여지는 위치에 있는지, 그렇지 않은지를 판단.

 - 시야 절두체를 통해서 이루어진다.

 - 절단 공간상의 시야 절두체를 표현한 축정렬된 육면체의 크기는 동차 좌표계에서 표현된 4번째 좌표와 관련있다.

 - 카메라가 바라보는 정육면체 안에 잘라서 넣는다.


○ 정규화된 장치 좌표계(Normalized Device Coorinates)

 - 절단 공간에서 추 정렬된 육면체의 크기인 W를 1로 놓으면 정규화된 장치 좌표계를 얻을 수 있다.

 - 정규화된 장치 좌표계를 기준으로 표현된(x,y,z) 좌표에서 z값을 0으로 놓아서 좌표(x,y)를 얻는다.

 - 3D에서 2D로 변환하는 과정을 Z버퍼라고도 하며 스테실버퍼(그림자)에도 쓰인다.


○ 윈도우 좌표계

 - 정규화된 장치 좌표계를 실제 모니터상의 x,y 좌표계로 변환해야 하는데 이를 뷰포트 변환이라고 하며 정규화된 장치 

          좌표계에 게이머가 설정한 뷰포트의 크기를 곱하여 실제 윈도우의 x,y좌표를 얻어 낸다.


☆ 시야 절두체

 -시야 절두체란 하나의 3차원 공간상에서 카메라에 의해 보일 수 있는 것들을 담는 범위

 - 피라미드 형태의 육면체로 구성되어 있다.

☆ 투영

 - 투영은 3차원 장면을 2차원 모니터 화면에 그리기 위해, 장면에 표현되는 캐릭터나 물체들의 각 정점을 화면에 그려지는 

    2차원 좌표를 결정하기 위해 사용한다.

○ 원근 투영

 - 가까운 물체는 크게, 먼 물체는 작게 그려진다. 대부분의 게임에서 사용되는 방법





○ 직교 투영

 - 원금감을 갖지 않는 투영 방법으로 화면에 어떤 물체가 그려질때 원근에 의한 왜곡이 발생하지 않는 방법

 - 캐드 같은 설계 분야에 적용되며, 유명한 디아블로2가 직교 투영 방법을 사용한다.

          


☆ 일인칭 시점 카메라

 - 카메라의 위치는 위치벡터로 표현한다.

 - 시선 방향은 카메라가 바라보는 방향을 나타내는 방향벡터이며 

 - 상향 벡터는 카메라의 위쪽 벡터이다.

○ 카메라 변환(Camera Transform)

- 카메라 변환이란 3차원 월드 좌표계를 카메라를 기준으로 한 카메라 좌표계로 변환하는 것을 의미한다.

- 월드 좌표계를 카메라를 기준점으로 한 좌표계로 변환하는 과정이 카메라 변환이다. 


☆ 3인칭 시점 카메라

 - 3인칭 시점 카메라는 제 3자의 입장에서 내려다보는 시점을 제공한다.

 - 카메라는 게임 내의 캐릭터의 움직임과 무관하게 게이머의 명령에 따라 이동한다.





Posted by 김마농

변환

 - 변환이란 어떠한 점 또는 벡터를 사용자가 원하는 점이나 벡터로 이동시키거나 회전 시키는 것.

 - 캐릭터의 이동, 캐릭터의 회전

 - 카메라의 이동, 카메라의 회전

 - 스케일(scale)


○ 좌표계

 - 좌표계는 하나의 기준. 한 점을 측정하기 위한 하나의 기준과 방법일 뿐이며 물리적으로 점 자체가 이동하는 것은 아니다.

종류로는 직죠좌표계, 원기둥 좌표계, 구면 좌표계가 있다.


○ 직교 좌표계

 - 3차원 공간에서 어떠한 점이나 벡터의 위치를 지정할때 가장 일반적으로 사용하는 좌표계(Direct3D, OpenGL에서 사용된다.)


○ 이동 변환

 - 하나의 좌표를 이동 시키는 것.

 - 모든 물체는 하나 이상의 좌표로 표현 할 수 있으며 하나의 이동 변환ㅇ르 통해서 물체를 구성하는 여러 개의 좌표에 같은 이동변환을 수행.

 - 2차원 직교 좌표계에서 이동변환


○ 회전 변환

 - 주어진 크기 만큼 회전축을 기준으로 회전하는 변환

◎ 2차원 평면 회전

 - 회전점 또는 고정점 기준으로 좌표를 회전하는 것.

 - 4개의 모서리 좌표가 모여서 하나의 사각형을 이루므로 4개의 좌표를 회전변환하면 사각형의 회전변환을 수행 할 수 있음.

 - 회전점은 원점(0,0)이다. 원점이 아닐 경우 좌표들을 원점으로 이동 변환한 우에 회전변환을 수행하고 다시 원래의 위치로 이동변환 해야 한다.


◎ 2차원 평면 회전의 3차원 확장

 - 3차원 회전변환은 x,y,z축 각각을 기준으로 회전하여 회전변환을 수행 할 수 있다.

ex) 3차원 좌표P를 x축을 기준으로 30 회전시킨 후, y축을 기준으로 60 회전시키기


○ 오일러 변환

 - x,y,z축을 각각 회전축으로 했을때 각 회전축에 대한 회전각으로 3차원 공간 회전 변환 행렬을 정의

 - 회전 행렬이나 좌표축 자세를 표현하는 직관적인 방법

 - z-y-x 오일러 변환


○ 동차 좌표계

 - 3차원 좌표를 세개의 요소로 표현할 경우 점인지, 벡터인지 혼동 될수 있기 때문에 4개의 요소로 표현한 동차 좌표를 이용한다.


○ 동차 좌표계에서의 이동변환

X' = x + dx

Y' = y + dy

Z' = z + dz


○ 동차 좌표계에서의 크기변환 행렬

X' = X x a

Y' = Y x a

Z' = Z x a

 - 한개체를 x,y,z방향으로 Sx, Sy, Sz배 확대, 축소한다.


○ 동차 좌표계에서의 회전 행렬

- X축 중심으로 θ 회전 Rx

- Y축 중심으로 θ 회전 Ry

- Z축 중심으로 θ 회전 Rz

 - 개체를 i축 주위로 라디안만큼 회전 i축상에 있는 모든 점들은 변하지 않는다.


○ 변환의 결합

 - 행렬들을 하나로 결합하는 이유는 효율을 높이기 위해서다.

[예]수천개의 정점을 가진 물체가 있다. 이 물체가 크기 조정, 회전 후에 마지막으로 평행 되어야 한다고 하면 모든 정점을 세 형랠과 각각 곱하는 대신

세 행렬을 하나로 결합한 후 그 행렬들을 모든 정점들에 적용한다. 

이동행렬 =T, 회전행렬 R, 크기변형 = S

C=TRS이다.

 [변환의 결합은 순서가 중요하다. 왜냐하면 행렬의 곱셈에서 교환법칙은 적용되지 않기 때문이다. AB ≠ BA]











Posted by 김마농