문제

속도 벡터를 따라 움직이는 발사체 물체가 있습니다. 물체가 항상 속도 벡터 방향으로 향하고 있는지 확인해야합니다. 또한, 나는 행렬이 아닌 쿼터니언을 사용하여 객체 회전을 나타냅니다.

첫 번째 단계는 직교 기반을 찾는 것입니다.

forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward) 
up = cross(forward, right)

기초를 회전 4 중주로 어떻게 전환 할 수 있습니까?

해결책

Noel Hughes에게 답을 제공 한 것에 대해 신용을주고 싶지만 내 경험을 명확히하고 싶습니다. 의사 코드는 다음과 같습니다.

   vec3 vel = direction of velocity vector
   vec3 forward = (1, 0, 0)  // Depends on direction your model faces. See below.
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit // Already facing the right direction!
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)

4 차의 마지막 요소는 스칼라 부분이고, 처음 세 요소는 가상의 부분입니다. 또한 위의 의사 코드는 "모델 공간"의 객체가 양의 x 축을 가리 킵니다. 제 경우에는 물체가 실제로 양의 y 축을 가리 켰는데,이 경우 다음과 같은 변경을했습니다.

   vec3 vel = direction of velocity vector
   vec3 forward = (0, 1, 0)  // Note that y-component is now 1
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit 
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
   // Note that SECOND component above is now 0
도움이 되었습니까?

해결책

나는 당신이 발사체의 방향을 신경 쓰지 않는다고 가정합니다. 세로 축이 속도 벡터와 정렬되고 세로 축이 (1, 0, 0)의 x 축이라고 생각합니다.

당신은 올바른 길을 가고 있습니다. 속도 벡터 (vx, vy, vz)/sqrt (vx^2 + vy^2 + vz^2) X 축을 교차하여 결과를 정규화하고 - (0, yn, Zn) - 회전입니다. 쿼터니언의 축. 회전 각도는 단순히 theta = vx/sqrt (vx^2 + vy^2 + vz^2)의 역 코사인입니다. 그 결과 쿼터니언이 있습니다

(0, yn, Zn) sn (theta/2) cos (theta/2)

궁금한 점이 있으면 알려주세요.

Noel Hughes nhughes1ster@gmail.com

다른 팁

나는 그것을 볼 것이다 Vecmath 라이브러리 (자바). 오랜 시간이 걸렸으며 우리는 지역 사회에서 사용합니다. 그것은 4- 튜플을 기반으로하며, 변형을위한 간단한 방법이 없다면 실망 할 것입니다.

또한 예상 결과에 대한 단위 테스트도 작성했습니다. 긍정적이고 부정적, 왼손잡이, 오른 손잡이, Movinig/Reference 프레임을 혼란스럽게하는 것은 매우 쉽습니다. 단순한 것 (예 : XYZ)으로 시작하여 정답이 있는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top