Kroopson Napisano 21 Maj 2009 Napisano 21 Maj 2009 Czy jest tu na forum ktoś kto naprawdę dobrze rozumie operacje macierzowe na obiektach w Maya? Borykam się z poblemrami przy ustawianiu macierzy przez xform obiektom które mają zafreezowane transformacje w innych miejscach niż punkt (0,0,0). Please help somebody... :(
beny Napisano 22 Maj 2009 Napisano 22 Maj 2009 Mnozysz macierze przez siebie i sruuu masz gotowa transformacje - znaczy sie ze mnozysz macierz translate przez rotate i scale i z dyni. Spraw sobie drugi tom Complete Maya programming tak jak Ci sugerowalem przy naszym drugim lub trzecim spotkaniu w korytarzu :)))) tam jest to ladnie opisane :D
Kroopson Napisano 23 Maj 2009 Autor Napisano 23 Maj 2009 no dobrze - to teraz tak: mam dwa obiekty A i B. Oba są umieszczone gdzieś w przestrzeni, każdy ma swoją rotację translację itp. ale obiekt A ma "zafreezowane" transformacje np w punkcie 0,0,1 I teraz biorę sobie macierz obiektu A i mnożę ją przez macierz obiektu B, bo chcę stransformować obiekt A względem obiektu B (tak jak działa parent constraint z ustawionym offsetem). Wszystko działa generalnie pięknie ale po takiej operacji zmienia mi się pivot obiektu A. Jak będziesz miał chwilę to ci podeślę kodzik w pythonie który obrazuje ten problem ;) PS. nie byłeś się strzelać lamuchu a było tak pięknie :P
beny Napisano 23 Maj 2009 Napisano 23 Maj 2009 (edytowane) Jak zrobisz freeze transform to zapisujesz transformacje tranform noda na pojedyncze podkomponenty wiec macierz jego transformacji sie staje macierza identity czyli po skosie jedynkową a reszta zera. Noi generalnie jak ja przemnozysz przez macierz B to dostaniesz po prostu macierz B noi pivot z A stanie sie pivotem B, chyba ze mnozysz maciez wszystkich komponentow z osobna to pivot powinien siedziec tam gdzie jest ... ale zakladam ze skoro zaczales ten watek, mnozysz wszystkie z osobna a pivot sie zmienia, wiec podeslij co tam naskrobales - obejrze w poniedzialek. ps. Nie szczelalem :) gdyz ktos wyrenderowal telefon wygladajacy jak krecony w piwnicy i musialem poprawic conieco w studiu. Edytowane 23 Maj 2009 przez beny
Kroopson Napisano 24 Maj 2009 Autor Napisano 24 Maj 2009 no tak - juz też do tego doszedłem że Maya w macierzy przechowuje też dane o pivocie. import maya.cmds as cmds # robie dwa lokatory cmds.spaceLocator() cmds.spaceLocator() #ustawiam je w przestrzeni gdizes tam cmds.setAttr("locator1.translateX", 5) cmds.setAttr("locator1.rotateY", 45) cmds.setAttr("locator2.rotateY", 32) cmds.select("locator2") cmds.move(0,0,2,"locator2") cmds.makeIdentity("locator2", apply=True) targets = cmds.ls(sl = True) transforms = [] matrices = [] pivots = [] for target in targets: matrices.append(cmds.xform(target, q=True, m=True, ws=True)) pivots.append(cmds.getAttr(target+".rotatePivot")) transforms.append(cmds.xform(target, q=True, t=True)) # mnozenie macierzy przez macierz i punktu przez macierz :) # nie chcialo mnie sie szukac takiej funkcji w pythonie :P def arraysMult(arrayA, arrayB): retMatr = [] if len(arrayA) == 16: for d in range(16): retMatr.append(0) for y in range(0,4): for x in range(0,4): for z in range(0,4): retMatr[x + (y*4)] += arrayA[z + (y*4)] * arrayB[x+(z*4)] return retMatr elif len(arrayA) == 3: arrayA.append(1) retMatr = [0,0,0,0] for x in range(0,4): for z in range(4): retMatr[x] += arrayA[z] * arrayB[x + (z*4)] return retMatr[0:3] elif len(arrayA) == 4: retMatr = [0,0,0,0] for x in range(0,4): for z in range(4): retMatr[x] += arrayA[z] * arrayB[x + (z*4)] return retMatr[0:3] #pobranie macierzy z obiektu ktory ma byc offsetem offsetM = cmds.xform("locator1", q=True, m=True) #a tu sama petla mnozaca macierze itd. for i in range(len(targets)): target = arraysMult(matrices[i], offsetM) cmds.xform(targets[i], m=target, ws=True) Troszkę dookoła to wszystko porobione w tym skrypcie bo powyciągałem najważniejesze rzeczy z większej całości. Pozdrówki PS. sorki że python, wiem że nie lubisz ale się przyzwyczaiłem już :P
beny Napisano 24 Maj 2009 Napisano 24 Maj 2009 Ej, no dziala jak nalezy. Tworzysz lokator, potem drugi, na ktorym robisz freeze transform - wtedy pivot skacze mu do punktu [0, 0, 0] a wszystkie punkty (wtym przypadku jako ze to jest lokator to jest tylko 1) mnożone są przez macierz transformacji a na ostatniej kolumnie jako ze to sa punkty a nie macierze to dodawane sa zera, przez co mimo przeniesienia pivota zostają w world space tam gdzie byly, potem jest Twoja funkcja mnozaca macierze (wyglada ok - nie wnikalem ale dziala dobrze ze tutaj bledu nie ma), no a potem nanosisz na swoj target ktory zawsze bedzie 1 (nie wiem po co w petli go dales ale zakladam ze to dlatego ze reszty kodu nie ma), macierz transformacji z lokatora1 ... nie wiem jaki chcesz otrzymac efekt, ale jedynym sensownym rozwiazaniem jakie mi przychodzi do glowy, to to ze chcesz miec te dwa lokatory dokladnie w tych samych miejscach i o takiej samej transformacji, albo nie chciales zrobic freeze transform tylko reset transform czyli zamiast identity true dać false i masz juz gotowe rozwiazanie ... nie wiem ... jakiego efektu oczekujesz bo nie kapuje ;(
beny Napisano 24 Maj 2009 Napisano 24 Maj 2009 Chyba ze po prostu chcesz zrobic cos ala parent constraint? :)
beny Napisano 24 Maj 2009 Napisano 24 Maj 2009 No chyba ze chcesz wykonac inny trick - wykonac transformacje obiektu A na obiekcie B, ale wzgledem pivota obiektu A ... no to tutaj by byla inna historia ... ale to bez tricku tego sie nie zrobi. Wszystkie operacje Rotate i Scale przez naniesieniem macierzy transformacji są przenoszone przez mnożeniem do punktu (0, 0, 0), potem mnożone, a potem nanosi dopiero translate i koryguje względem pierwotnego położenia. Czyli stosując się do tego musiałbyć przenieść obiekty A i B o negatywny wektor z pozycji obiektu A, teraz przemnożyć macierze przez siebie i dodać translate B sprzed całej operacji. Mysle ze to o to Ci chodzilo :)
Kroopson Napisano 24 Maj 2009 Autor Napisano 24 Maj 2009 Chyba ze po prostu chcesz zrobic cos ala parent constraint? :) dokładnie :P
beny Napisano 24 Maj 2009 Napisano 24 Maj 2009 Delektuje sie piwkiem i robie soft boot systemu bio-neuronowego przed stresujacym tygodniem, jak nie zrobisz tego do jutra to postaram sie jakos pomoc. Jestesmy w kontakcie.
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się