2011-05-16 4 views
1

나는 물리학이 필요한 XNA의 2D 게임을 연구 중이다. 나는 Farseer와 같은 물리 엔진이 그들이 작동하는 몇 가지 방법으로 인해 그것을 자르지 않을 것임을 알았다. (필자가 물리학을 직접 작성해야한다는 것을 알기 위해 코드를 3 번 ​​다시 작성하는 긴 이야기가 있습니다.) 그래서 제가 사용하고있는 참고 자료에 따르면, 지금 필요한 유일한 데이터는 표면의 법선입니다 충돌의.픽셀 위치를 평균하여 표면 법선을 찾습니다. (2D)

이것은 스프라이트를 사용한 픽셀 단위 충돌 감지를 사용합니다. 현재 모든 겹치는 픽셀과 그 위치의 배열이 있습니다. 이 데이터를 사용하여 겹치는 픽셀의 위치를 ​​평균하여 그 표면의 법선을 계산하는 방법에 대해 설명하겠습니다. 그러면 내가 불규칙한 모양의 물체와 충돌을 일으키지 만 여전히 현실적인 물리학 적 상호 작용을 유지할 수 있습니다.

누군가이 표면 정보를 알아 내기 위해이 픽셀 정보를 사용할 수있는 방법에 대한 제안 사항이 있거나 충분히 가까이있는 것이 좋습니다.

감사합니다.

답변

2

대신 스프라이트의 각 점 (즉, 별도의 질감)에 대한 법선을 계산하는 대신 계산하려고합니다. 이렇게하면 법선을 조정하여 충돌이 "자연스러워"보이도록 할 수 있습니다 (게임의 관점에서 볼 때 물리학적인 관점에서 볼 때 정확하지는 않음).

+0

귀하의 제안은 흥미 롭습니다. 그러나 법선을 텍스처에 저장하고 텍스처에 액세스하는 방법을 설명해 주시겠습니까? 나는이 세부 사항에 명확하지 않다. – APalmer

+0

보통은 jsut 1 또는 2 (2D 공간에서) 또는 2/3 플로트 숫자입니다. 따라서 텍스처에 쉽게 저장 될 수 있습니다 (가능한 텍스처 형식은 http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.surfaceformat(v=XNAGameStudio.31).aspx 참조) . '일반적인 매핑'샘플을 검색하여 일반적인 사용 방법을 확인합니다 (예 : http://create.msdn.com/en-US/education/catalog/sample/normal_mapping). 픽셀 쉐이더는 여러 텍스처를 동시에 액세스 할 수 있으므로 여러 텍스처의 데이터를 병합하는 것은 비교적 쉽습니다. –

1

[편집] - 나는

당신은 단지 각 스프라이트에 2D 형상을 첨부 할 수있는 기능을 가지고하는 것이 좋습니다 ... 내 테이블 중심의 접근 방식보다 더 나은 알렉세이의 스프라이트 법선 아이디어를 좋아하지만, 여전히 추가합니다 . 실제 폴리곤 충돌을 수행하는 기능을 제공합니다. 스프라이트 콜리 전을 결정할 때 두 스프라이트의 폴리곤을보고 표준 충돌 물리를 적용합니다.

0

다음과 같이 작동 할 수 있습니다. 문제가되는 두 개의 가장 취약한 픽셀 (각 신체에 하나씩)을 찾아서 그 사이에 임시로 봄을 가해 분리시킵니다. 기본적으로 픽셀 콤보 중 가장 큰 오버랩 (분리와 반대)이 있고 오버랩 양에 비례하는 힘을 적용합니다. 이것은 시스템에 에너지를 추가하므로 댐퍼 (상대 속도에 비례하는 힘)를 추가하는 것도 고려하십시오. 내가 자주 사용하는 방정식은 다음과 같습니다

(reduced mass) = 1/(1/(mass 1) + 1/(mass 2)) 
(stiffness) = (reduced mass) * (response freq)^2 
(damping) = (ratio)*(reduced mass) * (response freq) 

내가 원하는 효과를 얻을 수있는 (response freq)(ratio) 양을 제어 할 수 있습니다. 응답 주파수는 얼마나 빠르게 겹침이 자체를 보정하기를 원하는지이며 "댐핑 비율"은 감쇠 응답을 미세하게 조정할 수있는 양보다 적거나 많을 수있는 양수입니다.

관련 문제