魔方的旋转

时间:2013-10-20 18:37:09

标签: c++ opengl

我创建了一个有26个方块的魔方(不是27个,因为你看不到中间的方块)。我正在尝试旋转立方体。我想过使用Pushstack Popstack,但我找不到任何我能看到的好例子。

我想知道什么是旋转的好方法。我使用以下26个代码来创建多维数据集

   glBegin(GL_POLYGON);
  //glColor3f(  1.0,  0.0,  1.0 );
  glColor3f(   1.0,  0.0,  0.0 );
  glVertex3f( 1.5, -0.5, -0.5 );
  glVertex3f( 1.5,  0.5, -0.5 );
  glVertex3f( 1.5,  0.5,  0.5 );
  glVertex3f( 1.5, -0.5,  0.5 );
  glEnd();

1 个答案:

答案 0 :(得分:2)

您的代码会产生一个面,而不是整个立方体。但是你需要26个完整的小立方体才能正确渲染它。否则,如果旋转立方体,就会出现漏洞。

您可以执行以下操作:

将大立方体组织为3x3x3网格。每个网格单元包含一个小立方体。每个小立方体由其几何数据及其旋转信息组成。您可以将几何数据存储为顶点缓冲区或显示列表,也可以将其存储为生成几何体的方法。正如你所愿。因此,如果您还没有任何旋转并且渲染纯几何体,则应该使整个立方体良好对齐。

对于旋转,对每个小立方体使用四元数是合理的。但是,您也可以使用矩阵,但这些处理起来有点棘手。实际上,我会为每个立方体存储两个四元数。一个描述目标旋转,一个描述当前旋转(用于动画目的)。将当前旋转更新为目标旋转时,您可以执行以下操作:

interpolationVariable = c ^ timeStep //to allow a fluid and continuous animation. 
//c is usually between 0.99 and 1, depending on the desired animation smoothness
currentRotation := interpolationVariable  * currentRotation + (1 - interpolationVariable ) * targetRotation
currentRotation.normalize()

这实际上是无限的调整。您应该引入currentRotationtargetRotation之差的阈值,以将currentRotation设置为targetRotation,并仅在currentRotation != targetRotation时更新。

现在我们将旋转指定为四元数。为了渲染立方体,您可以将四元数应用为模型变换(在转换为矩阵之后)并渲染几何体。

要旋转立方体切片,只需将旋转变换应用于相应的立方体即可。例如。如果你想围绕x轴旋转:

quat = QuaternionRotation( (1,0,0) /* axis */ , Pi / 2 /* angle */ )
for each affected cube
    cube.targetRotation = cube.targetRotation * quat
next    
// Update the grid

切片将很好地旋转到目标位置。如果几何井(在原点周围),则不需要任何平移,因为所有旋转都将围绕原点(或通过原点的轴)。