2010-05-16 54 views
1

我想在Flash中创建一个魔方,& Papervision,我真的被困在这里。我到了可以旋转任何一个立方体平面的点,但之后......因为所有局部坐标系都很混乱,所以这个问题已经搞乱了。如何修复魔方中的旋转?

我真的不知道该从哪里出发,有没有人可以提供任何建议?我不是在寻找'阅读转化矩阵',我知道我应该(而且我正在那样做),但我不确定要寻找什么。我的想法是,每次旋转后,我应该再次修复每个立方体的每个坐标系,但我不知道如何。对于我想达到的(言外之意)以及为什么的任何提示都非常感谢。

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

+0

看看[Rubic Cube:四元数旋转不起作用,例外](http://stackoverflow.com/a/39024016/2521214) – Spektre 2016-08-18 17:23:19

回答

0

也许你可以存储每个26个立方体组成一个魔方的位置和方向,当你需要显示计算坐标和颜色。例如,正面(但是您定义正面)将具有位置(0,0,0)到(2,2,0)。我使用x,y和z;其中x从左到右,y从上到下,z在立方体中移动。

方向将从0到5,并对应于每个小立方体的面上的颜色。

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

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

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. 弄清楚,如果这是对的的 当前活动面(收集位置210个3X3盒)。
  2. 基于你知道它属于哪个组的3,因此,旋转什么 组的3X3X1立方体基于当前鼠标位置减去前一个 组
  3. ,你 知道旋转什么方向 朝。

HTH, 乔治

+0

@Eindbaas这只是在papervision邮件列表中弹出,请查看: http://setvelocity.blogspot.com/2010/03/first-ever-papervision3d-experiment.html – 2010-09-15 20:50:43

0

Here你可以找到描述魔方代表的替代品的ACM纸。

当我在Ruby中进行Rubik的魔方时,我的时间很短,决定自己对这些逻辑进行猴编码。对于3×3×3的立方体来说效果相当好,但实现起来非常糟糕。

gist.github.com/377665

我用下面的矩阵表示在存储器中的多维数据集:

spreadsheets.google.com/ccc?key=0As1DrYDLh7F6dGROZFRoOTFDOThVMUFENjRWM0xJbVE & HL =烯

我列出了一组规则,用于移动行或列的位移和外侧的特定移动的旋转。我将这些规则作为树叶放入树中。此树的更高级别节点是移动类型,方向和行或列号的准则。对于一个特定的情况,我提取了一组代表Rubik's cube的二维数组变换规则,然后逐一执行。

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

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

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

我希望这会有所帮助。