쿼터니언을 사용하여 헬리콥터를 제어 할 수 있습니까?


9

3D로 단순화 된 헬리콥터 (현재 큐브) 시뮬레이션을 만들려고하는데 회전에 문제가 있습니다. 헬리콥터는 세 축을 따라 회전 할 수 있습니다.

  • 후면 프로펠러를 사용하여 자체 회전 : y 축 회전
  • 왼쪽 또는 오른쪽으로 기울여 왼쪽 또는 오른쪽으로 이동 : z 축 회전
  • 위 또는 아래로 기울여 앞뒤로 이동 : x 축 회전

각 축을 개별적으로 제어 할 수 있어야합니다. 지금까지 오일러 앵글을 사용해 보았지만 회전 순서에 관계없이 짐벌 잠금 장치 또는 일부 축 "위치 전환"을 실행했습니다.

쿼터니언을 사용해야하는 것 같지만 쿼터니언은 방향과 각도를 사용하기 때문에 각 축을 제어하는 ​​방법을 모릅니다. 3 개의 쿼터니언을 만들어 곱해야합니까? 같은 문제가 발생하지 않습니까?

이상한 점은 손가락을 사용하여 헬리콥터의 세 축 (엄지 손가락 = y, 색인 = z, 중간 = x)을 나타내면 이러한 문제가 발생하지 않는 것입니다. 왜?


장면 그래프에 액세스 할 수있는 경우, 실행 가능한 대안은 각 축에 대해 중첩 된 컨테이너를 가진 다음 개별적으로 회전하는 것입니다.
bummzack

@bummzack, 예, 이것에 대해 생각했습니다. 그러나 특정 순서로 3 개의 회전 행렬을 연결하는 것과 동일하지 않습니까?
subb

당신은 맞습니다 @Subb, 각 축에 대한 회전을 개별적으로 저장하지 마십시오. 유러 앵글과 같은 문제가 있습니다. 어떻게 사용하든 행렬과 쿼터니언은 짐벌 잠금으로 고통받을 것입니다.
Maik Semder

@Maik Semder, 그러면 헬리콥터의 피치 / 요잉 / 롤을 어떻게 제어 할 수 있습니까?
subb

@ Subb @Flip과 내 대답은 기본적으로 어떻게하는지 알려줍니다.
Maik Semder

답변:


4

헬리콥터의 현재 방향을 저장하기 위해 행렬 또는 쿼터니언을 사용할 수 있어야합니다. 당신이 겪고있는 문제는 피치 / 요 / 롤 변경을 헬리콥터에 적용하는 방법입니다.

각 프레임마다 로컬 공간의 헬리콥터에 피치 / 요 / 롤을 적용하고 싶다고 생각합니다. 해당 프레임의 피치 / 요 / 롤을 변경하고 회전 매트릭스를 구성하여이를 수행 할 수 있습니다 (오일러 각도로 수행 할 수 있음). 그런 다음이 행렬로 헬리콥터의 이전 방향을 회전합니다 (이전 방향은 행렬 또는 쿼터니언으로 표시됨). 새 프레임의 방향을 알려줍니다.

헬리콥터의 방향을 쿼터니언으로 나타내는 것은 쿼터니언 간 보간이 행렬 간 보간보다 훨씬 쉽다는 이점이 있습니다. 따라서 미래에 현재 방향이 있고 원하는 시간에 새로운 방향으로 가져올 프레임 별 회전을 계산하려는 경우 쿼터니언 표현이 더 친숙 할 수 있습니다.


그것이 내가 한 방법입니다. 로컬-> 세계 변환을 나타내는 행렬에 증분 업데이트를 적용하십시오. 매트릭스를 정규화해야합니다. 수백 프레임 후에는 반올림 결과가 표시되지 않습니다.
Patrick Hughes

또한 x / y / z 축을 나타 내기 위해 손으로 짐벌 잠금 문제가 보이지 않는 이유에 대한 최종 질문에 대답하려면 아마도 피치, 요 및 롤 값을 손의 로컬 프레임에 적용하기 때문입니다. 참고. 오일러 각도로 회전 행렬을 구성하는 작업은 월드 x를 중심으로 회전 한 다음 결과 y를 기준으로 한 다음 결과 z를 기준으로 회전합니다 (x / y / z의 실제 순서는 순서가 다를 수 있음). 이 방법으로 회전을 적용하면 짐벌 잠금 장치가 어떻게 나타나는지 알 수 있습니다.
Flip

3

기본적으로 다른 모든 회전 표현을 사용할 수 있지만 오일러 각도를 사용할 수 있습니다. 행렬, 쿼터니언 심지어 축 각도도 원하는 작업을 수행합니다.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

당신은 옳습니다, 당신은 같은 문제로 끝날 것입니다. 핵심은 객체의 현재 방향 (매트릭스, 쿼터니언)을 저장하고 방향을 변경할 때 델타 만 적용 하는 것입니다.

y를 중심으로 10도 회전하려면 델타 행렬 / 쿼터니언을 만들고 현재 방향으로 곱하십시오 (행렬에 후행 곱셈을 사용하는 경우). 다른 방법으로 곱하면 객체의 y 축이 아닌 세계의 y 축을 중심으로 시스템이 회전합니다.

내가 찾는 또한 소스 코드를 함께 제공하고 매우 잘 이론을 설명하고, 자원이 매우 유용합니다.


-1

내가보고 있다고 생각하는 문제는 축 회전과 속도 벡터의 차이이며 방향이 누락 된 것입니다. 헬리콥터가 앞으로 기울어지기 위해 앞으로 기울어지면 헬리콥터 블레이드의 추진력이 X 축에 표시된 것과 수직으로 공기를 아래로 그리고 뒤로 밉니다.

네가 놓친 자유도는 네 가지입니다. 블레이드의 속도는 추진되는 공기의 양을 제어하며 헬리콥터가 생성하는 리프트의 양도 제어합니다.

그럼에도 불구하고 "왼쪽과 오른쪽으로 기울이기"및 "위와 아래로 기울이기"는 일반적으로 주어진 비행기에서 헬리콥터를 제어합니다. 즉, 헬리콥터가 앞, 뒤로 또는 측면으로 기울어 질 때 아래쪽으로 날아 가지 않아야합니다. 그러나 리프트 양이 변경되어야하고 속도는 오른쪽 삼각형의 "반대"쪽에 의해 제어됩니다. 직선 아래로 (중력), 빗변 (리프트)으로 헬리콥터를지면에 연결합니다. 속도 벡터를 사용해야합니다.

쿼터니언을 사용하여이를 수행 할 수 있지만 쿼터니언 값을 헬리콥터 자체의 기울기에 근거하지 마십시오. 대신 헬리콥터가 생성하는 운동력을 사용해보십시오.


그것은 실제로 질문에 대답하지 않습니다. 생각할 음식을 더 추가하면됩니다.
bummzack

현재 헬리콥터 회전을 사용하여 리프트 힘 벡터를 변환하고 있는데, 이는 헬리콥터 공간에서 위쪽을 향하고 있습니다. 반대 방향으로 즉 벡터를 직접 수정 한 다음 헬리콥터를 회전시켜야합니까?
subb

나는 당신이 지금하고있는 일을 모두 한 다음 블레이드의 정상에 따라 헬리콥터의 회전 결과를 변경해야한다고 생각합니다. 즉, 2 회전이 있습니다. 하나는 블레이드에 적용되고 다른 하나는 헬리콥터의 실제 회전을 나타냅니다. 분명히 모두 쿼터니언에 저장됩니다.
decelratedcaviar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.