lerping 회전 거울


9

다음 코드를 사용하여 게임 캐릭터를 회전시켜 대상을 봅니다.

        transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)

startQuaternion은 새로운 대상이 주어 졌을 때 캐릭터의 현재 회전입니다.

lookQuaternion은 캐릭터가보아야 할 방향이며 다음과 같이 설정됩니다.

    destinationVector = currentWaypoint.transform.position - transform.position;
    lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);

turningNormalizer는 Time.deltaTime증분 turningSpeed되어 편집기에서 제공되는 정적 값입니다.

문제는 캐릭터가 대부분의 시간만큼 회전하는 동안 180도에 가까워 야 할 때 문제가 있다는 것입니다. 그런 다음 때때로 흔들리면서 회전을 미러링합니다.

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

이 잘못 그려진 이미지에서 문자 (오른쪽)는 왼쪽의 원을 향해 회전하기 시작합니다. 왼쪽이나 오른쪽으로 돌리는 대신이 "미러 댄스"를 시작합니다.

  1. 새로운 방향으로 회전하기 시작합니다
  2. 그런 다음 갑자기 같은 각도로 스냅되지만 다른 쪽에서는 계속 회전합니다.

대상을 볼 때까지이 "미러링"을 너무 오래 수행합니다. 이것은 쿼터니언, lerling / lerping 또는 다른 것이 있습니까?

EDIT1 : 분명히 문제는 회전 자체에서 발생하지 않습니다. 더 큰 문제는 캐릭터가 회전하는 동안 얼굴을 향해 움직이는 것입니다. 대면과 목표 사이의 각도를 제한함으로써 캐릭터가 움직일 수있을 때 지 터링 / 미러링 회전이 줄어들고 때때로 제거됩니다.

물론 이것은 더 많은 질문을 제기하는데 왜 캐릭터가 문제없이 동시에 움직일 수 없습니까? 운동에 사용되는 코드 :

transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);

'lookQuaternion'은 매 프레임마다 업데이트됩니까? 그렇다면, 내 가정은 몇 가지 작은 부정확 플레이어 '오버 슈트'모양 회전과 너무보기에 새로운 방향 단지에 지터의 종류로 이어지는되는 것 다른 '바로 뒤에'의 측면 ... .
스티븐 Stadnicki

답변:


5

3D 공간에서의 각 방향은 두 별개 단위 쿼터니언으로 표현 될 수 q-q(성분 와이즈 부정 q). 예를 들어 3x3 항등 행렬로 표시되는 방향은 I2 개의 쿼터니언으로 표시 될 수 있습니다.

 q:  { 0,  0,  0},  1
-q:  {-0, -0, -0}, -1

둘 다 3D 공간에서 동일한 방향을 나타내며, 그들의 내적은 정확히 -1이며, 각각은 다른 반구에 위치하고, 정확히 초구의 반대편에 있습니다.

slerp가 회전하는 데 더 긴 호가 걸리는 경우 관찰 한 결과는 동일한 반구에 있지 않은 2 개의 쿼터니언 사이에서 slerping 할 때입니다. 그럴 경우, 잠들기 전에 그들 중 하나를 부정하면, 잠자는 더 짧은 호를 취할 것입니다.

내적은 그러한 일이 발생하는지 쉽게 확인할 수있는 도구입니다. 두 쿼터니언의 내적이보다 작 으면 0같은 반구에 있지 않습니다. 따라서 두 제품의 내적이보다 작 으면 0구성 요소 방식으로 다른 쿼터니언을 무효화하기 전에 무효화합니다.


이것으로 시도해 보았을 때 당신을 올바르게 이해했는지 궁금합니다. if(Quaternion.Dot (lookQuaternion, startQuaternion) < 0) { startQuaternion = Quaternion.Inverse(startQuaternion); }그러나 문제가 해결되지 않았습니다. 형식이 잘못되어 죄송합니다.이 의견 섹션을 길들이는 것 같지 않습니다.
Esa

거의 그렇지는 않지만 . Inverse와 다른 작업 Negate입니다. if(Quaternion.Dot (lookQuaternion, q) < 0) { q.x = -q.x; q.y = -q.y; q.z = -q.z; q.w = -q.w; }C #을 사용하지 않지만 문서의 모양에서 Negate-Function을 직접 사용할 수도 있습니다.
Maik Semder

if(Quaternion.Dot (lookQuaternion, startQuaternion) < 0) { startQuaternion = Quaternion.Negate(startQuaternion); }
Maik Semder

이것으로 문제가 해결되지 않을까 걱정됩니다. 질문을 업데이트했습니다.
Esa

네, 아마도 다른 버그가 섞여있을 것입니다. 테스트 설정을 간소화하고 한 번에 하나씩 번역 및 회전이 아닌 테스트합니다. 먼저 하나가 작동하고 다른 하나가 작동하는지 확인하십시오. 먼저 회전에만 초점을 맞추고 170도에서 시작하여 0으로 이동하는 등 잘 알려진 방향 값을 사용하십시오. 위치가 잘못되어 여기에 게시
Maik Semder

1

문제는 쿼터니언을 형성하는 두 벡터가 180도를 만들기 때문에 어떤 호를 보간 할 때 질문해야 하는가? 위 호 또는 아랫 호?

이것은 기본적으로 미러링을 일으키는 원인입니다. 보간 할 때마다 각도를 유지하면서 다른 방향으로 이동합니다.

링크 에 따르면 .

theta가 180도이면 회전하는 가장 짧은 방향이 없기 때문에 결과가 정의되지 않습니다.이 상황이 아직 올바르게 처리되지 않았다고 생각합니다. 카 또는 qb에 수직 인 임의의 축을 선택하면 더 좋을 것입니다. 가장 좋은 방법은 아이디어를 주셔서 감사합니다.

당신이해야 할 일은 시작 쿼터니언을 중간 쿼터니언으로 보간하고 (어떤 아크를 취할 것인지 결정하기 위해) 도달했을 때 중간 쿼터니언을 사용하여 실제 목표 쿼터니언을 계속하십시오.


1

내가 본 것으로 의심되는 문제는 코드와 관련이 없지만 구면 (이 경우 viewDirection의 경우)을 따라 보간하는 근본적인 문제입니다. 구체의 거의 두 지점 사이에는 하나의 큰 원이 있습니다. 예를 들어 북극에서 '시작'지점을 임의로 고정하면 큰 원이 끝 점이있는 자오선이됩니다. 한 지점에서 다른 지점으로의 보간이이 큰 원을 따라 이동합니다.

이제 구의 대부분의 점에 대해 근처의 점은 근처의 큰 원에 해당합니다. 예를 들어 로스 앤젤레스와 피닉스가 놓인 자오선은 서로 상당히 가깝습니다. 대상 지점이있는 경우 그러나 이성질체 시작 지점의 남극에서 북극 - - 원래의 포인트가 더 이상 모두를 통해 하나의 큰 원 없지만 대신 모든 다른 통해 한 가지를 통해 큰 원. 더 나쁜 것은 남극 근처의 지점이 '가장 많은 지점'이 아니라는 것을 의미합니다. 서로 가까이있는 두 지점과 남극 근처에있는 두 지점은 격렬한 분기점을 가질 수 있습니다.

나는 당신이보고있는 것이 자오선 또는 다른 말로 보간 호 에서이 불안정성을 나타내는 것이라고 생각합니다. 룩 타겟이 캐릭터 바로 뒤에있는 경우 캐릭터 위치의 '오일러 통합'에서 1 차 부정확 도와 프레임 간 방향을 변경하는 방식이 이러한 결과를 초래할 수 있습니다. 한 프레임에서 다음 프레임까지 서로 다른 보간이 발생하며, 이로 인해 '스 태거'가 발생할 수 있습니다.

그것으로 무엇을하는지에 관해, 마음에 떠오르는 가장 좋은 것은 매 프레임마다 '목표'룩 방향을 재 계산하지 않는 것입니다. 대신 여러 프레임 범위에 대해 동일한 프레임을 사용하고 새 프레임을 계산하여 여러 프레임에 사용하십시오. 필요한 경우 몇 프레임 범위에 걸쳐 한 대상에서 다음 프레임으로 보간 할 수도 있습니다. 운동 방향이 너무 갑자기 바뀌지 않습니다.

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