Skocz do zawartości

Transformacje, macierze etc.


Kroopson

Rekomendowane odpowiedzi

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... :(

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 9
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

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

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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 przez beny
Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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 ;(

Odnośnik do komentarza
Udostępnij na innych stronach

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 :)

Odnośnik do komentarza
Udostępnij na innych stronach

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ę



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności