프로그래밍 공부

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

카테고리 설명
  • 구체와 사각형의 충돌을 구현해보자. 전에 만들었던 Sphere 객체와 Box객체를 사용한다. Box객체에 SphereCollider를 받아와서 사용할 수 있다. bool BoxCollider::IsSphereCollision(SphereCollider* collider) { ObbDesc box; GetObb(box); // OBB 정보를 얻어와서 box에 저장합니다. Vector3 closestPointToSphere = box.pos; // OBB의 중심을 기준으로 가장 가까운 지점을 초기화합니다. FOR(3) // OBB의 3개의 로컬 축에 대한 루프를 시작합니다. { Vector3 direction = collider->GetGlobalPosition() - box.pos; // OBB 중심에서 ..

  • 3D 상에서의 Box to Box Collider연산을 구상해보자. 일반적으로 2D상에서의 Collider는, AABB와 OBB의 연산을 사용한다. 그러나, AABB연산의 경우, 회전하지 않는 사각형 의 충돌연산에 사용하기 때문에, 회전체의 충돌연산을 진행할 수 없다는 단점이 있다. 3D에서는 AABB연산이 가능한 경우가 거의 없음으로 고려하지 않는다. 3D상에서의 OBB연산 평면상에서는 OBB연산을 단 한번만 진행해주면 되지만, 입체상 에서는 z축이 한개 추가된다. 그럼으로 정6면체 기준으로 6면의 충돌범위가 생김으로. 각 면마다 다른 면이 충돌하였는지 검사해야 할것이다. 여기에 필요한 데이터는 다음과 같다. struct ObbDesc { Vector3 pos; // 박스의 중간위치 Vector3 ax..

  • FBX파일에서 Png파일을 모두 가져왔었으니 이번에는 Mesh데이터를 가져오고 저장, 불러오기를 해야한다. 전에 만들어두었던 ModelExporter에 값을 저장하는 함수를 제작한다. void ModelExporter::ReadMesh(aiNode* node) { FOR(node->mNumMeshes) { // 새로운 MeshData 객체를 생성 MeshData* mesh = new MeshData(); // Mesh의 이름을 설정, node->mName.C_Str()는 C 문자열로 Mesh의 이름을 제공합니다. mesh->name = node->mName.C_Str(); // 현재 처리 중인 Mesh에 대한 포인터를 가져옵니다. aiMesh* srcMesh = scene->mMeshes[i]; // M..

  • Assimp를 설치한다. 설치시 Cmake를 사용하여 lib파일을 뽑아서 사용한다. Assimp는 FBX파일에서 데이터를 긁어올 수 있도록 하는것만 사용하고, 긁어온 데이터를 현재 프로젝트에서 사용할 수 있도록 재가공하는 방식은 사용자에 따라 달라진다. 자신이 구축해놓은 Framework에 맞게 데이터를 재가공해 사용하도록 하자. #pragma once class ModelExporter { public: ModelExporter(string name, string file); ~ModelExporter(); void ExportMaterial(); private: //Material void ReadMaterial();// 머티리얼 읽기. void WriterMaterial(); // 머티얼 써서 저장..

  • 빛의 연산과정은 포워드 렌더와 디퍼드 렌더가 존재한다. DirectX의 게임연산시 효율적인 연산이 거의 무조건 옳음으로 디퍼드 렌더 방식으로 hlsl을 조율한다. LightBuffer에 빛 연산의 개수를 적용하여 사용한다. cbuffer LightBuffer : register(b0) { Light lights[MAX_LIGHT]; // 빛연산 계산수 int lightCount; // 간접광 float3 ambientLight; // 천장간접광. 천장부분의 반사정도를 따로준다. float3 ambientCeil; } cbuffer MaterialBuffer : register(b2) { // 재질 float4 mDiffuse; float4 mSpecular; float4 mAmbient; float4 m..

  • PointLight, DIrectionLight, SpotLight 각 라이트에 대한 Hlsl과 Buffer연산을 코드에 추가해야한다. 우선 각 라이트를 구현하기 위해 필요한 값을 하나하나 짚어보자. PointLight 빛의 좌표(Vector3 형태의 좌표) 객체(Vertice)의 위치(Vector3형태의 좌표) 감쇠계수(범위에 따른 감쇠값) Directional Light 빛의 방향벡터 ( 빛이 향하는 방향을 나타내는 Vector 보통 카메라에서 직교함) 표면의 법선 ( 좌표평면상의 수직된 법선데이터) SpotLight 빛의 위치(Vector3형태의 좌표) 객체(Vectice)의 위치(Vector3형태의 좌표) 빛의 방향벡터( 빛이 향하는 방향을 나타내는 Vector 빛의 위치에서 정면으로 직교함) 원..