2017-03-21 6 views
1

첫 번째 인물 컨트롤러를 만들려고하고 있는데 내 윤곽 회전을 부드럽게하는 데 문제가 있습니다. 내 LookRotation 스크립트는 내 마우스 입력을 받아 문자 회전에 사용합니다. Quaternion.Slerp()을 사용하는 데 문제가 있지만 내 모양 회전을 부드럽게하기 위해 Quaternion.Slerp()을 사용했습니다. 원하는 회전이 현재 회전에서 180도 이상 떨어져있게되면 짧은 경로 (반대 방향)가됩니다. 문제는 코드의 마지막 두 줄에 있습니다. 누구든지이 문제를 방지 할 수있는 방법이 있습니까? 미리 감사드립니다!매끄러운 회전 - 쿼터니언

#region Variables 
// Sensitivity variables 
[Range(0.0f, 10.0f)] public float horizontalSensitivity = 2.0f, verticalSensitivity = 2.0f; 

// Smoothing Variables 
[Range(0.0f, 30.0f)] public float smoothAmount = 5.0f; 

// Character rotation variables 
private Quaternion characterTargetRotation; 
private Quaternion cameraTargetRotation; 

public Transform character; 
public Transform characterCamera;  
#endregion 

private void Update() 
{ 
    float horizontalRotation = Input.GetAxis("Mouse X") * horizontalSensitivity; 
    float verticalRotation = Input.GetAxis("Mouse Y") * verticalSensitivity; 

    characterTargetRotation *= Quaternion.Euler(0.0f, horizontalRotation, 0.0f); 
    cameraTargetRotation *= Quaternion.Euler(-verticalRotation, 0.0f, 0.0f); 

    character.localRotation = Quaternion.Lerp(_character.localRotation, characterTargetRotation, smoothAmount * Time.deltaTime); 
    characterCamera.localRotation = Quaternion.Lerp(_characterCamera.localRotation, cameraTargetRotation, smoothAmount * Time.deltaTime); 
} 
+1

정말'Quaternion.Slerp()'가 필요합니까? 기본 회전의 경우 간단하고 빠른 전달 Quaternion.Lerp() 메소드를 사용하려고 생각했습니다. 'Quaternion.Slerp()'는 회전 값을 구형으로 보간하는데 문제 일 수 있습니다. 'transform.rotation'에 대한 참조가 보이지 않지만 나중에 코드에서 수행한다고 가정합니다. – MadJlzz

+0

@MadJlzz 응답 주셔서 감사합니다, 아마도 Quaternion.Lerp 사용해야하지만 Quildion.Slerp 같은 여전히 ​​문제가 yeilds. – jozza710

+0

@MadJlzz 또한 'character.localRotation'과'characterCamera.localRotation'을 사용하여 회전 (마지막 두 줄)을 바꿉니다. – jozza710

답변

1

Quaternions와 Lerp를 사용하여 수행 할 수없는 문제는 오일러 각을 사용하여 해결했습니다. 이 방법을 사용

horizontalAngle += (Input.GetAxis("Mouse X") * horizontalSensitivity); 
    verticalAngle += (-Input.GetAxis("Mouse Y") * verticalSensitivity); 

    horizontalSmoothAngle = Mathf.Lerp(horizontalSmoothAngle, horizontalRotation, smoothAmount * Time.deltaTime); 
    verticalSmoothAngle = Mathf.Lerp(verticalSmoothAngle , verticalRotation, smoothAmount * Time.deltaTime); 

    horizontalRotation = Quaternion.Euler(0, smoothRotation ? horizontalSmoothAngle: horizontalAngle, 0); 
    verticalRotation = Quaternion.Euler(smoothRotation ? verticalSmoothAngle : verticalAngle, 0, 0); 

은 사용 쿼터니온과 Lerp가 해결하지 못할 문제가 있지만 해결해야 다른 문제를 만듭니다. 위에서 언급 한대로 Lerp은 항상 최단 거리를 찾습니다. 오일러는 원하는만큼 (또는 데이터 유형이 허용하는 한 더 정확하게) 갈 수 있으므로이 문제는 없습니다.

각도에 계속 추가하면 일반적인 플레이어의 경우 문제가되지는 않지만이 경우 데이터 형식이 float이면 결국 정밀도가 떨어집니다. 이를 방지하려면 숫자에서 360의 배수와 숫자에 평활화 된 각도를 사용하여 Lerp에 영향을주지 않을 정도로 간단히 빼기 또는 더하기 (값이 양수 또는 음수인지 여부에 따라 다름)를 피하십시오.

이 방법을 사용하여 x 축의 시작 각도를 얻는 데는 몇 가지 문제가 있지만이 질문과 관련이 없으므로이를 수행하는 방법을 알고 싶어하는 사람은 해당 문제에 대한 대안 소스를 찾아야합니다.