我创建了一个有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();
答案 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()
这实际上是无限的调整。您应该引入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
切片将很好地旋转到目标位置。如果几何井(在原点周围),则不需要任何平移,因为所有旋转都将围绕原点(或通过原点的轴)。