프로그래밍 공부

2023/11 34

  • 3인칭 카메라를 구현해보자. Obejct의 Front와 Back, 그리고 Cam의 Rotationvalue와 Movevalue값을 알고 있어야 한다. 간단한 코드 예시를 살펴보자. float distance = 20.0f; float height = 20.0f; float moveDamping = 5.0f; // 따라가는 속도 float rotDamping = 0.0f; // 회전에서 따라가는 속도 float rotY = 0;// 쿼터뷰로 하였을 때, 45도각도를 바라보고 싶을 수도있기 때문, float destRot = 0.0f; Vector3 destPos; Vector3 focusOffset;// 카메라의 타겟 오프셋 // 특정 타겟을 바라보는데 X축 앵글로만 안바라보게 하고싶을 수 있다. // 모..

  • 함수포인터를 사용해서 애니메이션의 자동 프레임전환을 구현해보자. 언리얼에서 사용하는 애니메이션의 자동 전환은. 일정 시간 뒤에 애니메이션이 자동으로 전환되는 형식으로 구성되어있는데, https://docs.unrealengine.com/4.27/ko/AnimatingObjects/SkeletalMeshAnimation/Sequences/ 애니메이션 시퀀스 Animation Sequence, 애니메이션 시퀀스 애셋은 한 애니메이션을 이루는 모든 트랜스폼 데이터가 들어있는 개별 애셋입니다. docs.unrealengine.com 이러한 애니메이션간 선형전환방식을 사용할것 이다. class ModelClip { private: friend class ModelAnimator; ModelClip() = defa..

  • 저번에 만들었던 선형보간의 개량이다. 선형보간 시, Buffer에 데이터를 넘긴 후, 처리하는 방법이 있고, 데이터를 Device에서 처리 후 Buffer에 넘기는 방법이 있는데, 전에 만들었던 방법은, 데이터를 넘기기 전 Device에서 처리 후, Buffer에 넘기는것 이었는데, 이번에 한 방법은 Buffer에 데이터를 다 때려박은 후 DeviceContext에서 데이터를 처리하는 방법이다. Buffer를 수정한다. // Frame 구조체: 애니메이션 재생에 사용되는 프레임 정보를 저장하는 구조체 struct Frame { int clip = 0; // 현재 재생 중인 클립의 인덱스 int curFrame = 0; // 현재 프레임 인덱스 float time = 0.0f; // 현재 프레임에서의 경과..

  • 애니메이션의 저장을 clip형태로 하였음으로, 이제 데이터를 보관하고, Texture2D형태로 구현한 뒤, DeviceContext에서 출력할 일만 남았다. 일단 DeviceContext로 넘겨줄, ConstBuffer를 정의해주어야 한다. // ClipTransform 구조체: 각 프레임 및 본에 대한 변환 매트릭스를 저장하는 구조체 struct ClipTransform { Matrix transform[MAX_FRAME][MAX_BONE]; // 각 프레임 및 본에 대한 변환 매트릭스 배열 }; // Frame 구조체: 애니메이션 재생에 사용되는 프레임 정보를 저장하는 구조체 struct Frame { int clip = 0; // 현재 재생 중인 클립의 인덱스 int curFrame = 0; // ..

  • 애니메이션 리깅을 위해서는 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..