1

Flash と Papervision でルービック キューブを作成しようとしていますが、本当にここで立ち往生しています。立方体の任意の平面を 1 回回転できるところまで来ましたが、その後は...すべてのローカル座標系が乱雑になっているため、めちゃくちゃになります。

ここからどこへ行けばいいのか本当にわかりません。何をすべきかについて誰かアドバイスをいただけますか? 私は「変換行列について読む」ことを探しているのではありません。私はそうすべきだと知っています(そして私はそうしています)が、何を探すべきか本当にわかりません。私の考えでは、各回転の後、各立方体の各座標系を再度修正する必要がありますが、方法がわかりません。私が達成したいこと(言葉で)とその理由についてのヒントは大歓迎です。

http://dl.dropbox.com/u/250155/rubik/main.html (カーソルキー + A & D を使用)

4

3 に答える 3

1

言いたくないのですが、行列は便利です:

http://wonderfl.net/c/mwdp

papervision ルービック http://wonderfl.net/images/capture/9/9d/9dd4/9dd41cd57b2f042f38bf450a41da77ab45348892.jpg

コードもきちんとコメントされています。

頭に浮かぶもう1つのことは、マトリックスがやり過ぎの場合、その場で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

次のマトリックスを使用して、メモリ内のキューブを表していました。

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

行または列のシフトと、特定の動きの外側の回転に関する一連のルールの概要を説明しました。これらの規則を葉としてツリーに配置しました。このツリーの上位ノードは、移動の種類、方向、および行番号または列番号のガイドラインでした。特定の状況で、ルービック キューブを表す 2 次元配列の変換に対応する一連のルールを抽出し、それらを 1 つずつ実行していました。

Ruby のソース ファイルは次のとおりです (不気味なコードの警告!)。

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

RubikStructureクラス、RubikStructure::RULESハッシュ、RubikStructure#rotateメソッド の確認を検討してください。

それが何らかの形で役立つことを願っています。

于 2010-05-17T01:28:57.497 に答える