Как исправить вращения в кубике Рубика? - PullRequest
1 голос
/ 17 мая 2010

Я пытаюсь создать кубик Рубика во Flash & Papervision, и я действительно застрял здесь. Я дошел до того, что могу один раз повернуть любую плоскость кубов, но после этого ... все испортилось, потому что все локальные системы координат грязные.

Я действительно не знаю, куда идти отсюда, кто-нибудь может дать совет, что делать? Я не ищу «читать о матрицах преобразования», я знаю, что должен (и я делаю это), но я не совсем уверен, что искать. Моя идея состоит в том, что после каждого вращения я должен снова фиксировать каждую систему координат каждого куба, но я понятия не имею, как. Любые намеки на то, чего я хочу достичь (на словах) и почему, очень ценятся.

http://dl.dropbox.com/u/250155/rubik/main.html (используйте клавиши курсора + A & D)

Ответы [ 3 ]

1 голос
/ 17 мая 2010

Ненавижу это говорить, но матрицы удобны:

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. на основе текущей позиции мыши за вычетом предыдущей, вы знать, в каком направлении вращаться в сторону.

НТН, George

0 голосов
/ 17 мая 2010

Здесь вы можете найти документ ACM, в котором описаны альтернативы представления кубика Рубика.

Когда я делал кубик Рубика в Ruby, у меня было мало времени и я решил сам по себе закодировать логику. Он работает довольно хорошо для куба 3 × 3 × 3, но реализация очень плохая.

gist.github.com / 377665

Я использовал следующую матрицу для представления куба в памяти:

spreadsheets.google.com / ссс? Ключ = 0As1DrYDLh7F6dGROZFRoOTFDOThVMUFENjRWM0xJbVE & гл = еп

Я изложил набор правил для смещений строк или столбцов и поворотов для внешних сторон для определенных перемещений. Я поместил эти правила как листья в дерево. Узлы более высокого уровня этого дерева были ориентирами для типов перемещения, направлений и номеров строк или столбцов. Для конкретной ситуации я извлекал соответствующий набор правил для преобразования двумерного массива, представляющего кубик Рубика, и затем выполнял их одно за другим.

Вот исходный файл на Ruby (предупреждение о жутком коде!):

github.com / токсаитов / сценарий / блоб / мастер / lib / сценарий / объекты / rubik.rb

Пожалуйста, рассмотрите возможность проверки класса RubikStructure, хеша RubikStructure::RULES и метода RubikStructure#rotate.

Надеюсь, это поможет как-то.

0 голосов
/ 17 мая 2010

Возможно, вы могли бы сохранить положение и ориентацию каждого из 26 кубов, составляющих кубик Рубика, и вычислить координаты и цвета, когда вам нужно отобразить.

Например, передняя грань (однако вы определяете переднюю) будет иметь позиции (от 0,0,0) до (2,2,0). Я использую x, y и z; где x идет слева направо, y идет сверху вниз, а z движется через куб.

Ориентация будет от 0 до 5 и будет соответствовать цвету на поверхности каждого маленького кубика.

При рисовании кубика Рубика вам нужно будет учитывать положение пользователя относительно фронта.

Я не уверен, что это облегчит методы вращения, но по крайней мере ориентация вашего куба будет правильной.

...