2016-08-18 6 views
1
에 PyOpenGL.glRotatef 사용할 Quanterion 값을 사용할 수

난이 값 쿼터니언 (X, Y, Z, W) I 내가 유니티

norm=math.sqrt(program_dict['q0']*program_dict['q0'] + program_dict['q1']*program_dict['q1'] + program_dict['q2']*program_dict['q2'] + program_dict['q3']*program_dict['q3']) 
    glPushMatrix() 
    if (norm == 0): 
     pass 
    else: 
     program_dict['q0'] = program_dict['q0']/norm 
     program_dict['q1'] = program_dict['q1']/norm 
     program_dict['q2'] = program_dict['q2']/norm 
     program_dict['q3'] = program_dict['q3']/norm 
     theta = (math.acos(program_dict['q3'])*2) 
     aNorm = math.sqrt(program_dict['q1'] * program_dict['q1'] + program_dict['q2'] * program_dict['q2'] + program_dict['q0'] * program_dict['q0']) 
     if (aNorm != 0): 
      glRotatef(theta*180.0/math.pi, program_dict['q2']/aNorm, -program_dict['q0']/aNorm, program_dict['q1']/aNorm) 
     else: 
      glRotatef(theta*180.0/math.pi, program_dict['q2'], -program_dict['q0'], program_dict['q1']) 

pyOpenGl에서 = (P0, P1, P2, P3) 데이터를 먼저 정규화합니다 (btw 데이터는 프로토 타입 장치에서 가져온 것이므로 정규화해야합니다) 어떻게 이것을 C# Unity에서 사용할 수 있고 객체를 회전시킬 수 있습니까? 나는 Unity unit이 어떻게 작동 하는지를 모른다.

+1

"쿼터니언 값을 사용할 수 없습니까?"라는 것은 무엇을 의미합니까? Unity의 Transform에는 Quaternions 인 localRotation 및 rotation 속성이 있습니다. 그것들을 사용할 때 어떤 문제가 발생합니까? – Bart

+0

그들은 쿼터니언이지만 작동하지 않는다는 것을 압니다! 그것은 회전하지만 이것들은 매우 작은 회전이다. (나는 단위가 정말 작다고 믿는다. 유니티에서 쿼터니온을 사용해야하는 단위는 무엇인가?) opengl로 잘 작동한다. –

+0

glRotatef는 축각 표현을 사용한다. 쿼터니언은 그렇지 않다. 하나의 값을 다른 하나의 값으로 직접 넣고 작동하도록하십시오. 그러나 https://docs.unity3d.com/ScriptReference/Quaternion.AngleAxis.html을 사용하여 축 및 각도 표현에서 유효한 Quaternion을 만들 수 있습니다. 당신이 찾고있는 무엇입니까? – Bart

답변

0

여기서 혼란은 축각 표현과 쿼터니언 사이에있다. 사용중인 glRotatef는 전자를 사용하는 반면 Unity TransformrotationlocalRotation은 후자입니다.

그러나 둘 사이를 변환 할 수 있습니다. Quaternion.AngleAxis(float angle, Vector3 axis) 정확히 그 않습니다. 그것은 축각 표현을 취하여 해당 쿼터니언으로 변환합니다. 그러면 예를 들어 localRotation에 입력 할 수 있습니다.