2015-01-23 2 views
0

캐릭터가 회전 중이면 카메라가 회전하는 카메라 스크립트가 있습니다. 그러나 카메라를 마우스 포인터로 회전시킬 수도 있습니다. 이 운동은 주어진 각도 (예 : 30 (최대 X))로 제한됩니다. 따라서 마우스로 제어되는 카메라 움직임의 범위는 -30 도와 30도에 해당하는 0과 60 사이 여야합니다.360도 겹치기를 제대로 고정시키는 방법은 무엇입니까?

문자가 360도 회전하면 maxX 값이 360을 넘어 서서 0으로 되돌아 와야합니다. min은 300과 같은 값을 유지할 수 있습니다. 이로 인해 카메라가 "튀어 나오고" 이전 회전.

static function ClampAngle (angle : float, min : float, max : float) : float 
{ 
    if (angle < -360.0) 
     angle += 360.0; 
    if (angle > 360.0) 
     angle -= 360.0; 
    return Mathf.Clamp (angle, min, max); 
} 

모든 권고 :

var newMaxX = ClampAngle(_target.localEulerAngles.y + maximumX, -360, 360); 
var newMinX = ClampAngle(_target.localEulerAngles.y - maximumX, -360, 360); 
if(newMinX > newMaxX) 
{ 
    var tmp = newMaxX; 
    newMaxX = newMinX; 
    newMinX = tmp; 
} 

if (axes == RotationAxes.MouseXAndY) { 
    rotationX += Input.GetAxis("Mouse X") * sensitivityX; 
    rotationY += Input.GetAxis("Mouse Y") * sensitivityY; 

    rotationX = ClampAngle (rotationX, newMinX, newMaxX); 
    rotationY = ClampAngle (rotationY, minimumY, maximumY); 

    var xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up); 
    var yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left); 

    cameraTransform.localRotation = originalRotation * xQuaternion * yQuaternion; 
} 
else if (axes == RotationAxes.MouseX) 
{ 
    rotationX += Input.GetAxis("Mouse X") * sensitivityX; 
    rotationX = ClampAngle (rotationX, newMinX, newMaxX); 

    xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up); 
    cameraTransform.localRotation = originalRotation * xQuaternion; 
} 
else 
{ 
    rotationY += Input.GetAxis("Mouse Y") * sensitivityY; 
    rotationY = ClampAngle (rotationY, minimumY, maximumY); 

    yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left); 
    cameraTransform.localRotation = originalRotation * yQuaternion; 
} 

여기 ClampAngle 기능이있어?

답변

0

내가 발견 한 문제는 사용하여이었다 거점으로

_target.localEulerAngles.y 

. localEulerAngels는 실행 중에 0에서 360까지만 이동하기 때문입니다. 에디터에서는 클램핑되지 않습니다. 달리면 클램핑됩니다. 이것은 처음에는 회전 0 일 때, 왼쪽으로 이동하면 360으로 루프하기 때문에 상황이 크게 바뀝니다. -1로 처리하는 것처럼 처리했습니다. 따라서, 내 수학이 잘못되었다고 생각하거나 올바르게 고정하지 못했습니다. 그것은 그래서 360

되고 0에 대해 아무것도 눈치 채지 못할 거라고 때문에

클램핑 아무것도 할 것, 내가 대신 180 -180로 취급하기로 결정했다. 내가 2 개 별도의 단위로 한 이전 때문에 명확성을 위해

var eulerTargetY = _target.localEulerAngles.y; 
var newMaxX = 0; 
var newMinX = 0; 

if(eulerTargetY > 180) 
{ 
    var adjustedEuler = eulerTargetY - 360; 
    newMaxX = adjustedEuler + m_rangeX; 
    newMinX = adjustedEuler - m_rangeX; 
} 
else 
{ 
    newMaxX = eulerTargetY + m_rangeX; 
    newMinX = eulerTargetY - m_rangeX; 
} 

var xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up); 
var yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left); 
rotationX += Input.GetAxis("Mouse X") * sensitivityX; 
rotationY += Input.GetAxis("Mouse Y") * sensitivityY; 
rotationY = ClampAngle (rotationY, minimumY, maximumY); 
rotationX = ClampAngle (rotationX, newMinX, newMaxX); 

if (axes == RotationAxes.MouseXAndY) { 
    cameraTransform.localRotation = originalRotation * xQuaternion * yQuaternion; 
} 
else if (axes == RotationAxes.MouseX) 
{ 
    cameraTransform.localRotation = originalRotation * xQuaternion; 
} 
else 
{ 
    cameraTransform.localRotation = originalRotation * yQuaternion; 
} 

, 나는, m_rangeX에 maximumX을 만들어 나는 현재 30 두 가지 방법을 사용하고 있습니다. 이제 카메라는 마우스가 _target.localEulerAngles.y - 30과 _target.localEulerAngles.y + 30 사이에서 마우스를 가리키는 위치에서 원형 겹침으로 제대로 스윕 할 수 있습니다.

관련 문제