두 객체 간 회전 유지


9

내 XNA 게임에는 충돌하는 두 개의 객체가 있습니다. 첫 번째 물체가 다른 물체와 충돌 할 때 물체를 걸고 세상을 움직일 수 있습니다. 나는 수학에 문제가 있습니다 (수학은 내 요점이 아닙니다). 나는 현재 두 번째 물체를 첫 번째 물체에 걸고 가지고 다니지 만 원래 방향으로 유지할 수는 없습니다. 따라서 물체가 위를 향하고 있으면 원래 항목과 어떻게 회전하는지에 대해이 방향을 유지해야합니다.

여기에 이미지 설명을 입력하십시오

이것을 달성하는 가장 좋은 방법에 대한 팁이 있습니까?


두 물체가 다른 물체 중심의 축을 중심으로 회전한다고 생각합니다.
MichaelHouse

답변:


3

각도에 관한 한, 두 번째 물체의 각도를 첫 번째 각도와 동일하게 유지하십시오. 위치의 경우 두 객체가 서로 충돌 할 때 거리 공식을 사용하여 첫 번째 객체에서 두 번째 객체의 거리를 찾습니다.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

첫 번째 개체를 기준으로 두 번째 개체의 위치를 ​​찾으려면

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

@tesselode의 답변 외에도 게임의 모든 월드 오브젝트에 대해 첨부 된 오브젝트 목록을 유지하는 것이 좋습니다. 의 라인을 따라 뭔가 List<WorldObject> AttachedObjects. 그런 다음 충돌을 감지하면 검은 색 사각형을 빨간색 사각형에 추가합니다 AttachedObjects. 그 후에는 부모의 위치를 ​​업데이트 할 때마다 @tesselode의 방법을 사용하여 어린이의 위치를 ​​업데이트하면됩니다.


2

나는 둘 중 하나가 지게차처럼 다른 것을 제어 할 것이라고 가정합니다. 당신의 그림에서 나는 이것이 검은 색이고 빨간색은 패키지라고 가정합니다. 당신은 각도에 문제가 있다고 언급하기 때문에 내가 다룰 것입니다.

물체가 서로 고정되면 두 물체의 각도 차이를 기억해야합니다 (이 세타라고 부릅니다). 그림 2에서 첫 번째 그림의 화살표를 서로 그려서 이것을 그렸습니다. 개체가 래칭되지 않을 때까지 빨간색 개체의 각도는 그림 3과 같이 검은 색 각도와 세타에 의해 결정됩니다.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

각도 차이


1

개체의 자식 개체를 가질 수있는 기능을 구현할 수 있습니다 (자식 개체는 부모의 위치 / 회전 변경에 따라 자동으로 영향을받습니다). 그런 다음 서로 고정해야 할 때 충돌이 발생하면 보이지 않는 객체를 만들고 연결된 객체를 모두 자식으로 만듭니다. 그런 다음 개별 객체에 변형 (이동, 회전)을 적용하는 대신 큰 객체에 변형을 적용하거나 개별 하위 객체에 여전히 힘을 적용하여 "부모가 있습니까?"를 확인합니다. 예, 힘은 부모에게 보내질 것입니다 (모든 자식 객체의 힘을 하나의 벡터로 병합하여 그 자체에 적용됩니다).

또한 John의 방법으로 달성하지 못하는 래칭 된 물체의 무게에 따라 보이지 않는 부모의 질량 중심을 계산하는 경우이 방법은 회전을 올바르게 처리해야합니다 (결합 된 물체는 새로운 공유 질량 중심을 중심으로 회전하지 않습니다). 객체 중 하나의 질량 중심 주위에)를 추가하면 추가 코드 없이도 이러한 종류의 동작을 쉽게 중첩 할 수 있습니다. 더 강력하고 유연한 접근 방식 인 것 같습니다.

+ 자식에 가해지는 힘이 관절을 부러 뜨릴 정도로 강하고 조건을 단순히 부모-> 자식 관계를 제거하여 "해제"를 처리 할 수있는 경우. 자녀가 한 명만 남은 경우 자녀를 분리시키고 보이지 않는 부모도 제거합니다.

관심이 있으시면 더 자세한 정보 (사진과 의사 코드 등)를 제공 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.