2023/11 34
-
Frustum 기법 또는 절두체 컬링(Frustum Culling)방식 이라고 하기도 한다. 3차원 월드를 대상으로 모든 대상을 Render한다고 하였을 때. 사용하는 View인 메인 카메라에 보이지 않는 다른 객체를 전부 렌더 하는것은 비효율적인 방법이다. 이러한 렌더방식을 최적화 하기 위해. 뷰포트 외의 모든 항목을 렌더링하지 않는 방식을 이야기 한다. 카메라의 시야를 절두체라고 하는 피라미드모양이라고 생각 했을 때. 피라미드의 각 면을 경계선이라고 생각하고. 각 면마다 평면방정식을 사용하여 위치한 Obejct의 위치좌표가 해당 면보다 위에 있다면 +로, 해당 면보다 밑에 있다면 -로 위치할것이다. World기준으로 선분을 세우는것 이 아닌 각 Local면 기준으로 xyz축을 세워서 해당 xyz축으로..
-
평면방정식은 3차원 공간에서 평면을 표현하였을 때. 각 점끼리의 상호작용에 의해 어떠한 결과가 유도되는. 관계를 의미한다. 짧게 설명하자면. 어떠한 점 n개(3개이상)으로 이루어진 평면 내에 어떠한 점 한개가 위치할 때. 해당점 P(x, y, z)는 Ax + By + Cz - D = 0을 만족한다. 를 이야기한다. 여기서 A와 B와 C는 법선벡터를 의미한다. 예를들어 법선벡터가 (1,0,0)이라면, x축에 수직인 평면을 의미한다. D는 평면이 원점으로부터 얼마나 떨어져있는가를 나타내난 값 이다. 이러한 값들을 활용해서 다양한 정보를 얻어낼 수 있는데, 예를들어 3D월드상에서 vertex와 면 두개가 접촉하였다고 가정해보자. 여기서 우리가 접촉시킨 물체가 구체이고. 접촉점의 높이를 알고싶다고 해보자. 그러..
-
우선 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(..
-
구체와 사각형의 충돌을 구현해보자. 전에 만들었던 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