2012년 8월 16일 목요일

unity action script 메모

이동을 멈추게 하고 싶을떄

naviMeshAgent.destination = transform.position;

이런 식으로는 의도하는대로 작동하지 않는다.

naviMeshAgent.ResetPath();

를 사용할것.

다시 움직이게 하려면 destination을 다시 지정해주면 된다.

2012년 6월 27일 수요일

[2.5D & 서버 개인 포트폴리오] 네트워크 FPS





- 3D 과정 1개월차

빌보드 구현, 높이맵 적용, 스프라이트 애니메이션



- 서버 프로그래밍(독학)

TCP/IP 와 쓰레드를 이용한 동기화 PVP 구현



.

2012년 6월 22일 금요일

오늘의 글귀..


가르치되 무시하지 않도록

비판하되 비난하지 않도록

솔직하되 품위를 잃지 않도록

자신감을 잃지 않되 자만으로 빠지지 않도록

겸손하되 비굴하지 않도록

사랑하되 집착하지 않도록


공감하되 동정하지 않도록





2012년 6월 18일 월요일

[Direct3D] 렌더링 파이프라인

렌더링 파이프라인이란?

3D 공간 상에 기하학적으로 구성된 장면에 가상 카메라를 설정하고 모니터에 2D로 표현하기까지의 일련의 과정을 랜더링 파이프라인이라고 한다.


일반적으로 아래의 9 단계로 이루어진다.

1. 로컬 스페이스
2. 월드 스페이스
3. 뷰 스페이스
4. 후면 추려내기(컬링)
5. 조명
6. 클리핑
7. 투영
8. 뷰포트 변환
9. 래스터라이징




1. 로컬 스페이스
모델링 스페이스라고도 하며 물체를 구성하는 삼각형(폴리곤) 목록을 정의하는 좌표계이다. 3D 물체를 월드 스페이스에 직접 배치하는 것보다 각각의 로컬 스페이스에 정의하는 것이 훨씬 효율적이다.



2. 월드 스페이스
로컬 스페이스의 물체들은 이동, 회전, 크기변형 등을 포함하는 월드 변환 작업을 거쳐 월드 스페이스(전역좌표계)로 옮겨진다. 월드 변환은 각 물체간의 상대적 관계를 정의하여 하나의 장면(scene)을 구성하는 것이다.



3. 뷰 스페이스
카메라의 관점에 맞추어 월드 내의 모든 기하물체를 변환하는 것을 뷰 스페이스 변환이라고 한다. 이 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 표현한다.
즉, 월드 내의 어떤 위치에 존재하는 카메라를 원점으로 옮기고, 양의 z 축 방향으로 바라보도록(한마디로 컴퓨터 모니터가 카메라 위치가 되도록) 회전과 이동을 하며, 월드내의 모든 물체도 그에 따라 변환되는 것이다.
뷰 스페이스는 2D 모니터로 Scene을 찍기 위한 중간과정이라 보면 되고 게임에서 각 물체간의 위치관계나 충돌 처리 등은 주로 월드 스페이스에서 이루어진다.



4. 후면 추려내기(backface culling)
카메라에서 보이지 않는 폴리곤의 후면을 이후의 처리에서 제거(추려내기)하는 작업이다.
D3D에서 삼각형의 버텍스는 시계방향 순서로 배치하도록 약속되어 있다. 이 삼각형이 180도 회전하여 후면으로 가게되면 버텍스 순서가 시계반대방향으로 뒤집어지는데, 이러한 삼각형들이 바로 컬링의 대상이 되는 것이다.

※ D3DRS_CULLMODE 옵션을 이용하여 동작을 변경할 수 있다.

    Device->SetRenderState(D3DRS_CULLMODE, Value);

Value 에는 다음의 세 가지 중 하나를 선택적으로 사용할 수 있다.

 D3DCULL NONE - 후면 추려내기 기능을 사용하지 않는다.
 D3DCULL CW     - 시계 방향(ClockWise) 두르기를 가진 삼각형을 추려낸다
 D3DCULL CCW   - 시계 반대 방향(CounterClockWise) 두르기를 가진 삼각형을 추려낸다. 디폴트 상태이다.



5. 조명
월드에 광원을 배치하여 물체에 명암 효과를 준다.



6. 클리핑
시야 볼륨(절두체) 외부의 기하물체를 추려내는 과정이다.
절두체란 시야의 각도와 최소깊이, 최대깊이로 이루어진 피라미드 형태로서 이 안에 있는 물체가 카메라의 시야 내부에 있게되는 것이다.



7. 투영
3D 장면에서 2D 표현을 얻는 과정이다. 원근 투영(perspective projection)이나 직교 투영(orthogonal projecton) 등이 있다.
원근 투영은 원근법을 살려서 가까운 물체는 크게, 먼 물체는 작게 보이도록 변환하는것으로 위에서 설명한 절두체를 2D 윈도우에 투영하는 것이다.
직교 투영은 원근감없이 수직 위에서 내려다 보듯이 투영하는 방법이며 게임에서는 미니맵 등의 2D 효과에 사용된다.



8. 뷰포트 변환
투영된 삼각형들을 뷰포트라 불리는 윈도우 좌표계로 변환하는 과정이다.
이때 z축 버퍼의 개념이 사용되어 멀리 있는 물체가 가까운 물체에 가리는 등의 처리가 이루어진다.
D3D에서는 뷰포트 변환이 자동으로 이루어진다.



9. 래스터라이즈
뷰포트 변환을 통해 2D 삼각형들의 리스트를 가지게 되는데 이 삼각형들을 그리는데 필요한 픽셀 컬러를 계산하는 과정을 래스터라이즈라고 한다.
지금까지는 버텍스 단위로 작업이 이루어졌지만 래스터라이즈 단계는 픽셀 단위로 작업을 해야하므로 상당한 부하가 걸린다. 따라서 반드시 전용 그래픽 하드웨어에서 처리되어야한다.
래스터라이즈의 결과물은 모니터에 바로 디스플레이할 수 있는 2D 이미지가 된다.




※ 위 랜더링 파이프라인은 3D 장면을 2D 화면으로 전환하는 최소의 과정만을 나타낸 것이라고 볼 수 있으며 실제로는 버텍스 셰이딩(정점의 음영처리), 지오메트리 셰이딩(정점 증감 처리), 픽셀 셰이딩, 텍스쳐 적용, 렌더 백엔드 등의 과정이 추가될 수 있다.

2012년 6월 15일 금요일

[STL] list iterator not dereferencable 오류 메시지

 위 메시지에서 dereferencable 이라는 사전에도 잘 안나오는 단어는 역참조라는 뜻인데, 이걸 해석하느라 고심할 필요는 없고 한마디로 STL에서 이터레이터로 루프를 돌릴때 로직이 잘못되었다고 보면 된다.


 흔히 범하는 실수로는 반복자 삭제시 무효화 현상, 루프를 돌릴때 조건을 잘못 주는 등 여러가지가 있다.

 이런 오류는 컴파일러에서 발견하지 못하고 실행중에 발생하므로 찾기가 어려운 편이다.

 이런 경우 디버그를 할 때 반복자 관련 구문을 잘 살펴보면 된다.



list 뿐 아니라 vector 나 map 도 마찬가지다.