Skocz do zawartości

Featured Replies

Napisano

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

  • Odpowiedzi 9
  • Wyświetleń 1,5k
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano

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
  • 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

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

Napisano
  • 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

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

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

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

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności