您的代码生成一个面,而不是整个立方体。但是您需要 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()
这实际上是一个无限的调整。currentRotation
您应该为和的差异引入一个阈值,仅当 时才targetRotation
设置和更新。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
切片将很好地旋转到目标位置。如果您的几何图形对齐良好(围绕原点),则不需要任何平移,因为所有旋转都将围绕原点(或通过原点的轴)。