d3dx9 - 21.10.19

김주현·2021년 10월 19일
0

d3dx9 3D

목록 보기
9/30

트랜스폼 컴포넌트에 월드행렬을 넣을수있게하고 복제해서 객체에 넣어준다.

01 . 엔진 - 트랜스폼 컴포넌트 구현

  • 엔진의 컴포넌트 필터에 트랜스폼 클래스를 추가해준다

  • namespace,ENGINE_DLL,생성자등 기본 틀을 잡아준다.

  • 컴포넌트객체이기때문에 복사생성자를 통해 복제할것임(복사생성자 추가)

  • NativeConstruct,NativeConstruct_Prototype 구현
    (렌더러는 복제본을 사용하지않고 자기자신의 주소를 줬기때문에 프로토타입만 해줬지만 트랜스폼은 복제본을 사용할것이므로 NativeConstruct도 구현해줘야한다!)

  • 가장 핵심적인 기능은 _matrix m_WorldMatrix를통해 객체의 상태를 표현해주는것

  • Create()와 Clone() 함수는 게임오브젝트와 비슷

  • clone은 렌더러와 달리 실제 복제본을 만들어서 리턴해줬다.

  • 컴포넌트 매니저에 Transform.h 추가

    NativeConstruct_Prototype()

항등행렬을 만들어주는 함수 : D3DXMatrixIdentity()
벡터를 길이 1인 벡터로 만들어주는 함수 : D3DXVec3Normalize()

*매트릭스아이덴티티함수를 통해 월드매트릭스를 항등행렬로 변환

  1. BackGround 클래스에 트랜스폼 구현

트랜스폼을 전방선언해주고 렌더러와 같이 멤버변수로 추가

메인앱에서 프로토타입 트랜스폼을 추가해줘야함

다시 백그라운드 클래스로 돌아와서 m_pTransformcom에서 게임인스턴스에서 트랜스폼의 원형을 가져와서 넣어주자

백그라운드의 Free에서 m_pTrandformCom을 릴리즈해주자.

03 . 게임오브젝트 구조 변경

객체의 부모가되는 게임오브젝트에 컴포넌트를 Map형태로 보관할수있게 컨테이너를 추가해주자

다시 백그라운드로 돌아와서 이제 컴포넌트를 추가할때

기존의 멤버변수에 추가해주고 map에도 추가 해줘야함 map에 추가하기전에 map 해당 태그를 가진 컴포넌트가 있는지 검사해줘야함

게임오브젝트에 Add_Component함수를 구현하고 이를 호출해서 컴포넌트를 넣어주자.(Add_Component에서 사용할 Find_Component()함수도 구현)

자식에서 부모의 AddGameObject를 호출해 멤버변수에도 컴포넌트를 추가할수있게 변경해주자

pComponent를 얻어왔으니 find_if()를 통해 해당 태그 값을 가지는게 있는지 검사

게임오브젝트에서 Add_Component에서 게임인스턴스를 가져와주고(게임인스턴스 헤더추가)

게임인스턴스의 Clone_Component를 호출하기위해 iLevelIndex와 현재 원형객체의태그(프로토타입태그)를 인자로 받고 인자로 넘겨주자

pComponent를 부모의 컴포넌트 컨테이너에 보관해주자

다음 자식의 멤버변수에 접근해주자 AddGameObject 함수의 인자로 자식의 멤버변수의 주소(ppOut)를 받아 자식의 멤버변수에 넣어주자.

이제 자식(백그라운드)로 돌아와서 __super::Add_Component() 함수를 호출해주자

이때 이중포인터는 다중성이 없음 부모형식으로 캐스팅을 해줘야한다 (CComponet**)

이제 컴포넌트를 추가할때 같은 기능을 반복해서 구현할 필요가없음

파이프라인

같은 사각형객체가있을때 가까이있는건 크게 멀리있는건 작게 그리면 3D효과를 구현가능
왼손좌표계 : 엄지 x축 검지 y축 중지 z축 rhs는 왼손좌표계는 의미

3d로 구성한 장면을 2d로 그리는 과정 파이프라인 그리기때문에 "렌더링 파이프라인"

모델러는 사각형을 구성하기위한 작업을함 이 사각형이 멀리있고 가까이있고 앞에뭐가있는지 고려하지않음

삼각형을 두개를 이어붙여서 사각형을 만들것이고 삼각형을 만들기위해서는 점을 구현해야한다.

점을 구현하기위해선? 위치정보(원점으로부터 얼만큼 떨어졌는지)

모델러는 점을 정의하기위해 좌표계를 하나 만들고 시작함(사각형 만을 위한 좌표계: 로컬 스페이스 좌표계) 좌표계의 위의 점을 "정점"이라고 함

정점이라는 중요한 데이터이지만 다이렉트에서 타입을 제공해주지는 않는다. 개발자가 직접 선택에서 어떤 정보가 들어갈지를 선택해야함

이미지를 사각형위에 올리기위해 각 정점에 필요한 정보

  • 위치 정보
  • 점위에 그려야할 텍스쳐의 정보(사각형의 각점이 이미지의 어떤점을 참조하는지)float_2 그림의 x,y 좌표
  • 법선 벡터 float_3 하지만 조명을 안쓴다면 필요가없음

즉 개발자의 필요에따라 데이터가 필요하기때문에 정형화된 데이터타입은 제공해주지않음

그래서 다이렉트에서 정점에 넣을수있는 데이터타입을 제공해줌
이를 골라서 구조체를 하나 선언해야한다.

이제 각기 다른 로컬 스페이스 좌표계에 그려진 사각형을 하나의 좌표게(게임세계의 해당하는 단 하나의 좌표계 (월드 스페이스)) 에 모아주는 작업을 해야함

두 사각형의 위치를 비교할때 꼭 월드스페이스의 좌표를 가지고 비교를 해줘야함

로컬 스페이스의 점을 월드스페이스의 점으로 변환해주는 작업을 해줘야함 이 작업을해주는 행렬 -> 월드 행렬
월드 행렬 : 로컬스페이스의 정점을 월드 스페이스좌표계의 정점으로 변환해주기위해 설계된 행렬 (라업룩 포지션)
라이트 업 룩(방향벡터) 포지션(위치벡터)
세개의 방향벡터와 한개의 위치벡터를 가지고있다.

라업룩은 각각 xyz축 방향을 바라보고있다.
항등행렬 이 벡터가 회전하지 않았음을 표현하고있음

라업룩 각 벡터의 길이가 각 축의 크기 배율 을 의미

위치는 4행에 들어가있음 (월드 좌표계에서 원점기준으로 얼마나 떨어져있는지

월드 행렬에는 크기,회전,이동 정보가들어있고 이를통해 로컬 스페이스를 월드 스페이스로 변환할 수 있다.

0개의 댓글

관련 채용 정보