如何修复魔方的旋转?

时间:2010-05-16 23:19:15

标签: flash 3d papervision3d rubiks-cube

我正在尝试在Flash&中创建一个魔方。 Papervision,我真的被困在这里。我已经达到了可以旋转任何立方体平面一次的程度,但之后......由于所有局部坐标系都很混乱,所以它搞得一团糟。

我真的不知道从哪里开始,有人可以提供什么建议吗?我不是在寻找'关于变换矩阵的阅读',我知道我应该(我正在这样做),但我不确定要寻找什么。我的想法是,在每次旋转之后,我应该再次修复每个立方体的每个坐标系,但我不知道如何。我希望得到的任何关于我想要实现的内容(以及文字),以及为什么,都非常感激。

http://dl.dropbox.com/u/250155/rubik/main.html(使用cursorkeys + A& D)

3 个答案:

答案 0 :(得分:1)

讨厌说,但是,矩阵很方便:

http://wonderfl.net/c/mwdp

papervision rubiks http://wonderfl.net/images/capture/9/9d/9dd4/9dd41cd57b2f042f38bf450a41da77ab45348892.jpg

代码也很好评论。

另一件令人想到的事情,如果矩阵是矫枉过正的话 即时分组/重新显示DisplayObject3D实例。

假设你有一些基本的东西:

var cubes:DisplayObject3D = new DisplayObject3D();
            cubes.name = 'cubes';
            for(var i:int = 0 ; i < boxDivisions ; i++){
                var zBoxes:DisplayObject3D = new DisplayObject3D();
                zBoxes.name = 'zBoxes_'+i;
                for(var j:int = 0 ; j < boxDivisions; j++){
                    var yBoxes:DisplayObject3D = new DisplayObject3D();
                    for(var k:int = 0 ; k < boxDivisions ; k++){
                        var box:Cube = new Cube(materials,boxSize,boxSize,boxSize);
                        box.material = box.material.clone();
                        box.material.fillColor = Math.random() * 0xFFFFFF;
                        box.x = ((boxDivisions-1) - (k+1)) * (boxSize + boxSpacing);
                        box.name = 'box_'+i+''+j+''+k;
                        yBoxes.addChild(box,'box_'+i+''+j+''+k);
                    }
                    yBoxes.y = ((boxDivisions-1) - (j+1)) * (boxSize+boxSpacing);
                    yBoxes.name = 'yBoxes_'+j;
                    zBoxes.addChild(yBoxes);
                }
                zBoxes.z = ((boxDivisions-1) - (i+1)) * (boxSize+boxSpacing);
                cubes.addChild(zBoxes);
            }
            basicView.scene.addChild(cubes);

这些团体只会对一些情况有所帮助,但不是全部,要记住的是 你可以命名和分组DO3D的

假设您单击并拖动一个小方块:

  1. 弄清楚它是否位于 当前活跃的面孔(收集 3X3盒)。
  2. 基于你知道它属于哪一组3,因此,什么 一组3X3X1立方体旋转为 组
  3. 根据当前鼠标位置减去前一个鼠标位置,你 知道旋转的方向 向。
  4. HTH, 乔治

答案 1 :(得分:0)

也许您可以存储构成魔方的26个立方体中每个立方体的位置和方向,并在需要显示时计算坐标和颜色。

例如,正面(但是您定义前面)将具有位置(0,0,0)到(2,2,0)。我正在使用x,y和z;其中x从左到右,y从上到下,z在立方体中移动。

方向为0 - 5,对应于每个小方块面上的颜色。

在绘制魔方时,您必须考虑用户相对于前方的位置。

我不确定这会使旋转方法更容易,但至少你的立方体方向是正确的。

答案 2 :(得分:0)

Here你可以找到一篇描述Rubik立方体表示的替代品的ACM论文。

当我在Ruby中使用Rubik的立方体时,我的时间很短,并决定自己对逻辑进行编码。它适用于3×3×3立方体,但实现非常糟糕。

gist.github.com/377665

我使用以下矩阵来表示内存中的多维数据集:

spreadsheets.google.com/ccc?key=0As1DrYDLh7F6dGROZFRoOTFDOThVMUFENjRWM0xJbVE&hl=en

我概述了一组规则,用于行或列的移动以及特定移动的外侧旋转。我将这些规则作为树叶放入树中。此树的更高级别节点是移动类型,方向以及行或列编号的准则。对于特定情况,我正在提取一组相应的规则,用于转换代表Rubik立方体的二维数组,然后逐个执行它们。

这是Ruby中的源文件(令人毛骨悚然的代码警告!):

github.com/toksaitov/scenario/blob/master/lib/scenario/objects/rubik.rb

请考虑检查RubikStructure类,RubikStructure::RULES哈希值和RubikStructure#rotate方法。

我希望它会以某种方式提供帮助。