2010-11-30 2 views
7

취미 게임 엔진에서 회전을 위해 축 각도 벡터를 사용하여 실험하고 있습니다. 이것은 라디안 단위의 회전 길이를 갖는 회전축을 따르는 3 성분 벡터입니다. quats 또는 회전 행렬과는 달리, 실제로 숫자를 볼 수 있고 그들은 사원 수 또는 행렬보다 약간 적은 메모리있어 내 마음 회전 축 벡터 결합

  • 에 회전을 시각화

    • : 때문에 나는 그들처럼.
    • 나는 파이에 -Pi의 범위를 벗어나는 값 (I는 각속도를 저장하는 경우이 중요하다) 그러나

    을 나타낼 수, 나는 내 모든 개체의 회전을 (업데이트 꽉 루프가 수십 수천의) 각속도에 따라. 현재 두 회전 축 벡터를 결합하는 유일한 방법은 쿼터니언으로 변환하고 곱한 다음 결과를 다시 축/각도로 변환하는 것입니다. 프로파일 링을 통해이 문제를 병목 현상으로 파악했습니다. 누구든지 좀 더 직접적인 접근법을 알고 있습니까?

  • +0

    가 3 개 값이 3 개 직교 축에 대한 연속 회전을 나타내는 것을 의미합니까? 기본적으로, [φ, psi, θ]는 RX (φ) * RY (psi) * RZ (theta)를 나타낼 수있는 오일러 각도입니다. 이 경우 3x3 회전 행렬을 만드는 방법을 찾고 축 각도를 가져와야합니다. – ja72

    +0

    아니요, 오일러 각을 사용하지 않았습니다. 이것은 벡터의 길이가 각도 인 축 각도입니다. – Dwayne

    답변

    2

    귀하의 회전 벡터가 단위 길이 인 경우 표현은 quaternion rotation과 동일합니다. Quaternion 데이터 구조를 사용하지 않으려면 회전 벡터의 단위 길이가 맞는지 확인한 다음 quaternion multiplications/reciprocal computation을 계산하여 집계 순환을 결정하십시오. 곱셈 또는 덧셈의 수를 줄일 수 있습니다.

    각도가 변경되는 유일한 경우 (즉, 회전 축이 일정한 경우), 각도의 선형 크기 조정을 간단하게 사용할 수 있습니다. 원하는 경우 mod를 범위 [0, 2 π].

    θ (t : 당신은 시간 t 에서 θ 의 초기 각도에서 시작 초당 α raidans의 회전 속도가 경우에 따라서, 다음 시간 t에서 최종 회전 각도는 다음과 같이 주어진다) 그런 다음 바로 벡터의 컬렉션에 그 회전을 적용 모드 2 π

    θ + α (TT) =.

    성능을 향상시키지 못하면 사용중인 응용 프로그램 종류에 맞게 미리 준비된 쿼터니언 라이브러리를 사용하는 것이 좋습니다.

    +0

    1. 내 벡터는 단위 길이가 아닙니다. 길이는 라디안 단위의 회전 각도입니다. 2. 쿼터니언 데이터 구조를 사용합니다. 3. 많은 경우에 내 각도 만이 유일한 변화는 아니지만 좋은 최적화 검사가됩니다. – Dwayne

    +0

    "합계 회전을 결정하기 위해 등가 쿼터니온 곱셈/역수계 연산을 수행합니다."축 각도에서 쿼터니언으로 변환하고 다시 되 돌리는 것과 동일합니까? 현재 구현 된 것은 Matrix 및 Quaternion FAQ (http://www.j3d.org/matrix_faq/matrfaq_latest.html)에서 가져온 것입니다. – Dwayne

    1

    회전을 표현하기 위해 크기가 조정 된 벡터가 아닌 단위 쿼터니언을 사용해야합니다. 세 가지 매개 변수를 사용하는 회전의 표현이 어떤 시점에서 문제가 될 수 있습니다 (즉, 단수 임). 벡터의 길이가 0 (즉, ID)이고 길이가 2pi, 4pi 등인 경우에 발생합니다.이 경우 표현은 단수가됩니다. 단위 쿼터니언과 회전 행렬에는이 문제가 없습니다.

    설명에서 수치 적분의 결과로 회전 상태를 업데이트하는 것처럼 들립니다. 이 경우 회전 속도 (\ omega)를 쿼터니언 속도 (q_dot)로 변환하여 회전 상태를 업데이트 할 수 있습니다.우리로 쿼터니언을 나타내는 경우에는 Q = (Q0) (Q1)의 2 분기 Q3] Q0는 스칼라 부분은 여기서

    [ -q1 -q2 -q3 ] 
    E = [ q0 -q3 q2 ] 
        [ q3 q0 -q1 ] 
        [ -q2 q1 q0 ] 
    

    는 그런 다음 업데이트

    Q (K + 1이

    q_dot = E*\omega 
    

    ) = q (k) + q_dot * dt

    단순한 통합을 위해. 선택한 경우 다른 통합 업체를 선택할 수 있습니다.

    +0

    회전이 단수로된다는 것은 무슨 의미이며, 어떤 문제가 발생합니까? – Dwayne

    +1

    문제가 될 수도, 없을 수도 있습니다. 이는 해당 지역에서 효과적으로 자유를 누릴 수 있음을 의미합니다. 즉, 표현과 다른 표현 (예 : 쿼터니언) 간의 비율을 변환하려면 변환 행렬 (즉 자 코비안)이 단수 (반전되지 않음)입니다. – Commodore63

    2

    각도 축 값으로 유지할 수 있습니다.

    각도 축 값 (x,y,z)을 사용하여 교차 곱 (anti-symmetric) 행렬을 만들고이 행렬의 요소에 각도 값을 곱하여 가중치를 부여합니다. 이제 모든 교차 곱 행렬 (one for each angle axis value)을 요약하고 지수 행렬을 사용하여 최종 회전 행렬을 찾으십시오. 행렬 A는 (각도 축 값에서 내장)이 외적 행렬을 나타내는 경우

    후,

    exp(A)

    는 회전 행렬 R (i.e., equivalent to your quaternion in matrix form) 동일하다. 따라서

    , 아마

    exp (A1 + A2) = R1 * R2 
    

    결국 더 비싼 calucation

    이 ...