프로그래밍 공부

프로그래밍 700

카테고리 설명
  • 구체와 사각형의 충돌을 구현해보자. 전에 만들었던 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..

  • Ray to Box알고리즘으로, 직선과 3D객체와 교차하는지 여부를 검사하는 알고리즘이다. 정육면체 에서 각 변에서 무한하게 나온 사각형을 기준으로 현재 Ray의 교차점과 사각형의 최대외곽선의 충돌범위가 범위안에 들어오는지 확인하여 검사한다. 선분상에, Ray가 Ymin과 Ymax, xmin과 xmax가 나타나게 된다. 위와 같이 선분이 통과하는 무한이 뻗어나가는 사각형을 볼 수 있는데, Ray가 파란선으로 이루어졌을 때, xmin, ymin중 최대값이 xmin 일때, ( max of min) xmax, ymax중 최소값이 ymax일때 ( min of max ) max of min > min of max 일때 충돌하지 않는다. max of min

  • OBB Oriented Bounding Box로, 회전이 가능한 사각형 또는 직육면체를 사용하여. 두 객체가 충돌하는지 를 검출하는 방식이다. 각 객체는 로컬 좌표게에 따라 정렬된 사각형 또는 직육면체 충돌체로 표현되며, 이를 기반으로 충돌 검출과 충돌 처리를 수행한다. OBB의 검사방식두 객체가 OBB를 생성한다.OBB는 로컬 좌표계에 기반하여 회전, 크기, 위치 등의 정보를 포함한다. 두 객체의 OBB가 겹치는지 확인한다. 이를 위해 Separating Axis Teorem(분리 축 정리) 을 사용하여 OBB의 로컬 축들을 기준으로 프로젝션을 수행하고, 프로젝션 범위를 비교한다.객체의 중심점을 확인  객체간의 거리를..

  • AABB 축이 정렬된 바운딩 박스 ( Axis-Aligned Bounding Box)를 이용하여, 두 객체가 충돌하는지를 파악하는 간단한 알고리즘이다. 객체의 경계를 모두 포함하는 최소크기의 정렬된 사각형 충돌체로 구성되며. 각 축이 절대축과 평행한다. AABB의 검사방식 각 객체의 AABB를 생성한다. 이때 AABB는 해당 객체의 충돌 콜리전의 바운딩 박스를 구성하는 XY좌표로. 좌상단, 우상단, 좌하단, 우하단 으로 이루어져 있다. 두 객체의 AABB가 겹치는지를 확인한다. AABB의 겹침 여부는 각 축의 범위를 비교하여 판단한다. X축과 Y축의 범위가 겹치는지를 서로 비교하여 판단하게 된다. 모든 축에서 겹침을 확인하면, 두 객체는 충돌한다고 간주한다. 그렇지 않았다면 두 객체는 충돌하지 않았다고 ..

  • 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..