2016-08-18 42 views
1
与PyOpenGL.glRotatef使用Quanterion值

我有四元数的值(X,Y,Z,W)=(P0,P1,P2,P3)中pyOpenGl我不能使用,我在Unity

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']) 

我首先规范化数据(顺便说一下数据来自原型设备,所以它必须正常化) 我如何在c#Unity中使用它并旋转一个对象?我不知道统一单位是如何工作的?

+1

你是什么意思“我不能使用四元数值”? Unity的变换具有四元数的本地旋转和旋转属性。使用它们时会遇到什么问题? – Bart

+0

我知道它们是四元数,但它不起作用!它旋转,但这些都是非常小的旋转:(我相信数字是团结真的很小。哪个单位,我应该使用在Unity四元?正常工作与OpenGL的 –

+0

glRotatef使用一个轴角。四元数都不是。你可以不要直接从一个值到另一个值,并期望它的工作。但是,您可以使用https://docs.unity3d.com/ScriptReference/Quaternion.AngleAxis.html从轴和角度表示中创建有效的四元数你在找什么? – Bart

回答

0

的混乱这里是一个轴角和四元之间。您正在使用的glRotatef使用前者,而统一的TransformrotationlocalRotation是后者。

但是,您可以在两者之间转换。 Quaternion.AngleAxis(float angle, Vector3 axis)确实如此。它采用轴角表示并将其转换为相应的四元数。例如,您可以输入localRotation