1

我正在尝试在 Flash 和 Papervision 中创建一个魔方,我真的被困在这里。我已经到了可以旋转任何立方体平面一次的地步,但在那之后......它搞砸了,因为所有局部坐标系都很混乱。

我真的不知道从这里去哪里,有人可以就做什么提供任何建议吗?我不是在寻找“阅读转换矩阵”,我知道我应该(而且我正在这样做),但我不确定要寻找什么。我的想法是,每次旋转后,我应该再次修复每个立方体的每个坐标系,但我不知道如何。非常感谢任何关于我想要实现的目标(以文字形式)以及为什么的提示。

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

4

3 回答 3

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. 根据当前鼠标位置减去前一个鼠标位置,您知道要旋转的方向。

HTH,乔治

于 2010-05-17T00:24:11.000 回答
0

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

例如,正面(无论您如何定义正面)的位置为 (0,0,0) 到 (2,2,0)。我正在使用 x、y 和 z;其中 x 从左到右,y 从上到下,z 在立方体中移动。

方向为 0 - 5,并对应于每个小立方体表面的颜色。

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

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

于 2010-05-16T23:46:46.620 回答
0

在这里,您可以找到一篇 ACM 论文,该论文描述了魔方表示的替代方案。

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

gist.github.com/377665

我使用以下矩阵来表示内存中的立方体:

电子表格.google.com/ccc?key=0As1DrYDLh7F6dGROZFRoOTFDOThVMUFENjRWM0xJbVE&hl=en

我概述了一组规则,用于移动行或列以及针对特定移动的外侧旋转。我把这些规则作为树叶放在树上。这棵树的更高级别的节点是移动类型、方向和行号或列号的指南。对于一个特定的情况,我提取了一组对应的规则来转换代表魔方的二维数组,然后一个一个地执行它们。

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

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

请考虑检查RubikStructure类、RubikStructure::RULES散列和RubikStructure#rotate方法。

我希望它会有所帮助。

于 2010-05-17T01:28:57.497 回答