Страница 1 от 1

Рубик

МнениеПубликувано на: Сря Ное 21, 2007 6:23 pm
от carboon
Пукскам едно чудо дето ме мъчеше от доста време. Рубик куб по идеята на 3dom.
За съжаление по този начин направено питона няма да проработи в GE, каквато ми
беше идеята. Ще мисля друг вариант за GE, когато имам време.

http://upload.blenderbg.com/rubik.blend

Как работи: Емптитата управляват различни групи кубчета с парент,
като всеки път те се сменят. Всяко емпти съответства на определена страна на куба.

1.Маркирате някое емпти,
2.Пускате скрипта (ръчно)
3.Завъртате емптито
4.Пак пускате скрипта (ръчно)
5.Маркирате друго емпти
6.Пускате скрипта (ръчно)
7.Завъртате ............
8. и така нататък.

Не е задължително да завъртите точно на 90 градуса, скрипта дозавърта страните.

Моля ако има програмисти да не ми се смеят много :oops: . Не съм се занимавал с програмиране
и ако някой неща ви се сторят странни те сигурно са такива :) Можех да сложа още някои
друг цикъл за да намаля редовете и т.н. Който иска да си доразвива идеята.
======================================================================================
Ето още някои полезни неща за да не се мъчите като мен: http://upload.blenderbg.com/242PythonDoc.zip

МнениеПубликувано на: Сря Ное 21, 2007 9:15 pm
от 3dom
Интересно. Ще го разгледам!

МнениеПубликувано на: Чет Ное 22, 2007 9:15 am
от 3dom
Връща ми грешка скрипта. Объркани са имената на кубчетата. Трябва да ги преименуваш.

МнениеПубликувано на: Чет Ное 22, 2007 10:24 am
от Syziph
Тъй като нямаше никакви коментари по темата тук
viewforum.php?f=7
предполагам че никой не е разглеждал файла.
Човека се е справил доста добре със задачата.
Можеш да разгледаш скриптовете и да сравниш твоя със неговия метод.

МнениеПубликувано на: Чет Ное 22, 2007 1:38 pm
от carboon
Syziph написа:Тъй като нямаше никакви коментари по темата тук

Тази тема съм я пропуснал. Човека наистина си е поиграл доста, но си личи че доста разбира :)

3dom - не би трябвало да дава грешка, имената са наред още в началото и при мен работи.
Куба не трябва да се мести от кординатите където е защото от там се създават имената.
Би трябвало да стане така: отваряш файла -> маркираш някое емпти -> пускаш скрипта ->завърташ емптито -> т.н.

Иначе ми е ясно че в този си вид нещата не са много използваеми :) малко за експирианс го направих.

МнениеПубликувано на: Чет Ное 22, 2007 2:10 pm
от 3dom
Е не би трябвало, но дава, няма да те лъжа сега.
Даже има два типа "грешки"...

Между другото всички грешки се получават при трето стартиране на скрипта, обикновено първите две са успешни...

Една от грешките е че скалира кубовете вместо да ги завърти правилно.
Друга е питонска и по-точно не може да намери обект c221... При второто или трето пускане на скрипта се появява... Това идва, защото при всяко пускане сменяш имената на обектите и се получават дублирания някакви (според мен няма смисъл да ги мениш)..

Ако махнем преименуването на обектите, скрипта почти винаги работи (с изключение на "скалирането"), което се получава поради грешни изчисления в матриците..
Защо не засичаш ротацията на някакво емпти и да го завъртиш в минус същата ротация или 360-ротацията, вместо матриците?

Малко код

МнениеПубликувано на: Чет Ное 22, 2007 2:25 pm
от 3dom
Eто по-простичък, код който има същия резултат:

Код: Избери целия код
import Blender
from Blender import *

e1 = Blender.Object.Get("zelen")
e2 = Blender.Object.Get("oranj")
e3 = Blender.Object.Get("sin")
e4 = Blender.Object.Get("cherven")
e5 = Blender.Object.Get("bql")
e6 = Blender.Object.Get("jalt")
cn1 = Blender.Object.Get("c1")
cn2 = Blender.Object.Get("c2")
cn3 = Blender.Object.Get("c3")


b=0
k=[]
for i in range(3):
   for j in range(3):
      for l in range(3):
         b=b+1;
         k.append("k"+str(b));
         k[b-1] = Blender.Object.Get("c"+str(l+1)+str(j+1)+str(i+1));
         k[b-1].clrParent(2,0);
   

if e1.isSelected():
   e1.makeParent([k[0],k[1],k[2],k[9],k[10],k[11],k[18],k[19],k[20]]);
   e1.RotY = 0;
elif e2.isSelected():
   e2.makeParent([k[6],k[7],k[8],k[15],k[16],k[17],k[24],k[25],k[26]]);
   e2.RotY = 0;
elif e3.isSelected():
   e3.makeParent([k[6],k[3],k[0],k[15],k[12],k[9],k[24],k[21],k[18]]);
   e3.RotX = 0;
elif e4.isSelected():
   e4.makeParent([k[2],k[5],k[8],k[11],k[14],k[17],k[20],k[23],k[26]]);
   e4.RotX = 0;
elif e5.isSelected():
   e5.makeParent([k[18],k[19],k[20],k[21],k[22],k[23],k[24],k[25],k[26]]);
   e5.RotZ = 0;
elif e6.isSelected():
   e6.makeParent([k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7],k[8]]);
   e6.RotZ = 0;
elif cn1.isSelected():
   cn1.makeParent([k[1],k[4],k[7],k[10],k[13],k[16],k[19],k[22],k[25]]);
   cn1.RotX = 0;
elif cn2.isSelected():
   cn2.makeParent([k[5],k[4],k[3],k[14],k[13],k[12],k[23],k[22],k[21]]);
   cn2.RotY = 0;
elif cn3.isSelected():
   cn3.makeParent([k[9],k[10],k[11],k[12],k[13],k[14],k[15],k[16],k[17]]);   
   cn3.RotZ = 0;

Re: Малко код

МнениеПубликувано на: Чет Ное 22, 2007 3:58 pm
от carboon
Така както ми каза разбрах защо не ти върви. Това със скалирането го знам, някакъв нежелан ефект :)
Забелязах, че ако страната се завърти някъде наполовина или около 45-те градуса, по някаква неизвеста
причина страната се скалира и от там се обърква всичко. Ако завърташ емтито на приблизително 90 градуса
(или кратно някакво 180, 270, ..) няма да се получи тоя ефект. Като казвам приблизително имам предвид от
70 до 110 градуса. Матриците ползвам зашото ми се сториха най-лесни. Идеята им е само да дозавъртят
и да подредят кубчетата по места (всъщност на емптито което е свързано със страната) за да не се налага
да въртим точно на 90 градуса. Вземам матрицата на емптито, закръглям всеки елемент от нея и я връщам обратно
и емтито се подрежда от там и кубчетата.

Понеже кубчетата са раположени в точно определени координати и имената им идват от там,
когато се скалне страната и те излизат от кординатите, въпреки че ги закръглям и от там скрипта не може да намери
името.
Защо се налага да преименувам. Задал съм че всяко емпти да е парент на 9 кубчета статично.
След някой ход кубчетата се разбъркват и се налага да преименувам цялото кубче за да може това емпти
да хване същата страна. Например по опростения скрипт който си показал връща страната и не може да направиш
следващ ход. Това е заради ротациите. Ако ги махнем за момента и въртим точно на 90 градуса за да няма
проблем, при втория ход(друго емпти) ще завърти 6 кубчета от страната си и 3 от някъде другаде.
При третия ход става още по лошо :)
Абе въобще неприятна работа си е това кубче :evil:

МнениеПубликувано на: Чет Ное 22, 2007 4:15 pm
от 3dom
Aха!

Ами на мен единствения път при който ми подейства скрипта, върна кубчетата в изходна позиция \както ако сложиш въртене на емптито 0\ и затова ти дадох такъв скрипт.
Иначе сега ти разбирам идеята и тя пак може да се осъщесвти с въртене на емптито...

Например:
Код: Избери целия код
...
if e1.isSelected():
   e1.makeParent([k[0],k[1],k[2],k[9],k[10],k[11],k[18],k[19],k[20]]);
   if (e1.RotY < 1.5707):
     e1.RotY = 1.5707;


Така ако си въртял малко ще го завърти до 90 градуса (1,5707 радиана).. По същия начин ако е между 90 и 180 ще завърти на 180, между 180 и 270 на 270, от 270 до 360 на 0. И ще ги има четирите основни движения...

И вече след като е завъртяно могат да се преименуват обектите по някакъв начин така че на следващия ход да стане въртенето.[/code]