Рубик

Тук е мястото където могат да се споделят/обсъдят някои нови функции плъгини, скриптове, програми или неофициани build-ве на Blender3D.

Модератори: ileto, kmn

Рубик

Мнениеот carboon » Сря Ное 21, 2007 6:23 pm

Пукскам едно чудо дето ме мъчеше от доста време. Рубик куб по идеята на 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
Аватар
carboon
 
Мнения: 294
Регистриран на: Пет Апр 20, 2007 2:45 pm
Местоположение: Русе

Мнениеот 3dom » Сря Ное 21, 2007 9:15 pm

Интересно. Ще го разгледам!
Аватар
3dom
 
Мнения: 514
Регистриран на: Сря Юли 05, 2006 1:03 pm

Мнениеот 3dom » Чет Ное 22, 2007 9:15 am

Връща ми грешка скрипта. Объркани са имената на кубчетата. Трябва да ги преименуваш.
Аватар
3dom
 
Мнения: 514
Регистриран на: Сря Юли 05, 2006 1:03 pm

Мнениеот Syziph » Чет Ное 22, 2007 10:24 am

Тъй като нямаше никакви коментари по темата тук
viewforum.php?f=7
предполагам че никой не е разглеждал файла.
Човека се е справил доста добре със задачата.
Можеш да разгледаш скриптовете и да сравниш твоя със неговия метод.
_/||\_o;
Аватар
Syziph
 
Мнения: 852
Регистриран на: Вто Сеп 19, 2006 11:16 am
Местоположение: Sofia

Мнениеот carboon » Чет Ное 22, 2007 1:38 pm

Syziph написа:Тъй като нямаше никакви коментари по темата тук

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

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

Иначе ми е ясно че в този си вид нещата не са много използваеми :) малко за експирианс го направих.
Аватар
carboon
 
Мнения: 294
Регистриран на: Пет Апр 20, 2007 2:45 pm
Местоположение: Русе

Мнениеот 3dom » Чет Ное 22, 2007 2:10 pm

Е не би трябвало, но дава, няма да те лъжа сега.
Даже има два типа "грешки"...

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

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

Ако махнем преименуването на обектите, скрипта почти винаги работи (с изключение на "скалирането"), което се получава поради грешни изчисления в матриците..
Защо не засичаш ротацията на някакво емпти и да го завъртиш в минус същата ротация или 360-ротацията, вместо матриците?
Аватар
3dom
 
Мнения: 514
Регистриран на: Сря Юли 05, 2006 1:03 pm

Малко код

Мнениеот 3dom » Чет Ное 22, 2007 2:25 pm

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;
Аватар
3dom
 
Мнения: 514
Регистриран на: Сря Юли 05, 2006 1:03 pm

Re: Малко код

Мнениеот carboon » Чет Ное 22, 2007 3:58 pm

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

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

Мнениеот 3dom » Чет Ное 22, 2007 4:15 pm

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]
Аватар
3dom
 
Мнения: 514
Регистриран на: Сря Юли 05, 2006 1:03 pm


Назад към Тестове / Tests

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта

cron