관성 텐서 계산


10

나는 아직 잘 이해하지 못하기 때문에 가능한 한 최선을 다하고 설명하려고 노력할 것입니다.

짧은 버전 : 객체 모양을 기반으로 관성 텐서를 계산하기위한 일반적인 c ++ / physx 공식이 있습니까?

Long Version : 물리학에서는 x, y 및 z 관성 텐서를 지정해야합니다. 현재 우리가하는 방식은 질량에 기초한 비율 일뿐입니다. 따라서 객체가 X 축에서 길고 Y 및 Z에서 얇고 질량이 10000이면 Z와 Y를 7000으로, X를 3000으로 설정합니다. (정확하지는 않지만 아이디어를 제공하기 위해)

이것은 상대적으로 잘 작동하지만 가장 큰 문제는 어딘가에 관절 불안정이있을 때 가장 잘 작동하는 것을 알아낼 때까지 텐서에서 추측해야합니다. 우리가 매우 큰 물리 시뮬레이션을 가지고 있고 20 개 이상의 조인트 중 하나가 다른 모든 것의 안정성을 잃게되면 시간이 많이 걸릴 수 있습니다.

내가하고있는 일은 객체의 경계 상자를 가져 와서 비교적 정확한 텐서를 계산하는 기능입니다. http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors 에서 수학 중 일부를 가져 와서 비슷한 회전을 위해 기본적으로 다음과 같은 기능을 수행했습니다.

너비 w, 높이 h, 깊이 d 및 질량 m의 입체 입방체 여기에 이미지 설명을 입력하십시오

또는 회전이 다음과 같은 경우 :

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

따라서 이것은 우리가하고있는 방식과 비슷한 결과를 제공하는 것처럼 보이지만 일반적인 용도로 작동하는지 확인하지 않고이 방법으로 전환하고 싶지 않습니다. 아래는 큐브와 중심 피벗이있는 첫 번째 이미지를 기반으로 한 함수 코드입니다.

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

이것이 올바른 방법임을 보장 할 수는 없습니다 (가장 정확한 방법은 경계 상자 대신 실제 모양을 사용하는 것입니다). 관성 텐서와 수학에 익숙하지 않지만 숫자를 반환하는 것 같습니다 우리가 사용했던 것과 상당히 비슷합니다. 여기에 더 좋은 방법이 있는지 아는 사람이 있습니까?


3
물체를 4 면체로 분해 할 수 있다면, 4 면체의 관성 모멘트 (예를 들어 Wolfram Alpha로 찾을 수 있음)에 대한 기본 공식과 함께 텐서의 선형성을 사용하여 정확한 값을 계산할 수 있어야합니다 텐서. 바운딩 박스 방법에 대한 나의 관심은 그것이 객체가 채우는 BB의 양에 실제로 달려 있다는 것입니다. 예를 들어, 타원체와가는 헬리컬 스프링의 차이를 상상해보십시오.
Steven Stadnicki

입력 주셔서 감사합니다. 그리고 당신은 맞습니다. 'A'자형 물체가있을 때 내 주요 문제가 발생합니다 .BB는 텐서가 잘못 돌아 오게합니다. 정보를 확인하겠습니다 감사합니다!
Mungoid

당신은 환영합니다-당신이 이것을 더 자세히 살리기를 원한다면, 나는 그것에 대한 적절한 대답을 만들 수 있어야하지만 그것은 당신을 시작하기에 충분해야합니다.
Steven Stadnicki

당신이 기꺼이 할 것이라면, 그것은 대단 할 것입니다! 나는 이것을 잠시 동안 알아 내려고 노력하고 있지만, 나는 여전히이 영역에서 약간의 신생하고있다. 그래서 나는 점점 더 혼란스러워진다. =-)
Mungoid

답변:


7

볼륨 정리를 표면 적분으로 변환하기 위해 Green 's Theorem을 사용하는 일반적인 공식은 적용되지 않으므로 실제로는 그림의 사면체 분해를 제공해야하기 때문에 이것이 어려운 문제라고 제안하려고했습니다. 그게 맞지 않습니다. 모양이 균일 한 밀도 (이미 어쨌든, 아마도 대부분의 환경에서 완벽하게 합리적인 것으로 추정되는 근사치) 인 한, 부피 적분은 표면 적분으로 단순화되고 후자는 더욱 단순화 될 수 있습니다. 더 좋은 방법은, 꽤 잘 보이는 알고리즘이있는 것 같습니다. http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html보십시오, Brian Mirtich의 페이지는 모멘트와 질량 중심을 계산하기위한 알고리즘을 설명합니다. 이면에서 거의 모든 요구를 충족시켜야합니다. 셰이프 내보내기 도구 또는 가져 오기 시간에 도구로 한 번만 수행하려는 작업이지만 매 프레임마다 수행해야하는 작업은 아닙니다. 나머지 형상 정보와 함께 질량 중심에 대한 관성 텐서를 저장하고 다른 축에 대한 관성 모멘트에 대한 텐서를 찾아야하는 경우 표준 정리를 사용하여 파생 할 수 있습니다.

잘하면 이것은 당신이 필요로하는 것을 커버해야합니다-도울 수있는 것이 더 있으면 알려주세요!


4

나는 이것을 직접 한 적이 없지만 임의의 메쉬에 대한 빠른 솔루션을 작성해야한다면 객체 내부에 충분한 질량 포인트를 생성하여 객체에 근사하고 관성 텐서를 계산할 것입니다.

점은 모양의 경계 상자 내에서 균일하게 생성 된 다음 실제 모양 외부에있는 점을 버릴 수 있습니다. 이것은 점이 도형 안에 있는지 확인하는 문제를 줄입니다.


0

대부분의 게임 응용 프로그램 (예 : "부 풀리는 것")의 경우 위에 주어진 사각형 솔리드에 대한 방정식을 사용하는 것만으로도 충분합니다. 개체가 경계 상자를 가로 지르는 대각선이 아닌 축으로 정렬되어 있어야 작동합니다. ODE와 같은 일부 게임 물리 엔진은 관성 텐서의 주 대각선에있는 용어 만 사용합니다. 그것들을 위해, 물체가 올바르게 작동하려면 최소한 축 정렬이 필요합니다.

필자는 1997 년 Falling Bodies에서 Mirtich의 알고리즘을 사용했습니다. 잘 작동하지만 토폴로지에 맞는 닫힌 비 자체 교차 메시 인 깨끗한 지오메트리가 있어야합니다. 구멍이있는 경우 관성 계산은 완전히 잘못된 결과를 생성합니다. 볼록 지오메트리 만 사용했기 때문에 QHull을 먼저 실행하여 충돌 목적으로 볼록 껍질을 얻은 다음 그로부터 관성을 계산했습니다.

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