OpenGL 3.2 이상을 실험 중이며 Obj 파일/모델을 3D로로드하고 상호 작용하려고합니다. 타사 물리 엔진 등을 사용하지 않고 기존의 두 (로드)를 Obj 객체/모델 사이의 충돌 감지를 설정합니다 (가능하다면)Obj 모델을 사용하는 C++ 충돌
(this site 같은 소스에서 다음 자습서) 나는 무엇을 가장 쉬운 방법을 궁금 해서요?
OpenGL 3.2 이상을 실험 중이며 Obj 파일/모델을 3D로로드하고 상호 작용하려고합니다. 타사 물리 엔진 등을 사용하지 않고 기존의 두 (로드)를 Obj 객체/모델 사이의 충돌 감지를 설정합니다 (가능하다면)Obj 모델을 사용하는 C++ 충돌
(this site 같은 소스에서 다음 자습서) 나는 무엇을 가장 쉬운 방법을 궁금 해서요?
기준을 충족 할 수있는 가장 쉬운 알고리즘은 구체 간의 충돌을 감지하여 메시를 마무리합니다. Here 구현 예를 볼 수 있습니다.
가장 단순한 충돌 모델은 충돌을위한 경계 상자를 사용하는 것입니다. 원리는 간단합니다 : 최소와 최대의 두 점으로 정의 된 상자로 객체를 둘러 쌉니다. 그런 다음이 점들을 사용하여 두 상자가 교차하는지 여부를 결정합니다. 내 엔진
바운딩 박스와 충돌 검출 방법의 구성은 이것으로 설정된다
typedef struct BoundingBox
{
Vector3 min; //Contains lowest corner of the box
Vector3 max; //Contains highest corner of the box
} AABB;
//True if collision is detected, false otherwise
bool detectCollision(BoundingBox a, BoundingBox b)
{
return (a.min <= b.max && b.min <= a.max);
}
다른 간단한 방법은, 구체를 사용하는 것이다. 이 방법은 모든 차원에서 비슷한 크기의 객체에 유용하지만 그렇지 않은 경우 많은 거짓 충돌을 만듭니다. 이 방법에서는 반경이 radius
이고 중심 위치가 position
인 구형으로 객체를 둘러싸고 충돌이 발생하면 중심점 간의 거리가 반지름의 합보다 작고 두 구가 교차하는지 여부 만 확인하면됩니다. 다시
, 내 엔진 코드는 :
Dot()
위의 코드에서
struct Sphere
{
Vector3 position; //Center of the sphere
float radius; //Radius of the sphere
};
bool inf::physics::detectCollision(Sphere a, Sphere b)
{
Vector3 tmp = a.position - b.position; //Distance between centers
return (Dot(tmp, tmp) <= pow((a.radius + b.radius), 2));
}
은 자체 벡터를 점하는 경우는 벡터의 크기의 제곱 (정의)를 제공, 두 벡터의 내적을 계산 . 실제 거리를 얻으려면 실제로 어떻게 제곱근하지 않는지주의하십시오. 대신 여분의 계산을 피하기 위해 사각형을 비교하고 있습니다.
또한이 두 가지 방법 모두 완벽하지 않으며 때때로 (개체가 완벽한 상자 또는 구체가 아닌 경우) 거짓 충돌 감지를 제공하지만 이는 간단한 구현 및 계산의 균형입니다. 복잡성. 그럼에도 불구하고 충돌을 탐지하는 것이 좋습니다.
내 obj 파일에 내 obj가 내 프로그램에서 차지하고있는 치수 인 정점과 idk가 많이 있기 때문에 어떻게 그 정점을 찾을 수 있는지 알고 싶습니다. – Giuseppe
먼저 정점을로드해야합니다. 프로그램. 이렇게하면 경계 상자를 만들기 위해 각 차원에서 가장 작은 위치와 가장 높은 위치의 꼭지점을 찾아야합니다. 그런 다음 여러분이 모델을 어떤 행렬'M'으로 스케일하고자한다면 같은 행렬에 의해'min'과'max'를 스케일합니다. 오브젝트가 회전 될 경우 바운딩 박스가 잘 작동 할 수 있습니다.이 경우 해당 시나리오에서 잘 작동하기 때문에 구체 메소드를 사용하고자 할 수 있습니다. 그러나 가장 작은 최적의 구를 찾는 것이 더 어렵습니다. http://goo.gl/jPGWNA –
감사합니다. 도움이되었습니다. :디 – Giuseppe