一种三阶魔方虚拟系统的动作采集单元的制作方法

文档序号:12914275阅读:539来源:国知局
一种三阶魔方虚拟系统的动作采集单元的制作方法与工艺

本实用新型涉及一种三阶魔方虚拟系统的动作采集单元。



背景技术:

魔方,也称鲁比克方块,是一种娱乐玩具,由厄尔诺·鲁比克(Erno Rubik)教授发明魔方,作为一种帮助学生增强空间思维能力的教学工具。魔方复原指魔方从非原始状态到原始状态的过程,是一个集观察、动手和想象于一体的过程,可以很好地培养人的动手、动脑能力、训练记忆力、空间想象力和判断力。

很多青少年在刚接触魔方的时候,被其设计的精巧和趣味性所吸引,魔方变化数非常庞大,例如三阶魔方的变化数为:43,252,003,274,489,856,000,但也被总结出很多还原方法,包括层先法、角先法、桥式方法、CFOP法、棱先法等等。

传统学习解魔方的方法都比较晦涩难懂,对初学者来说不太容易理解,光靠文字描述很难说清楚,口口相传费时费力。快速复原魔方是很多魔方爱好者的理想,然而,实体魔方在复原过程中手速快速、随机性,重复再现难,观摩学习困难。

中国专利文献CN103394191A公开了一种电子三阶魔方比赛系统,包括数据采集模块、无线通信模块、数据处理模块、和虚拟魔方演示模块,可使观众清楚地观看选手还原魔方的的步骤,提高了比赛的观赏性。

在上述电子魔方中,数据采集模块集成于真实魔方内部,构成动作采集单元,用于采集真实魔方的体位变化和旋转的数据,通过数据处理模块转化为虚拟魔方的控制信号,并在虚拟魔方演示模块上实现虚拟魔方的同步控制,进而能够复原魔方操作步骤。

然而上述虚拟魔方在每次玩魔方复原游戏时,魔方需要事先打乱,由于数据采集模块集成于真实魔方内部,虚拟魔方和真实魔方是一一对应的,按照预定的颜色配置来打乱魔方需要花费大量精力,给魔方复原教学带来不便。



技术实现要素:

本实用新型的目的在于提供一种三阶魔方虚拟系统的动作采集单元,以方便魔方复原教学。

为此,本实用新型提供了一种三阶魔方虚拟系统的动作采集单元,用于向三阶魔方模型的九个旋转对象提供旋转指令,包括三个六轴陀螺仪和信号处理模块,其中,所述六轴陀螺仪用于将自身的翻转动作转为检测信号,所述信号处理模块用于对所述三个六轴陀螺仪的检测信号进行采集并且将所述检测信号转为旋转指令,其中,每个所述六轴陀螺仪提供三个旋转对象的旋转指令。

进一步地,上述六轴陀螺仪为MPU-6000传感器。

进一步地,上述信号处理模块为Arduino UNO板,用于对三个MPU-6000传感器进行片选并且将片选后的MPU-6000的检测信号转化为相应旋转对象的旋转指令。

进一步地,上述三阶魔方虚拟系统的动作采集单元还包括魔方颜色配置单元,用于三阶魔方模型的表面颜色的初始配置,包括与所述Arduino UNO板信号连接的颜色采集模块。

进一步地,上述颜色采集模块为六个按键。

根据本实用新型的三阶魔方虚拟系统的动作采集单元,采用了三个六轴陀螺仪代替真实魔方来采集复原动作,使得三阶虚拟魔方颜色的初始配置无需依赖对真实魔方的动作检测,满足随意打乱魔方的要求。

除了上面所描述的目的、特征和优点之外,本实用新型还有其它的目的、特征和优点。下面将参照图,对本实用新型作进一步详细的说明。

附图说明

构成本申请的一部分的说明书附图用来提供对本实用新型的进一步理解,本实用新型的示意性实施例及其说明用于解释本实用新型,并不构成对本实用新型的不当限定。在附图中:

图1是根据本实用新型一实施例的三阶魔方虚拟方法的流程图;

图2是根据本实用新型另一实施例的三阶魔方虚拟方法的流程图;

图3是根据本实用新型一实施例的三阶魔方虚拟系统的结构框图;

图4是根据本实用新型的三阶魔方模型的示意图;

图5是根据本实用新型的三阶魔方模型的六个表面的标记图;

图6是根据本实用新型的三阶魔方模型的三维坐标图;

图7是根据本实用新型一实施例的三阶魔方虚拟系统中动作采集单元的结构示意图;

图8是根据本实用新型的动作采集单元中的一个六轴陀螺仪执行的三个旋转指令的示意图;

图9是根据本实用新型的动作采集单元的动作指令的采集流程图;

图10是根据本实用新型一实施例的三阶魔方虚拟系统的魔方颜色配置单元的结构示意图;

图11是根据本实用新型的三阶魔方模型的各表面的颜色配置顺序图;

图12是根据本实用新型一实施例的三阶魔方虚拟系统的工作流程图;

图13示出了根据本实用新型的三阶虚拟魔方游戏界面,其魔方游戏处于开始状态;

图14示出了根据本实用新型的三阶虚拟魔方游戏界面,其中魔方处于打乱状态;

图15示出了根据本实用新型的三阶虚拟魔方游戏界面,其中魔方处于复原操作状态;以及

图16示出了根据本实用新型的三阶虚拟魔方游戏界面,其中魔方游戏处于结束状态。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本实用新型。

图1至图16示出了根据本实用新型的一些实施例。

在一实施例中,如图1所示,三阶魔方虚拟方法包括以下步骤:

S11、建立三阶魔方模型并且按照选定的视角在显示界面上显示,其中,将三阶魔方模型配置为按照3*3*3方式堆积的27个立方体,将暴露在外的立方体表面按照真实魔方颜色进行配置,并令三阶魔方模型中的顶层、左面、绕Y轴、中间层xoy、中间层yoz、前面、底层、右面和绕X轴这九个旋转对象接收外部旋转指令;

S13、利用动作采集单元向所述三阶魔方模型提供所述九个旋转对象的旋转指令;以及

S15、使三阶魔方模型在接收所述旋转指令后对所述旋转对象及其表面颜色进行整体旋转,并且在所述显示界面上实时显示。

根据本实用新型的三阶魔方虚拟方法,三阶魔方模型构造成仅需要九个旋转指令即可实现魔方复原操作,使得三阶虚拟魔方颜色的初始配置无需依赖对真实魔方的动作检测,满足随意打乱魔方的要求。

在一实施例中,如图2所示,三阶魔方虚拟方法包括如下步骤:

S11、建立三阶魔方模型并且按照选定的视角在显示界面上显示,其中,将三阶魔方模型配置为按照3*3*3方式堆积的27个立方体,将暴露在外的立方体表面按照真实魔方颜色进行配置,并令三阶魔方模型中的顶层、左面、绕Y轴、中间层xoy、中间层yoz、前面、底层、右面和绕X轴这九个旋转对象接收外部旋转指令;

S12、对三阶魔方模型的表面颜色进行初始配置,即按照要求打乱。

S13、利用动作采集单元向所述三阶魔方模型提供所述九个旋转对象的旋转指令;以及

S15、使三阶魔方模型在接收所述旋转指令后对所述旋转对象及其表面颜色进行整体旋转,并且在所述显示界面上实时显示。

根据本实用新型的三阶魔方虚拟方法,三阶魔方模型构造成仅需要九个旋转指令即可实现魔方复原操作,使得三阶虚拟魔方颜色的初始配置无需依赖对真实魔方的动作检测,满足随意打乱魔方的要求,通过在游戏开始前设置三阶魔方模型的表面颜色的初始配置,满足魔方复原游戏的要求,提高打乱设置的效率。

在一实施例中,如图3所示,三阶魔方虚拟系统包括建模处理单元30,用于建立三阶魔方模型,其中,三阶魔方模型配置为按照3*3*3方式堆积的27个小立方体,将暴露在外的小立方体表面按照真实魔方颜色配置,并令三阶魔方模型中的顶层、左面、绕Y轴、中间层xoy、中间层yoz、前面、底层、右面和绕X轴这九个旋转对象接收外部旋转指令;显示单元40,用于按照选定的视角显示所建立的三阶魔方模型;以及动作采集单元,包括动作采集传感器10和信号处理模块20,用于向所述三阶魔方模型提供所述九个旋转对象的旋转指令,其中,所述建模处理单元30用于根据接收到的旋转指令对相应的旋转对象及其表面颜色进行旋转,并且在所述显示单元上实时显示。

下面对三阶魔方的设计实例加以说明。

1、三阶魔方模型设计

它是三阶魔方虚拟方法中的关键技术问题之一。虽然三阶魔方整体上是一个立方体,但是由于各个面都要能够转动,因此,实际上魔方可以看作是由27个小立方体按照3*3*3的规格堆砌起来的。其中,最中间的小立方体的六个面没有颜色,将堆砌形成的大立方体的前面填充红色,后面填充橘色,左面填充白色,右面填充黄色,顶面填充蓝色,底面填充绿色,小立方体其余没有填充颜色的面可以全都填充黑色,最中心的无色小立方体也可以一同填充上黑色。据此建立的有颜色三阶魔方模型如图4所示。

如图4和图5所示,三阶魔方能够旋转顶层(up)、底层(down)、左边的一层(left)、右边的一层(right)、前面的一层(front)、后面的一层(back),用英文大写字母表示就是U、D、L、R、F、B。除此之外只旋转一层的话我们还可以旋转魔方中间层,若以魔方的中心为原点o,建立oxyz三维坐标系的话,旋转的中间层有xoy面所在层、yoz面所在层、xoz面所在层三种,此外,在魔方游戏中,还需要魔方整体旋转。

上述三阶魔方模型的旋转方向过多,成为魔方虚拟化的一个难题,本实用新型将魔方的旋转对象限定为9个,进而大幅简化了魔方虚拟化的技术难度。虽然魔方可以顺时针旋转,逆时针旋转,为简明起见,对三阶魔方模型的旋转操作进行如下限定:

(1)每次单层旋转以顺时针90度为一个单位,如果要进行逆时针旋转,则可以通过顺时针旋转270度来实现。

(2)在旋转魔方的表面时,需要旋转的五个面分别是顶层(up)、底层(down)、左边的一层(left)、右边的一层(right)、前面的一层(front),用英文大写字母表示就是U、D、L、R、F。对于旋转后面(B)就可以使用整体绕y轴顺时针旋转180度,这样将后面旋转到了前面然后这时候在使用前面(F)层的单层旋转,就可以完成B的旋转了。

(3)两层两层旋转可以用单层旋转来实现,比如先转一个表面层,再转一个中间层,三个中间层只需要其中两个面向前方组成十字的两个分别为xoz层和yoz层,对于xoy层的旋转只需整体绕y轴逆时针旋转90度,然后再进行yoz中间层的旋转就可以实现了。中间层的旋转被用在两层一起旋转的情况时,配合六个表面来使用。

(4)三层的旋转就是魔方(三阶魔方)的整体旋转了,要想观察到魔方的六个面的颜色块分布状况,只需要两种旋转方式:整体绕y轴向左逆时针的旋转和整体绕x轴向后顺时针的旋转。

如此,仅需要顶层、左面、绕Y轴、中间层xoy、中间层yoz、前面、底层、右面和绕X轴这九个旋转对象的旋转指令即可实现魔方的复原操作。

本实用新型采用三个动作采集传感器实现三阶魔方的9个独立旋转动作的采集,该旋转动作采集传感器优选为MPU-6000六轴陀螺仪,每个六轴陀螺仪采集三个旋转动作,结合参照图7和图8,三个动作采集传感器分别采集的旋转动作如下:

1#陀螺仪控制魔方的U(顶层)、L(左面)、Y(整体绕y轴向左逆时针旋转)旋转。

2#陀螺仪控制魔方的两个中间层xoz和yoz的旋转,还有一个F(前面)的旋转。

3#陀螺仪控制魔方的D(底层)、R(右面)、X(整体绕x轴向后顺时针旋转)旋转。

一个动作采集模块每被旋转一次都是以顺时针90度为单位,这样使用三个MPU-6000动作采集模块即可实现三阶魔方的所有旋转方式。

三个六轴陀螺仪与信号处理模块信号连接,用于将三个六轴陀螺仪的采集信号转化为旋转指令。在一实施例中,信号处理模块为Arduino UNO开发板。游戏设计中动作采集模块使用了I2C总线,Arduino UNO板通过片选的方式读取三个相同的动作采集模块的数据。

对于MPU-6000模块来说,要读取它的数据时,只需将它的AD0引脚的电压拉低即可。本实用新型中的游戏设计中如果需要读取三个动作采集模块其中一个的数据时,只需将其的AD0引脚的电压拉低,同时把另外两个MPU-6000模块的AD0引脚电压拉高,这样Arduino板就可以读取其中任意一个动作采集模块采集的数据了。对于拉低拉高MPU-6000传感器模块的AD0引脚电压问题,本实用新型的设计中使用Arduino UNO板的数字信号I/O接口与传感器模块的AD0引脚相连接,直接用Arduino UNO模块来控制三个动作采集模块的片选问题。

Arduino UNO与六轴陀螺仪模块电路连接在图3中示出,将三个六轴陀螺仪MPU-6000的SCL(串行时钟线)接口SDA(串行数据线)接口与Arduino板块的两个模拟信号输入接口(ANALOG IN)A4、A5相连接,六轴陀螺仪采集到人的旋转动作数据后,通过I2C总线中的串行时钟线(SCL)和串行数据线(SDA)传送给Arduino板块,Arduino板块将数据按照一定算法处理后,通过串口通信传给上位机。

在实际连接电路时,由于Arduino UNO的VCC接、GND接口、A5接口和A4接口无法同时连接三个传感器的对应接口,在本实用新型中,借助于Arduino的扩展板实现电路的连接。

如图9所示,动作采集单元的动作指令的采集流程顺次如下:1、初始化三个MPU-6000片选接口为输出引脚;2、设置波特率;3、初始化I2C总线;4、片选第一个MPU-6000芯片,读取其数据;5、片选第二个MPU-6000芯片,读取其数据;6、片选第三个MPU-6000芯片,读取其数据;7、将三组数据进行处理;8、结合前一次记录的三组数据进行动作判断;9、将采集动作指令序号上传至上位机。

其中一个传感器的数据处理代码片段如下:

bx=bx/16384+1;//加1可以避免负号出现。

by=by/16384+1;

bz=bz/16384+1;//记录下当前xyz三个方向的值。

if(bx==0){b1=0;}//将当前2号传感器的x方向值记录下来。

if(bx==2){b1=2;}

if(bx==1){

if(b1==0){Serial.write(6);}//如果传感器2号的x方向值变为0,则想上位机上传指令“6”,代表魔方前面顺时针旋转90度。

if(b1==2){Serial.write(4);}}//若是变为2则想上位机上传指令“4”,表示xoz层顺时针旋转90度。

以上代码实现了数据的处理,三个MPU-6000动作采集模块一共要给上位机发送九个数字,这九个数字分别代表一种有效的旋转动作。第一个MPU-6000传感器模块连接Arduino UNO的2号I/O接口,它用于采集三个动作信号,发给上位机三个数字指令,分别为“1”、“2”、“3”。第二个MPU-6000传感器模块连接Arduino UNO的4号I/O接口,它用于采集三个动作信号,发给上位机三个数字指令,分别为“4”、“5”、“6”。第三个MPU-6000传感器模块连接Arduino UNO的7号I/O接口,它用于采集三个动作信号,发给上位机三个数字指令,分别为“7”、“8”、“9”。所有旋转动作的初始状态都是MPU-6000传感器模块面朝上放置。

“1”表示Up,即将虚拟魔方图像的顶层顺时针旋转90度,它对应采集的旋转动作是将第一个传感器模块绕x轴顺时针向后旋转90度并还原到初始状态(如图8所示)。

“2”表示Left,即将虚拟魔方图像的左面顺时针旋转90度,它对应采集的旋转动作是将第一个传感器模块绕x轴逆时向前旋转90度并还原到初始状态。

“3”表示Y,即将整个虚拟魔方图像整体向左逆时针旋转90度,它的作用是便于玩家观察魔方各个面的颜色分布状态,对应采集的旋转动作是将第一个传感器模块绕z轴逆时针向左旋转90度并还原到初始状态。

“4”表示xoz,即将虚拟魔方图像的前面的横向中间层(xoz层)顺时针旋转90度,它对应采集的旋转动作是将第二个传感器模块绕x轴逆时针向前旋转90度并还原到初始状态。

“5”表示yoz,即将虚拟魔方图像的前面的纵向中间层(yoz层)顺时针旋转90度,它对应采集的旋转动作是将第二个传感器模块绕x轴顺时针向后旋转90度并还原到初始状态。

“6”表示Front,即将虚拟魔方图像的前面顺时针旋转90度,它对应采集的旋转动作是将第二个传感器模块绕z轴顺时针向右旋转90度并还原到初始状态。

“7”表示Down,即将虚拟魔方图像的底层顺时针旋转90度,它对应采集的旋转动作是将第三个传感器模块绕z轴逆时针向左旋转90度并还原到初始状态。

“8”表示Right,即将虚拟魔方图像的右面顺时针旋转90度,它对应采集的旋转动作是将第三个传感器模块绕x轴顺时针向后旋转90度并还原到初始状态。

“9”表示X,即将整个虚拟魔方图像整体向后顺时针旋转90度,它的作用同Y一样是便于玩家观察魔方各个面的颜色分布状态,对应采集的旋转动作是将第一个传感器模块绕z轴顺时针向右旋转90度并还原到初始状态。

优选地,利用Processing语言(计算机语言)来设计三维立体魔方,因为Processing语言绘图时,有自身的oxyz三维坐标系,自带建立三维点的Point()函数可以直接调用并设定其坐标,采用processing语言设计较方便。下面以Processing语言为例对三阶魔方模型的设计加以说明。

基于以上模型分析,首先设计小立方体。本设计中将小立方设计成为一个Cube类,这个类中包含小立方体的位置position。虽然每个小立方体只有8个点坐标,但是由于绘制小立方体的时候,以面为单位,绘制一个面需要四个点坐标,所以绘制6个面需要有24个三维点坐标的值,Cube类中将这24个三维点坐标值存放在一个长度为24的PVector型一维数组vertices中。还有七种颜色红、黄、橙、白、绿、蓝、黑,他们存放在长度为7的color型一维数组faceColor中,用于建立小立方体时,给它们的各个面上色。还有长度l,它代表小立方体的边长。六个面的坐标要在Cube类里面进行初始化,它们分别代表着前面、左面、右面、后面、顶面和底面,通过边长来设定他们的坐标,以小立方体的中心点为坐标原点。结合参照图6,下面是Cube类的定义:

class Cube{

PVector position;//三维量position用于存放小立方体的中心位置坐标。

PVector[]vertices=new PVector[24];//用于存放对应6个面的24个点坐标,虽然坐标会有重复,但是方便了drawCube()函数中小立方体面的绘制。

color[]faceColor=new color[7];//存放7种颜色红、黄、橙、白、绿、黑。

float l;//小立方体的边长l。

在Cube类中设计drawCube()函数用于小立方体的绘制。这个函数有六个整型参数fc、lc、rc、bac、tc、boc,它们分别表示前、左、右、后、顶、底各个面的颜色序号,序号的值将对应faceColor数组中的下标。在for循环中,一次绘制各个面的四个点,每绘制一个面时,都会根据参数中的序号进行上色。drawCube函数代码设计如下:

void drawCube(int fc,int lc,int rc,int bac,int tc,int boc){//绘制小立方体。

for(int i=0;i<6;i++){

if(i==0){fill(faceColor[fc]);}//给小立方体的前面上色。

if(i==1){fill(faceColor[lc]);}//给小立方体的左面上色。

if(i==2){fill(faceColor[rc]);}//给小立方体的右面上色。

if(i==3){fill(faceColor[bac]);}//给小立方体的后面上色。

if(i==4){fill(faceColor[tc]);}//给小立方体的顶面上色。

if(i==5){fill(faceColor[boc]);}//给小立方体的底面上色。

beginShape(QUADS);

for(int j=0;j<4;j++){//调用每一个面的四个点来绘制对应的面。

vertex(vertices[j+4*i].x,vertices[j+4*i].y,vertices[j+4*i].z);}

endShape();}}

设计好小立方体类,在程序中就要建立27个相同大小的小立方体类。不仅如此,我们还要建立26个长度为6的数组来存放除了中心的小立方体以外的26个小立方体六个面的颜色序号。这样我们在使用drawCube()函数绘制每一个小立方体时,不用一一设置它们的参数,只需要调用它们对应的那个颜色数组即可。除了中心的小立方体,其余的26个立方体都要围绕着中心块,因此我们以中心的小立方体的位置position为原点o,以水平向右为x轴的正方向,以垂直x轴向下为y轴的正方向,以垂直xoy面向前为z轴正方向,建立oxyz坐标系。这样坐标轴的方向与Processing默认的坐标轴方向相同,只是将原点移到了魔方的中心,更加方便确立魔方中各个小立方体的坐标。

小立方体边长为l,相互间的间隔为s,每个小立方体position间的距离为s+l,将这个值赋给s,这样我们就可以根据每个小立方体的position坐标来初始化绘制一个三阶魔方了。因为构成每个小立方体的8个点坐标是一样的,只是每个小立方体的中心点坐标(position)不同。所以在绘制每一个小立方体时,都要先使用pushMatrix()函数将当前矩阵的数据全部存储起来,然后使用translate()函数,将坐标系的原点o转换成当前小立方体的position值,接着再调用其对应的drawCube()进行绘制,最后绘制完后还要调用popMatrix()函数还原原点o的坐标,以便下一个小立方体的绘制。下面是顶层左下角小立方体的初始化绘制代码片段:

pushMatrix();//将当前矩阵数据存储起来。

translate(-s,-s,s);//将当前坐标原点移至顶层左下角位置。

cube[1].position.x=-s;//初始化cube[1].position为魔方顶层左下角。

cube[1].position.y=-s;

cube[1].position.z=s;

cube[1].drawCube(0,3,6,6,5,6);//top ceng//初始化绘制cube[1]。

popMatrix();//将当前矩阵数据恢复,坐标原点还原。

2、魔方的旋转设计

本实用新型使用九个旋转函数:Up()、Left()、Y()、xoz()、yoz()、Front()、Down()、Right()、X()、Left()、Front()、Down()、Right()、和Up()比较类似,只是旋转的中心小立方体的位置不同,发生旋转的面不同,但是它们的基本思想都是类似的。

X()和Y()是将整个魔方进行旋转,除了在旋转轴上的小立方体的坐标和颜色不用修改,其余的小立方体的坐标和颜色都要进行修改。xoz()函数是将魔方前面横向第二层进行旋转,yoz()函数是将魔方前面纵向第二层进行旋转,它们的旋转中心都不用更改,都是以中心的小立方体为旋转中心。上面的这九个函数分别一一对应着Arduino UNO从串口发来的数据指令[9]。“1”对应Up()函数,“2”对应Left()函数、“3”对应Y()函数、“4”对应xoz()、“5”对应yoz()函数、“6”对应Front()函数、“7”对应Down()函数、“8”对应Right()函数、“9”对应X()模块。

(1)确定旋转层

如果接受到串口传来的指令“1”则跳入顶层顺时针旋转Up()函数。需要进行顶层旋转,要将当前中心原点坐标由中心的小立方体position坐标转换为目前坐标位置中最上方的中心色块的小立方体的位置。使用judgeUp()函数,比较六个中心色块的小立方体的position的y值,将y最小的那个小立方体的序号值返回。这样找到了需要旋转的中心的小立方体的position,用它的position值一一找出坐标在它四周的其余八个需要旋转的小立方体的坐标,坐标确定了,对应坐标的小立方体也就找到了。

(2)设置旋转角度

找到他们后,就要将它们进行旋转,顶层旋转是绕着y轴的顺时针旋转,但是如果直接进行rotateY(-PI/2),是无法观察到魔方的旋转过程的,只能看到魔方顶层的颜色发生了变化,而没有旋转过程,这样整个虚拟游戏的效果就会大打折扣,玩家的游戏体验会变差,所以,不能直接进行旋转90度。要解决这个问题,代码中需要加入一个角度变量a,它的初始值为0,使用rotateY(a),然后将a不断的减小直至a<=-PI/2,这样不断的调用Up()函数直至a<=-PI/2时,将a还原为0。这样图像就会显示出顶层顺时针慢慢旋转90度的过程。

(3)修改旋转后的坐标

旋转执行完后,被旋转的小立方体的坐标发生了变化,因此,要将这些position发生变化的小立方体记录下来,在旋转动作完成后,将它们的值进行修改。顶层旋转不改变position.y只需要修改8个围绕在旋转中心四周的小立方体的position.x和position.z的值,将它们的position坐标值改为旋转后的位置坐标值。

(4)修改旋转后各个面的颜色

完成了旋转动作并重新修改好各个小立方体的坐标值,就要将所有的小立方体进行重绘,这时就会发现旋转后小立方体的位置变化了,但是六个面的颜色没有发生变化。由于在魔方的一次旋转中,不仅改变了小立方体的坐标,还改变了它的六个面的顺序。比如魔方顶层顺时针旋转90度,发生旋转的小立方体的前面变为左面,左面变为后面,后面变为右面,右面变为前面。小立方体自身的六个面发生了旋转。考虑到修改vertices数组中的24值比较麻烦,所以代码设计中直接对发生旋转的小立方体自身各个面的颜色进行“旋转”。若要将魔方的顶面单层顺时针旋转90度,顶层的小立方体的自身顶面和底面的颜色并没有发生变化,只有前后左后四个面的颜色发生了变化,因此,代码中只需要将小立方体对应的颜色数组中的前后左右四个面对应的颜色序号进行一定的交换。所以要实现魔方顶面单层顺时针旋转90度,就是将颜色数组中的前面的颜色序号换成右面,右面颜色序号换成后面,后面颜色序号换成左面,左面颜色序号换为最初前面颜色序号,当然还要对魔方中进行旋转的小立方体的坐标进行变换。

在游戏设计中还要把需要进行旋转的小立方体的序号记录下来,在旋转完成后,要对这些记录中的小立方体进行变换。本文的游戏设计中使用rot[]数组存放旋转小立方体的序号。

下面为顶层左下角的小立方体的坐标更改和颜色变换代码:

cube[rot[0]].position.z=-s;//将顶层左下角的小立方体的坐标进行修改,修改为进行顶层旋转后的位置坐标,即将它的坐标改为顶层左上角。

switch(rot[0]){//rot[0]里面记录的是顶层左下角发生旋转的小立方体的序号,由于这个小立方体是一个角块,所以从对应的八个角块里面选择,序号是几就对应修改几号的颜色数组。

case 1:t=c1[0];c1[0]=c1[2];c1[2]=c1[3];c1[3]=c1[1];c1[1]=t;break;//修改角块1。颜色数组中存放的各个面的颜色序号顺序是:前左右后上下,顶层旋转将前面换为右面,右面换为后面,后面换为左面,左面换为没发生变换时的前面。

case 3:t=c3[0];c3[0]=c3[2];c3[2]=c3[3];c3[3]=c3[1];c3[1]=t;break;

case 7:t=c7[0];c7[0]=c7[2];c7[2]=c7[3];c7[3]=c7[1];c7[1]=t;break;

case 9:t=c9[0];c9[0]=c9[2];c9[2]=c9[3];c9[3]=c9[1];c9[1]=t;break;

case 18:t=c18[0];c18[0]=c18[2];c18[2]=c18[3];c18[3]=c18[1];c18[1]=t;break;

case 20:t=c20[0];c20[0]=c20[2];c20[2]=c20[3];c20[3]=c20[1];c20[1]=t;break;

case 24:t=c24[0];c24[0]=c24[2];c24[2]=c24[3];c24[3]=c24[1];c24[1]=t;break;

case 26:t=c26[0];c26[0]=c26[2];c26[2]=c26[3];c26[3]=c26[1];c26[1]=t;break;

default:break;}

在一实施例中,如图10所示,魔方颜色配置单元用于三阶魔方模型的表面颜色的初始配置,包括颜色采集模块和信号处理模块,该颜色采集模块优选为六个按键,信号处理模块优选为Arduino UNO开发板。

其中,六个按键分别对应魔方的红色、橙色、蓝色、绿色、黄色和白色,六个按键分别连接到Arduino的14个数字信号I/O接口中的6个上。它们分别是Pin2、Pin4、Pin7、Pin8、Pin12和Pin13在需要利用按键输入魔方颜色时,只需要按下对应该颜色的按键,即可向Arduino开发板输入数据,Arduino通过接受到的数据判断按下的是哪个按键,如果是按下第一个按键,则向Processing输出0,代表红色,如果按下第二个按键,则输出1,代表黄色,其余四个按键分别输出2、3、4、5,代表橙色,白色,绿色和蓝色。

在一实施例中,如图11所示,在本实用新型中颜色的输入顺序为上->下->左->右->前->后。每一面的输入顺序为:上面:先沿Y增大的方向,再沿着X增大的方向进行输入;下面:先沿Y增大的方向,再沿着X减小的方向进行输入;左面:先沿Z增大的方向,再沿着X增大的方向进行输入;右面:先沿Z减小的方向,再沿着X增大的方向进行输入;前面:先沿Y增大的方向,再沿着Z减小的方向进行输入;后面:先沿Y增大的方向,再沿着Z增大的方向进行输入。每一面的输入顺序为将该面朝上,从最左上角开始,一行一行输入。

在其它实施例中,初始颜色配置可以从设定好的若干颜色配置模板中选择。

在一实施例中,如图12所示,三阶魔方虚拟系统的工作流程依次如下:1、开始界面,如图13所示,提供选定视角的三阶魔方模型;2、对界面上的三阶魔方模型进行打乱,打乱后的魔方如图14所示;3、接下来让玩家确定是否开始游戏,例如提供“Play”按钮供玩家确定;4、接收串口动作指令;5、执行对应旋转动作,执行后的结果如图15所示;6、接下来让玩家确定是否需要查看步骤提示,例如提供“提示”按钮,当玩家查看步骤提示后转入下一步或者不查看步骤提示直接转入下一步;7、判断是否复原魔方,若没有,转入步骤4,继续接受串口动作指令,若复原,进入下一步;8、提供游戏完成界面,如图16所示,统计游戏结果,转入下一步骤:9、是否再来一局,若是返回开始界面,若否,结束游戏。

根据本实用新型的三阶虚拟魔方系统,能够应用三阶的解魔方仿真教学及训练,在一实施例中,该系统包括对三阶魔方进行数字图像采集、对魔方进行软件建模、显示解魔方的步骤及演示图像。首先,通过颜色传感器将实体魔方的颜色等信息录入到软件系统中,接着通过将三阶魔方视为3*3*3方式堆积的27个立方体,在系统中进行软件建模,根据采集到的信息,给出解魔方的具体步骤的提示信息,并相应的改变软件系统中的魔方的演示状态,达到分步骤教学的目的。使用者可以跟随提示信息,操作手中的魔方,并与系统中的魔方进行对照。亦可通过动作采集器控制每一个面的旋转,直接操控软件中的魔方模型。

动作采集器的使用方法具体描述如下:令三阶魔方模型中的顶层、左面、绕Y轴、中间层xoy、中间层yoz、前面、底层、右面和绕X轴这九个旋转对象接收外部旋转指令。这九个旋转动作指令分别对应的是No1、No2和No3加速度传感器的三个方向的变化,既从水平变化到向左侧翻转90度、从水平变化到向前翻转90度和从水平变化到向后翻转90度。这九个面接收外部旋转指令;利用动作采集单元向所述三阶魔方模型提供所述九个面的旋转指令;以及使三阶魔方模型在接收所述旋转指令后对所述旋转对象及其表面颜色进行整体旋转,并且在所述显示界面上实时显示。在本实用新型中,三阶魔方模型构造成仅需要九个旋转指令即可实现魔方复原操作,满足随意打乱魔方的要求。

训练功能:当要测试其学习成果时,可以使用该系统进行竞赛。该系统包含随意打乱功能、接收动作采集器的命令来控制三阶魔方模型的功能、计时功能和判断是否结束功能。

以上所述仅为本实用新型的优选实施例而已,并不用于限制本实用新型,对于本领域的技术人员来说,本实用新型可以有各种更改和变化。凡在本实用新型的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本实用新型的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1