Napisano 21 Maj 200915 l 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... :(
Napisano 22 Maj 200915 l 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
Napisano 23 Maj 200915 l Autor 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
Napisano 23 Maj 200915 l 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 200915 l przez beny
Napisano 24 Maj 200915 l Autor 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
Napisano 24 Maj 200915 l 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 ;(
Napisano 24 Maj 200915 l 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 :)
Napisano 24 Maj 200915 l Autor Chyba ze po prostu chcesz zrobic cos ala parent constraint? :) dokładnie :P
Napisano 24 Maj 200915 l 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.
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto