프로그래밍 공부

서울게임아카데미 교육과정 6개월 국비과정 113

카테고리 설명
  • 애니메이션 리깅을 위해서는 FBX데이터로 애니메이션 데이터를 뽑아와야 한다. https://www.mixamo.com/#/ Mixamo www.mixamo.com 에서 에니메이션 데이터를 가져와보자. 우리는 모델 데이터가 존재하기 때문에 fbx로 뽑아온 데이터의 Skin데이터가 필요하지 않다. 그럼으로, 데이터에서 Skin데이터를 뺀 에니메이션 데이터만 가져온다. 리딩데이터를 불러오기위해 사전 설정을 기입한다. 모델의 움직임 데이터는 Texture2D형태로 DeviceContext에 전달되는데, 각 데이터는 다음과 같다. 한 칸 내부에 Float4, Float3형태로, 컬러값형태로 모션이 저장되는데. 3픽셀당 한개의 뼈대가 움직이는 데이터를 저장하게 된다. 즉, 세로길이는 프레임, 가로길이는 뼈대정보 로..

  • FBX내부에 모델의 뼈대 데이터가 존재하면 뼈대 데이터를 받아올 수 있게 전처리를 진행한다. 먼저, 전에 데이터를 받아오기위해 만든 ModelData.h를 수정해보자. 새로운 struct인 NodeData를 생성한다. struct NodeData { int index; string name; int parent; Matrix transform; }; 현재 Node의 번호와, 이름, 부모관계, 모델기준 상대World좌표. 를 받아온다. 그리고, ModelExporter를 수정해서, nodes를 받아올 수 있도록 수정작업을 진행한다. class ModelExporter { public: ModelExporter(string name, string file); ~ModelExporter(); void Expo..

  • 저번에 만들었던 인벤토리를 조금 수정해서 상점UI를 만들어보자. 함수포인터를 응용한 디자인 패턴중 하나가 옵저버 패턴이 있는데, 이 방법을 사용해서 상점 UI를 구현할것이다. 전에 만들었던 인벤토리 형태는, Button이 전역으로 설정된 mouseBag객체에 데이터를 보내주는 형태로 되어있다. 이걸 기반으로, 상점과 인벤토리의 차이점을 짚어보자. 상점 인벤토리 구매와 판매가 이루어져야한다. 보관만 하면된다. 구매하지 않은 상품은 가져가서는 안된다. 아이템은 보관만 하고 언제든 가져갈 수 있다. 아이템의 가격을 참조해서 전체 가격을 제공해야한다. 아이템의 가격은 상관없이 데이터를 저장만 하면된다. 판매할 상품과 구매할 상품을 구분해야한다. 구분할 필요가 없다. 위와같은 차이점이 나타남을 정리함으로써 알 수..

  • 함수포인터를 활용한 Button을 사용해 인벤토리를 구축해보자. 먼저. Button을 설계해보자. Button #pragma once // Quad 클래스를 상속하는 Button 클래스를 정의합니다. class Button : public Quad { protected: enum State { // 버튼의 상태를 정의한 열거형입니다. // NONE: 기본 상태 // DOWN: 버튼이 눌렸을 때의 상태 // OVER: 마우스 포인터가 버튼 위에 있을 때의 상태 NONE, DOWN, OVER }; // 각 버튼 상태에 대한 색상을 정의한 상수 멤버 변수입니다. const Float4 NONE_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; // 기본 상태의 색상 (흰색) const Float..

  • UI는 3D화면에 2DObject를 그리는 행위이다. 그렇다면, UI를 그릴때. 중첩되서 표시되는경우 어떻게 해야할까. 보통은 z값을 0.0001정도씩 나누어서 표시하여 UI의 겹침을 막을 수 있다. 그러나, Render시. Object의 렌더순서에 따라 UI의 깊이를 나누어서 더 쉽고 간단하게 출력해줄 수 있다. DepthStencillState DirectX에서는 데이터를 출력할 때 깊이값을 변경하여. 2D객체가 출력될 때. 출력순서에 따라 깊이buffer를 0~1사이로 설정하여 어떤 객체가 덮어씌워지고 덮어씌워지지 않을지 선택하여 출력이 가능하다. 깊이 스텐실 버퍼의 순서는 대략 깊이버퍼 설정 -> 깊이스텐실 테스트 -> 테스트 결과 로 나타나는데. 각각은 다음과 같다. 깊이 버퍼 깊이 버퍼는 화면..

  • 우선 Block위에 올라섰을 때. Player의 위치값에 대해 참조받아 position을 바꾸어야 한다. 그전에 위에 올라설 Block을 만들어주도록 하자. Block class Block : public BoxCollider { public: Block(string name); ~Block(); void Update(); void Render(); void GUIRender(); Vector3 GetDirection(Vector3 point); private: Model* model; }; #include "Framework.h" Block::Block(string name) { SetTag(name + "Collider"); model = new Model(name); model->SetParent(..