카테고리 보관물: 게임개발

게임개발

2D 객체를 감싸는 팽팽한 와이어가 가하는 힘을 어떻게 계산합니까? 있다고 가정하고 2D 환경을 감싸는 “와이어”를 호출한다고

물리 기본 요소가 있다고 가정하고 2D 환경을 감싸는 “와이어”를 호출한다고 가정합니다 ( 이 질문에 설명되어 있음 ).

다음은 그 모습을 보여줍니다.

정적 및 동적 게임 오브젝트를 감싸는 와이어

예제 그림에서 : 와이어가 상자를 위쪽으로 잡아 당기고 있고, 상자를 아래쪽으로 당기고 있습니다. 스프링의 물체가 와이어에 의해 아래쪽으로 밀리고 있지만 와이어를 위쪽으로 밀고 있습니다.

아직 구현 방법을 알지 못했지만 와이어가 감싸는 지점을 가로 질러 자유롭게 미끄러질 것이라고 가정합니다.

2D 물리 시뮬레이션 (예 : 프레임 기반)에서 이와 같이 와이어로 연결되거나 래핑 된 객체에 적용 할 힘 (또는 임펄스)을 어떻게 계산합니까?


첫 번째 질문 에서 언급했듯이 , 와이어에 “정적”비 정적 물체 만 질량이 질량이라면 질량과 이전 점 사이의 고정 길이 조인트와 힘이 같을 것입니다. 그 와이어에.



답변

와이어를 당기는 상자는 와이어에 장력을가합니다. 장력은 뉴턴 단위로 측정되는 힘입니다. 와이어와 환경 사이에 마찰이없는 간단한 가정을하면 와이어의 모든 지점에서 장력이 동일합니다.

예를 정적이라고 생각하면 와이어의 장력은 상자의 무게입니다.

T = m * g

여기서 m은 상자의 질량이고 g는 중력으로 인한 가속입니다 (즉, 9.8m / s ^ 2). 이것은 정적 경우에만 유효합니다. 동적 경우에서 계산하는 방법에 대한 설명은 아래를 참조하십시오.

와이어의 각 굽힘에서의 힘은 장력을 관련 방향으로 투영하는 것입니다. 예를 들어 스프링 물체의 끝 부분의 힘은 접촉 법선을 따르는 힘입니다.

F = T * cos(angle between wire and contact normal)

이 경우 접촉 법선 방향은 와이어 세그먼트 사이의 각도의 이등분입니다. 환경에서 두 번째로 표시된 지점의 힘은 긴장이나 다른 것에 영향을 미치지 않기 때문에 관련이 없습니다.

이제 동적 인 경우 장력은 단순히 와이어에 부착 된 상태로 유지하기 위해 상자에 적용하는 구속력입니다. 물리 엔진이 임펄스 기반이라면 장력은 다음과 같습니다.

T = impulse / timestep

이것은 전선을 환경에 감싸는 일반적인 알고리즘으로 이어집니다. 중요한 특성은 와이어의 총 길이입니다. 마지막 세그먼트 만 시뮬레이션하면됩니다. 모든 이전 세그먼트는 고정 된 것으로 간주 될 수 있습니다. 따라서 마지막 세그먼트의 길이를 알고 있으므로 전체 길이에서 이전 세그먼트의 길이를 빼십시오. 그런 다음 마지막 세그먼트는 간단한 스프링 제약 조건이 될 수 있습니다. 그런 다음 환경과 교차 할 때마다 세그먼트를 분할하고 굽힘이 펴질 때 분할을 제거하십시오.


답변

이 와이어 기반 스레드에서 좌절을 주셔서 감사합니다. 해결하기 어려운 문제입니다. 우리는 충돌이 완벽하게 작동하지는 않았지만 구속 조건 시뮬레이션은 확실히 가능하고 간단합니다.

와이어 구속 조건은 실제로 일반 거리 구속 조건과 거의 동일합니다. 두 개의 구속 점 대신, 각 꼭지점에 대해 n 개의 세그먼트가있는 와이어에 대해 n + 1이 있습니다. 끝점에서 Jacobian은 거리 제약과 동일합니다 (즉, d / | d |와 같습니다. 여기서 d는 벡터입니다) 내부 노드의 경우 Jacobian은 (a / | a |-b / | b |)와 비슷합니다. 여기서 a와 b는 노드에서 인접 노드까지의 벡터입니다. (미안하지만, 이것을 만진 지 몇 년이 지났습니다 …)

예를 들어, 객체가 다른 세그먼트와 상호 작용할 수 있지만 로프 끝에서 질량을 시뮬레이션하기 만하면되기 때문에 “마지막 세그먼트 만 동적입니다”라는 가짜를 만들 수 없습니다. 질량이 없다. 각 노드에서 계산 된 구속 조건 임펄스는 해당 노드에서 충돌하는 객체에 적용되어야합니다.

다음은 몇 가지 관련 논문입니다.

처음 3 개는 비교적 최근의 것으로 많은 도움이됩니다. 하단의 75 페이지에는 본질적으로 와이어 인 “멀티 바”구속 조건이 설명되어 있습니다.

행운을 빕니다 🙂

레이건


답변

기본 아이디어는 로프의 길이가 동일하게 유지된다는 것입니다. 위로 밀면 “분할 점”을 만들어야합니다. 그런 다음 로프는 해당 방향으로 “성장”할 수 없으므로 부착 된면을 결정합니다. 오른쪽에 부착되어 있기 때문에 왼쪽의 로프 부분이 짧아지고 분리 점과 부착 점 사이의 부분이 약간 길어집니다. 그런 다음 Niall이 말했듯이 와이어의 장력을 계산하십시오. 내가 이것을하는 방법은 로프의 각 “조각”의 장력을 계산하는 것입니다. 그런 다음이를 사용하여 관련된 힘을 결정할 수 있습니다.

도움이 되었기를 바랍니다.


답변