Автор Тема: pCubes - продвинутый симулятор Twisty Puzzles  (Прочитано 3047 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн grigr

  • Глобальный модератор
  • *****
  • Сообщений: 2 762
  • Пол: Мужской
  • кручу-верчу
    • Мой Магазин
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #45 : 15 Января 2017, 12:48:32 »
давно хотел показать процесс создания скрипта... понятное дело я не охвачу многих нюансов - но основу покажу
для примера покажу создание с нуля формы и задание всех составляющих головоломки.

файл Шаблона тут
http://www.twistypuzzles.com/forum/viewtopic.php?p=359489#p359489

1) за основу возьмем: Skiamond - Ryan Binter
http://twistypuzzles.com/cgi-bin/puzzle.cgi?pkey=2736


2) Данную форму можно найти в онлайн каталоге:
http://dmccooey.com/polyhedra/Catalan.html

Rhombic Triacontahedron - 30  rhombi граней
http://dmccooey.com/polyhedra/RhombicTriacontahedron.html


3) Внизу найдем кнопку "Coordinates" и нажмем ее. Там найдем все что нужно для скрипта ;)
базовые константы, описание вершин и граней


4) Откроем в текст-редакторе файл Шаблона, или создадим его самостоятельно


5) Зададим Шапку файла с описанием головоломки


6) И приступаем перенос всех параметров с сайта заполняя все по образцу в шаблоне


7) Сначала перенесем все константы (учтите синтаксис скрипта pCubes отличается)


8) Перенесем координаты всех вершин


9) Перенесем параметры всех Граней


10) теперь можно загрузить в симуляторе наше тело и посмотреть что получилось


11) И секции с константами проставляем в параметрах граней их цвета


12) Любуемся ;)


13) Задаем по шаблону нужные вершины которые будут вращаться (координаты находим в секции с вершинами)
подбираем вручную отступ от центра головоломки - параметр D, задаем углы поворота 120гр (2*pi/3)


14) вот что мы получаем. почти все готово!


15) Не хватает только углов для jumble-поворотов! чтобы их не считать самостоятельно,
вспомним что в описании было сказано что они такие же как у головоломки Pentagram


16) Найдем готовый скрипт для Pentagram и берем значения угла поворота оттуда


17) Переносим углы в наш скрипт и получаем полностью готовую новую головоломку ;)


18) А теперь попробуйте это решить ;) Удачи!
« Последнее редактирование: 29 Мая 2017, 11:11:33 от grigr »

Оффлайн grigr

  • Глобальный модератор
  • *****
  • Сообщений: 2 762
  • Пол: Мужской
  • кручу-верчу
    • Мой Магазин

Оффлайн grigr

  • Глобальный модератор
  • *****
  • Сообщений: 2 762
  • Пол: Мужской
  • кручу-верчу
    • Мой Магазин
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #47 : 29 Мая 2017, 11:08:16 »
Хотел бы дополнить предыдущую инструкцию несколькими процедурами для легкого вычисления всех необходимых переменных:
1) Углы между Нормалями по координатам векторов - нужно для задания углов поворота. особенно для Джумбле-головоломок
2) координаты Нормалей по координатам точек на  плоскости - нужно для задания осей вращения граней
3) Расстояние до плоскости - нужно для задания глубины сечения
4) координаты Перпендикуляра к ребру по координатам точек на  линии - нужно для задания осей вращения ребер

---------------------------------------------------------------------------------------

Каждому, кто хочет создавать новые головоломки, рекомендую изучить скрипт Jumball.xml
В этой головоломке все параметры (координаты нормалей, глубина сечения и углы поворота) рассчитываются с помощью специальных функций!
Они сделаны Борисом, и их можно использовать в любом головоломке ;)

Координаты вершин и формулы для их расчета я взял здесь:
http://dmccooey.com/polyhedra/6TruncatedTriakisTetrahedron2.html

Это первая трудная головоломка, у которой для расчета параметров я не использовал SolidWorks !!!
Это идеальный вариант Life-Hack для головоломок!

Вот полезные скрипты:
1) функция Angle - Вычисляет угол вращения от оси 2, до оси 3, вокруг оси 1
        function Angle(x1, y1, z1, x2, y2, z2, x3, y3, z3);
        begin
          vx := y1 * z2 - y2 * z1;
          vy := z1 * x2 - z2 * x1;
          vz := x1 * y2 - x2 * y1;
          wx := y1 * z3 - y3 * z1;
          wy := z1 * x3 - z3 * x1;
          wz := x1 * y3 - x3 * y1;
          Result := ArcCos((vx*wx + vy*wy + vz*wz) / (vx^2 + vy^2 + vz^2));
        end;

        function Angle2(i1, i2, i3);
        begin
          vx := ay[i1] * az[i2] - ay[i2] * az[i1];
          vy := az[i1] * ax[i2] - az[i2] * ax[i1];
          vz := ax[i1] * ay[i2] - ax[i2] * ay[i1];
          wx := ay[i1] * az[i3] - ay[i3] * az[i1];
          wy := az[i1] * ax[i3] - az[i3] * ax[i1];
          wz := ax[i1] * ay[i3] - ax[i3] * ay[i1];
          Result := ArcCos((vx*wx + vy*wy + vz*wz) / (vx^2 + vy^2 + vz^2));
        end;

далее в скрипте вставляем такой код расчета
   // Calc all Jumble Angle
        A1 := Angle(px[0], py[0], pz[0], px[1], py[1], pz[1],  px[2], py[2], pz[2]);
        A2 := Angle(px[0], py[0], pz[0], px[1], py[1], pz[1],  px[6], py[6], pz[6]);
   /////////
    <Axes TurningAngles = "2*Pi" AvailableAngles = "-A2;-A1; 0; A1;A2" PlaneDistances = "D" FixedLayers = "0">

2) процедура Normal - // Вычисляет Нормаль к плоскости по 3м точкам. Возвращает координаты в nx, ny, nz
        procedure Normal(x1, y1, z1, x2, y2, z2, x3, y3, z3, i, nn);
        begin
          nx := (y1-y3) * (z2-z3) - (y2-y3) * (z1-z3);
          ny := (z1-z3) * (x2-x3) - (z2-z3) * (x1-x3);
          nz := (x1-x3) * (y2-y3) - (x2-x3) * (y1-y3);

          // normalize vector
          dn := sqrt(nx^2 + ny^2 + nz^2);
          nx := nx / dn; ny := ny / dn; nz := nz / dn;
          px[i] := nx * nn; py[i] := ny * nn; pz[i] := nz * nn;

          // distace to plane
          L := x1*nx + y1*ny + z1* nz;
        end;   

        procedure Normal2(i1, i2, i3);
        begin
          nx := (y[i1]-y[i3]) * (z[i2]-z[i3]) - (y[i2]-y[i3]) * (z[i1]-z[i3]);
          ny := (z[i1]-z[i3]) * (x[i2]-x[i3]) - (z[i2]-z[i3]) * (x[i1]-x[i3]);
          nz := (x[i1]-x[i3]) * (y[i2]-y[i3]) - (x[i2]-x[i3]) * (y[i1]-y[i3]);

          // normalize vector
          dn := sqrt(nx^2 + ny^2 + nz^2);
          nx := nx / dn; ny := ny / dn; nz := nz / dn;
        end;

далее в скрипте вставляем такой код расчета
   // Calc all Normal and fill arrays Px,Py,Pz
   Normal( C2,-C2, C2, C3,-C0, C3, C1, C1, C4, 0, 1);
   Normal( C2,-C2, C2, C0,-C3, C3,-C1,-C4, C1, 1, 1);
   ////////////
        <Axis NormVector = " px[0]; py[0]; pz[0]" />
        <Axis NormVector = " px[1]; py[1]; pz[1]" />

Я также использую эту процедуру для вычисления глубины сечения
   // Calc cutting distance
   Normal(-C3, C0, C3,-C1,-C4, C1, C4, C1, C1,12, 1);
   D := L; 
   /////////////////////
    <Axes TurningAngles = "2*Pi" AvailableAngles = "-A2;-A1; 0; A1;A2" PlaneDistances = "D" FixedLayers = "0">

Чтобы рассчитать параметры Edge-головоломок, я рекомендую использовать эту процедуру

3) процедура Perpendicular - Вычисляет перпендикулярную-нормаль к Ребру по 2 точкам.Возвращает координаты в nx, ny, nz, и L - расстояние
        procedure Perpendicular(x1, y1, z1, x2, y2, z2, i, nn);
        begin
          // find third point
          x3 := y1 * z2 - y2 * z1 + x1;
          y3 := z1 * x2 - z2 * x1 + y1;
          z3 := x1 * y2 - x2 * y1 + z1;

          nx := (y1-y3) * (z2-z3) - (y2-y3) * (z1-z3);
          ny := (z1-z3) * (x2-x3) - (z2-z3) * (x1-x3);
          nz := (x1-x3) * (y2-y3) - (x2-x3) * (y1-y3);

          // normalize vector
          dn := sqrt(nx^2 + ny^2 + nz^2);
          nx := nx / dn; ny := ny / dn; nz := nz / dn;
          px[i] := nx * nn; py[i] := ny * nn; pz[i] := nz * nn;

          // distace to Line
          L := x1*nx + y1*ny + z1* nz;
        end;   

далее в скрипте вставляем такой код расчета
   // Calc all Perpendicular and fill arrays Px,Py,Pz
   Perpendicular( C2,-C2, C2, C3,-C0, C3, 0, 1);
   Perpendicular( C2,-C2, C2, C0,-C3, C3, 1, 1);

   // Calc cutting distance
   Perpendicular(-C3, C0, C3,-C1,-C4, C1,12, 1);
   D := L; 
   ///////////
        <Axis NormVector = " px[0]; py[0]; pz[0]" />
        <Axis NormVector = " px[1]; py[1]; pz[1]" />

    <Axes TurningAngles = "2*Pi" AvailableAngles = "-A2;-A1; 0; A1;A2" PlaneDistances = "D" FixedLayers = "0">

Удачи ;)

Оффлайн Plut`on

  • Глобальный модератор
  • *****
  • Сообщений: 1 118
  • Пол: Мужской
  • коллекционер
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #48 : 29 Мая 2017, 13:41:02 »
Женя, придумай пожалуйста как мои Плутоскопы туда забить.

Оффлайн grigr

  • Глобальный модератор
  • *****
  • Сообщений: 2 762
  • Пол: Мужской
  • кручу-верчу
    • Мой Магазин
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #49 : 29 Мая 2017, 16:05:20 »
Невозможно( иначе давно сделал бы
на данный момент возможны только оси проходящие через центр координат. Это хорошо для кубиков но плохо для твоих головоломок

Оффлайн Isaev

  • Постоялец
  • ***
  • Сообщений: 237
  • Пол: Мужской
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #50 : 06 Июня 2017, 00:38:01 »
Да не так уж это и невозможно. Если Борису не лень будет один класс дописать не сложненький для таких типов.
И Плутоскопы и гераниумы тогда через него впишутся на ура.
Только интерфейс для них надо в 2D ограничивать, трехмерное вращение там будет очень мешать. Но в этом тоже проблемы не вижу.

Оффлайн grigr

  • Глобальный модератор
  • *****
  • Сообщений: 2 762
  • Пол: Мужской
  • кручу-верчу
    • Мой Магазин
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #51 : 06 Июня 2017, 07:51:27 »
Нельзя на текущей версии движка. Который Борис пока не развивает.... Так что ждем пока у него появится вдохновение

Оффлайн Isaev

  • Постоялец
  • ***
  • Сообщений: 237
  • Пол: Мужской
Re: pCubes - продвинутый симулятор Twisty Puzzles
« Ответ #52 : 06 Июня 2017, 09:54:11 »
Нельзя на текущей версии движка. Который Борис пока не развивает...
Ну у него грандиозные планы и в этом направлении тоже, а планы они уже вдохновением навеиваются, т.ч. ждём ждём  :)
Цитата: Boris
Есть много важных дел по этой программе, которые я бы хотел сделать до того, как выйдет версия 1.0 - новый графический движок, улучшенное управление, макросы, текстуры, сцепки и столкновения элементов, не проходящие через нуль оси, гераниумы, блочные головоломки и т.д.