2016-12-21 3 views
3

나는 실제 백일몽 컨트롤러 (Wii 컨트롤러와 유사하게 작동 함)로 제어되는 핸들을 가지고있다. 나는 그것을 할이 코드를 사용하여 컨트롤러의 기본 위치가 스티어링 휠에 대한 좋지 않은 beacause를개체 회전을 특정 각도로 제한하는 방법은 무엇입니까?

void Update() { 
    transform.localRotation = GvrController.Orientation; 
    transform.localRotation = new Quaternion(0.0f, 0.0f, -transform.localRotation.y, transform.localRotation.w); 
} 

나는, 축 엉망이 필요합니다.

그러나 왼쪽 및 오른쪽으로 최대 회전 사이의 3 축 각도는 180도입니다. 이 범위에서는 모든 것이 잘되지만, 조금만 더 회전하면이 값이 음수로 바뀌고 모든 것이 엉망이됩니다. 플레이어가이 범위에서만 회전 할 수있게하려면 어떻게해야합니까? (3 축 회전의 z 축에서 0 ~ 180)?

편집 : 주요 문제는 0 또는 180을 교차 한 후 회전 값이 음수 값으로 변경된다는 점입니다. 두 값은 모두 같지만 순서는 다릅니다. 0을 지나면 -1에서 -180으로, 180에서 -180에서 -1로 형성됩니다.

답변

3

첫째, 우리는 우리가 실제로 고정 수있는 값이 필요합니다. (일반 화면 휠은 Z에 대해 회전 할 때 - 당신이 컨트롤러에 따라 다른 분야에 그것을 변경해야 할 수도 있습니다) 우리는 eulerAngles .Z 필드에서 해당를 얻을 수 있습니다 :

void Update() { 

    // Get the angle: 
    float angle = GvrController.Orientation.eulerAngles.z; 

    // The magic - clamp it: 
    if(angle < -180f){ 
     angle = -180f; 
    } 
    else if(angle > 180f){ 
     angle = 180f; 
    } 

    // Apply it as a new rotation: 
    transform.localRotation = Quaternion.Euler(0f,0f,angle); 
} 
+0

Quaternion.AngleAxis는 float와 Vector3를 인수로 취합니다. 다른 함수를 사용해야합니까? –

+0

@faken 편집 : 대신 Quaternion.Euler를 시도해보십시오 (나는 인정해야합니다 - 나는 더 많은 오일러 접근법을 사용하지 않지만 따르기가 쉽습니다) –

+0

내가 그것을 사용하면 더 엉망이되어 작동이 잘못됩니다 심지어 '범위'에서. Vector3를 쿼터니언으로 변환했기 때문이라고 생각합니다. –

-3

이 시도 :

If (transform.rotation > 180) 
    transforn.rotation = 180; 
+0

약 3 가지 문제가 있습니다. 첫째로 우리는'rotation'이 아닌'localRotation'을 사용하고 있습니다. 둘째, 회전이 180도인지 확인하고 있습니다. ** 무엇? **, 축을 확인해야합니다. 셋째, 음수가되기 때문에이 체크는 올바르게 쓰여져도 문제를 해결할 수 없습니다. 대신에 if (transform.localRotation.z <0)가되어야합니다. –

+2

[edit] 링크는이 코드가 어떻게 작동하는지 설명하고 코드를 제공하지 않습니다. 설명이 미래의 독자를 도울 가능성이 높습니다. [답변]을 참조하십시오. –

2

이 시도 :

if (transform.eulerAngles.z > 180) 
    transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 180); 
else if (transform.eulerAngles.z < 0) 
    transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 0); 
+0

이것은 내가 EDIT에서 쓴 것 때문에 모든 것을 망칠 것입니다 :/ –

1

사람이 내가 발견 궁금해하는 경우 솔루션, 루크의 답변에서 스크립트를 기반으로. 나는 네거티브로 바뀌는 값이 괜찮다는 사실을 깨달았습니다. 단지 잘못된 것만이 그것들이 부정적이라는 것입니다. 그럼이 스크립트는 작동합니다 :

transform.localRotation = GvrController.Orientation; 

float angle = -transform.localRotation.y; 

if (angle < 0.0f) { 
    angle = Mathf.Abs(angle); 
} 

transform.localRotation = new Quaternion(0.0f, 0.0f, angle, transform.localRotation.w); 
+1

FWIW. 쿼터니언은 각도와 임의의 축을 나타냅니다 (예 : 동일한 가시 순환을 제공하는 두 가지 솔루션이 있지만 y 구성 요소는 완전히 다릅니다. 따라서 사용법에 문제가있는 것처럼 보입니다). –

+0

나도 몰라, 아마도 네 말이 맞아. 근사하게 작동하기 때문에 나는 그저 운이 좋아 보인다. –