Slerp : 쿼터니언이 회전이기 때문에 휘어진 곡선, 면을 따라서 점에서 점을 연결하도록 한다.
카메라가 (0, 0, 0) 에 위치하는 것처럼 모든 버텍스의 좌표를 변환시킨다. 월드에서 카메라의 위치가 있다. 그 위치만큼 빼주는 것과 유사하게 역행렬을 적용하면 된다.
카메라 오브젝트가 가지고 있는 매트릭스가 있다. 거기에 inverse 연산을 해서 역행렬을 곱한다.
오브젝트의 기저에 카메라-1을 해서 각 오브젝트의 기저를 바꿔준다. 원점인 카메라를 중심으로 다른 오브젝트가 배치된다.
따라서 둘 다 동일한 의미이다.
카메라 XYZ벡터는 전부 Normalize 되어있어서 크기가 1이다.
카메라도 월드에서 위치를 가진다. 타겟인 오브젝트도 위치를 가진다. 오브젝트 - 카메라를 하면 카메라에서 오브젝트로 가는 카메라→오브젝트 벡터가 나온다. 그 벡터가 Z 벡터이다.
Z벡터가 있으면 월드의 Y벡터와 외적을 해서 카메라의 X벡터를 구할 수 있다.
마지막으로 얻은 카메라의 X벡터와 Z벡터를 외적해서 Y벡터를 구할 수 있다.
오브젝트 - 카메라 → 카메라 Z 벡터
(카메라 Z벡터) X (월드의 Y벡터) → 카메라 X 벡터
(카메라 Z벡터) X (카메라 X벡터) → 카메라 Y 벡터
따라서 카메라의 LookAtVector + 월드의 UpVector로 카메라의 Rotation Matrix를 구할 수 있다.
ERR : obj 파일을 읽는데 f에서 삼각형으로 안 해놓아서 제대로 나오지 않았다. 그래서 다각형을 쪼개는 알고리즘을 찾다가 다른 방법이 있을 것 같았다.
SOL : 블랜더에서 export 할 때 옵션에서 삼각형으로 내보내기를 체크해야 했다.
참조를 받지 않는 벡터에 참조 넣기 → 객체로 포장해서 넣기
유저가 프로세스가 멈추었다고 느끼지 않게 백그라운드에서 실행해야 할 때 별도의 스레드로 분리한다.
Socket listener : 네트워크 관련 IO를 하는 부분은 다른 스레드를 쓴다.
Loading Resource : 텍스쳐, 3D모델, 사운드 등 크기가 큰 것을 올릴 때 쓴다.
Rendering : update → render을 분리한다. 병렬적으로 처리해서 render는 이전 update의 데이터를 쓴다. 1프레임 전을 render 한다.
Game Thread : Poll input / Update AI / Animation / Physics
Render Thread : Ready structure / Cull Objects / Forward Pass / Postfix
여러 스레드를 이용해 하나의 사용자 인터페이스를 만들 필요가 없다. 사용자는 한 명이고 한 번에 하나의 입력이 들어온다.
concurrency : 서로 다른 시스템들이 영향을 주고받고 선형적으로 쭉 진행되어야 하는 부분에서는 오히려 맞추는데 시간이 걸린다.
너무 많은 스레드 : 루프를 나눌 때 많은 파이프 라인으로 나눠서 기능별로 스레드로 분리한다. 파이프라인으로 많은 단계를 1프레임씩 늦춰서 하면 입력이 밀리는 느낌을 받을 수 있어서 update / render의 단계로만 분리하는 것이 나은 편이다.
2D : 스프라이트로 그리는 간단한 게임이면 싱글 스레드로 한다.
1 스레드 함수 반환
2 스레드 함수 내에서 ExitThread()
3 프로세스에서 TerminateThread()
4 스레드가 포함된 프로세스 종료
1번을 추천한다. 스레드 함수가 반환되면 수행되는 작업이 있기 때문이다.
Object destructor : 갖고있던 오브젝트 리소스를 해제해준다
스택 메모리 : 함수를 부르면서 스택으로 사용한 메모리를 반환한다.
스레드 종료 코드 : 종료 코드가 반환 값으로 설정 → 스레드 커널 오브젝트에 저장
사용 카운트 : 스레드 커널 오브젝트 사용 카운트가 감소된다.
2 ExitThread 문제점 :
Object destructor (X)
스택 메모리(O)
스레드 종료 코드 (O)
3 TerminateThread 문제점
스택 메모리(X)
스레드 종료 코드 (O)
사용 카운트(O)
4 프로세스 종료 문제점
Object destructor (X) 하지만 사용하던 메모리 정리하거나 저장 안하고 다 날린다.
스택 메모리(O)
이벤트 통해서 다른 컴포넌트에게 알리기
이벤트가 컴포넌트끼리 통신할 때 데이터를 넘겨주는 역할을 한다.
가운데에서 메시지를 처리해 준다.
GameObject
Unique ID를 각 오브젝트마다 가진다
특정 기능을 하도록 속성을 갖게 한다
엔티티가 갖고있는 컴포넌트를 동작하게 한다