원점 대신 3D에서 임의의 점을 기준으로 회전하려면 어떻게해야합니까?


15

원점을 중심으로 회전하는 대신 쿼터니언을 사용하여 정상적인 방식으로 회전하려는 모델이 약간 있습니다. 나는 당신이 3D 공간에서 한 점을 중심으로 회전한다고 말하지 않는다는 것을 알고 있습니다. 축을 중심으로 회전한다고합니다. 그래서 꼬리가 로컬 원점이 아닌 벡터를 중심으로 회전하는 것으로 시각화하고 있습니다.

렌더링 / 물리 엔진의 모든 아핀 변환은 SQT (스케일, 쿼터니언, 번역; Game Engine Architecture 책에서 빌린 아이디어)를 사용하여 저장됩니다 . 이 시스템에서는 평행 이동이 적용된 다음 크기 조정, 회전이 적용됩니다.

특정한 경우에는 월드 공간에서 오브젝트를 변환하고, 크기를 조정하고, 오브젝트의 로컬 원점을 중심으로하지 않는 정점을 중심으로 회전시켜야합니다.

질문 : 위에서 설명한 현재 시스템의 제약 조건을 감안할 때 원점 이외의 점을 중심으로 로컬 회전을 수행하려면 어떻게해야합니까? 행렬 만 사용 하여이 작업을 수행하는 방법을 설명 할 수있는 사람에게 자동 투표


쿼터니언은 이미 임의 축을 중심으로 한 회전을 설명합니다. 당신은 문제가 않습니다 건설 당신이 가지고있는 데이터와 같은 쿼터니언을?
Martin Sojka

3
진지하게 대답을 찬성하는 사람들이 실제로 읽을 수 있습니까? 나는 방법, 효율적인 공식, 심지어 시연까지했다. 그러나 유일하게 공감 된 답변은 일부 귀중한 정보 (및 명백히 잘못된 정보)를 제공하는 동시에 이들 중 어느 것도 특징이 아니며 질문에 대한 답변도하지 않습니다!
sam hocevar

@ MartinSojka, 이것은 임의의 축이 아니라 약점입니다.
notlesh

@ SamHocevar 귀하의 답변 모두 도움이되었습니다. 더 철저하고 솔루션에 도달하는 데 도움이 되었기 때문에 귀하를 선택했습니다. 둘 다 감사합니다.
notlesh

아 죄송합니다-Dual Quaternions와 혼동했습니다 (번역은 "무료"입니다). 나는 나중에 대답에서 의미했던 것을 쓸 것이다; 어쩌면 다른 사람이 유용하다고 생각할 수도 있습니다. 특히 세 가지 구성 요소를 조금 더 복잡하게 만들 수 있기 때문에 세 가지 구성 요소를 하나로 줄일 수 있기 때문입니다.
Martin Sojka

답변:


17

한마디로

SQT 양식에서 T 만 변경하면됩니다.

번역 벡터 교체 vv' = v-invscale(p-invrotate(p))경우 v, 초기 번역 벡터, p당신은 회전이 발생 할 주위에 점이며,을 invrotateinvscale당신의 회전 및 규모의 역수이다.

빠른 데모

하자 p당신이 회전을 적용하는 주위에 지점을 수 r. 하자 s당신의 스케일링 매개 변수와 일 v번역 벡터. 최종 행렬 변환은 T(p)R(r)T(-p)S(s)T(v)입니다 R(r)S(s)T(v).

당신이 원하는 것은 새로운 변환 매개 변수입니다 v', r'그리고 s'최종 행렬 변환이되도록 R(r')S(s')T(v')우리가 있습니다 :

T(p)R(r)T(-p)S(s)T(v) = R(r')S(s')T(v')

무한대의 동작은 회전 매개 변수 및 스케일링 매개 변수가 변경 될 수 없음을 나타냅니다 (이것은 설명 가능). 따라서 우리는이 r = r's = s'. 따라서 누락 된 매개 변수는 v'새 번역 벡터입니다.

T(p)R(r)T(-p)S(s)T(v) = R(r)S(s)T(v')

이 행렬이 같으면 역수는 같습니다.

T(-v)S(-s)T(p)R(-r)T(-p) = T(-v')S(-s)R(-r)

이것은 특히 원산지에 해당합니다 O.

T(-v)S(-s)T(p)R(-r)T(-p)O = T(-v')S(-s)R(-r)O

원점의 크기를 조정하고 회전하면 원점이 생성됩니다.

T(-v)S(-s)T(p)R(-r)(-p) = -v'

v'SQT 형식으로 변환을 저장할 수있는 새로운 번역 벡터입니다. 계산을 단순화하는 것이 가능할 것입니다. 그러나 최소한 필요한 스토리지 는 증가하지 않습니다.


설명 주셔서 감사합니다. BTW, SQT 표현 트릭에 대해 더 자세히 읽을 수있는 리소스가 있습니까?
pachanga

내가 틀렸다면 정정하십시오. 또 다른 해결책은 쿼터니언을 정상적으로 저장하고 임의의 점 / 축 주위의 변환을 설명 해야하는 경우 포함 된 Q 행렬을 작성하고 단순히 변환 벡터를 추출하는 것입니다 이 행렬 (일반적으로 마지막 열)에서 개체 변환 벡터에 추가 한 다음 임시 행렬을 던져냅니다.
johnbakers 2012 년

15

회전 행렬을 도출하는 데 사용되는 모든 표준 회전 공식은 원점을 중심으로 회전하기위한 것입니다. 특정 점을 중심으로 회전을 적용하려면 먼저 원점을 오프셋하거나 회전하려는 점이 원점에 오도록 오브젝트를 이동시켜야합니다.

2D 사례가 더 간단하고 기술 규모가 크기 때문에 먼저 2D 사례를 고려하십시오. 원점을 중심으로 너비 2의 큐브가 있고 중심을 기준으로 45도 회전하려는 경우 2D 회전 행렬을 간단하게 적용 할 수 있습니다 .

그러나 대신 오른쪽 상단 모서리 ( 1,1)를 중심으로 회전 하려면 먼저 모서리를 원점으로 변환해야합니다. 번역은으로 번역 할 수 있습니다 -1,-1. 그런 다음 이전과 같이 객체를 회전 할 수 있지만 객체를 다시 번역하여 (by 1,1) 수행해야합니다 . 따라서 일반적 R으로 r약 점 의 회전에 대한 회전 행렬을 얻으려면 P다음을 수행하십시오.

R = translate(-P) * rotate(r) * translate(P)

여기서 translateand rotate는 정규 변환 / 회전 행렬입니다. 이런 일이 발생함에 따라, 이것은 회전에 축을 공급해야하는 경우를 제외하고는 3D로 간단하게 확장됩니다. 항상 표준 X, Y 또는 Z 축 회전 행렬을 선택할 수는 있지만 지루합니다. 임의의 축 각도 회전 행렬 을 사용하려고합니다 . R3D에서 의 최종 결과는 다음과 같습니다.

R = translate(-P) * rotate(a,r) * translate(P)

여기서 a회전 축을 나타내는 단위 벡터이며 회전 P공간을 나타내는 모형 공간의 3D 점입니다.

공교롭게도, 사원 수는 변환 할 수 있습니다 에서 당신이 방법은 당신이 그렇게 선택해야한다는 당신의 연결을 할 수 있도록, 행렬 표현. 또는 모든 것을 행렬로 남길 수 있습니다 (쿼터니언은 깔끔한 방식으로 보간하기가 쉽지만 필요한지 여부에 달려 있습니다).

또한:

그래서 꼬리가 로컬 원점이 아닌 벡터를 중심으로 회전하는 것으로 시각화하고 있습니다.

엄밀히 말하면, 벡터를 사용하여 위치를 원점으로부터의 변위로 간주하여 위치를 나타내는 데 사용할 수 있지만 벡터에는 위치 자체가 없으므로 그와 같이 시각화하는 것이 조금 이상합니다.


감사합니다. 좋은 답변입니다. 그래도 내 시스템의 제약 조건에 맞지 않습니다. 내 질문에 "이러한 제약 조건이 주어질 수 있습니까?"라는 질문에 포함시켜야하는데, 두 가지 번역이 필요하고 하나만 제공하기 때문에 그렇지 않다고 생각합니다. 이것은 아핀 변환의 표현으로 SQT를 사용하는 것이 불가피한 단점입니까?
notlesh

제약 조건에 완벽하게 부합합니다. 행렬 R (변환 회전 변환 역으로 생성)은 회전 행렬입니다. "SQT"시스템에서 Q를 R로 바꾸면 더 일반적인 스케일 회전 변환 패러다임이 생겼습니다. 마지막 변환은 원하는 회전을 생성하기 위해 수행 된 두 개의 중간 변환과 독립적입니다.

쿼터니언을 행렬로 바꾸겠다고 제안하고 있습니까? 객체 당 12 바이트가 더 있습니다 (4x3 행렬로 저장하면 8 개)! 그래도 나는 낙관주의자를 침묵시키고 이것을 소용돌이 치게 할 것이다. (실제로 발자국이 2kb 증가하지는 않을 것입니다 ...) 귀하의 답변에 감사드립니다.
notlesh

당신은 또한 그것들 사이에서 변환하여 회전 쿼터니언을 구성하고 기존 시스템에 다시 연결할 수 있습니다.

1
@SamHocevar : 대안으로, 이들의 조합은 단일 스크류 로 표현 될 수있다 .
Martin Sojka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.