Skocz do zawartości

Przynajmniej kilkadziesiąt pytań na temat problemów z Houdinim


Rekomendowane odpowiedzi

Napisano

Jak zasugerował SYmek utworzyłem temat na forum i zadaje kilka pierwszych pytań.

 

Nr.1: Utworzenie osobnej grupy dla każdego primitiv albo kilku z nich za pomocą jakiegoś wzoru.

  • Odpowiedzi 50
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano (edytowane)

a5a3031bf89f8d34med.jpg

 

PartitionSOP tworzy grupy zgodnie z wyrażeniem w polu "Rule". Wyrażenie

group_`$PR`

zwraca nazwę grupy stworzoną ze zmiennej $PR, czyli numeru prymitywu. Łatwiej się nie da...

 

Oczywiście wyrażenie może być dowolne. Będzie wykonane dla każdego elementu (punktu lub prymitywu). W menu po prawej jest taki na przykład preset:

 

 color_`rint($CR*255)`_`rint($CG*255)`_`rint($CB*255)`

 

który, jak widać, tworzy grupę według koloru elementu.

Edytowane przez SYmek
Napisano

Nr. 2. Mam kilka boxów o różnej długości i teraz skopiować w jednej linii aby losowo wybierało ich długość jak coś takiego można osiągnąć?

Napisano
Nr. 2. Mam kilka boxów o różnej długości i teraz skopiować w jednej linii aby losowo wybierało ich długość jak coś takiego można osiągnąć?

 

Słowa klucze: CopySOP/stamping, SwitchSOP, instancje.

 

Wszystko o kopiach oraz instancjach:

http://www.sidefx.com/docs/houdini12.1/copy/

 

Wszystko o technice copy/stamping:

http://www.sidefx.com/docs/houdini12.1/copy/tutorial_stamping

 

Poręczne video:

http://www.sidefx.com/index.php?option=com_content&task=view&id=1868&Itemid=132

 

... i w końcu link z Helpa z *dokładnym* przykładem tej techniki:

http://localhost:48626/examples/nodes/sop/copy/StampRandom

Napisano

No, dobra, ponieważ Legomir nalegał wczoraj, żeby grupy per prymityw zrobić tak jak w Mai, bo w Mai to jest proste, teraz wersja a'la Maya:

 


def createGroup(group_name, pattern, inNode):
  """ Tworzy GroupSOP per prymityw.
  """
   group_name = group_name + str(pattern)
   parent = inNode.parent()
   groupNode = parent.createNode("group")
   groupNode.parm("crname").set(group_name)
   groupNode.parm("pattern").set(str(pattern))
   groupNode.setFirstInput(inNode)
   groupNode.moveToGoodPosition()
   return groupNode

# Wybrany node:
selected = hou.selectedNodes()[0]

#  Interesują nas tylko Sopy:
if selected.type().category() == hou.sopNodeTypeCategory():
   #Lista wszystkich prymitywów:
   prims   = selected.geometry().prims()
   inNode = selected
   groupNodes = []
   name = "group_"
   for prim in prims:
       outNode = createGroup(name, prim.number(), inNode)
       inNode  = outNode
       groupNodes.append(inNode)
   # Na koniec spakujemy tę kupę bezsensownych nodów w subnet:
   subnet = selected.parent().collapseIntoSubnet(groupNodes)
   subnet.moveToGoodPosition()
   subnet.setDisplayFlag(1)
   subnet.setRenderFlag(1)

 

Chyba nie ma głupszego powodu użycia skryptu, ale w ramach wprowadzenia może się przyda. Możemy to wkleić w shell Pythona, a potem zaznaczyć i przeciągnąć na shelf, aby utworzyć nowy tool. Potem trzeba mu niestety ręcznie zmienić język z hscript na Python i gotowe.

Napisano

Wcale nie nalegał tylko naginanie jego wyobraźni w jeden dzień ma pewne granice poza tym ciągle się uczy jak to cholerstwo działa po całości, a działa (nie)stety całkiem inaczej niż wszystko. Tak czy inaczej dzięki.

Napisano

NR.3

 

Walki i pytań ciąg dalszy, bo jednocześnie Stamping to jest to czego chce i nie jest to czego chce. Chodziło mi o stworzenie czegoś w rodzaju generatora podłóg dla ćwiczenia, ale parametr $PT działa dla każdego punktu tempelate, a ja chce żeby działało dla każdego nowo wykreowanego prima albo punktu z użyciem $CY albo $NCY nie działało.

 

W poszukiwaniu innych rozwiązań doszedłem do tego, że albo można zrobić prosty L-System dla tego aczkolwiek nie wiem czy to sensowne, albo można napisać kod w Pythonie, którego jak na razie bym wolał unikać.

 

Jaka opcja jest najlepsza albo ja powinno się to robić no i gdzie popełniam błąd w myśleniu?

Napisano

Nie wiem o jakie podłogi Ci chodzi, ale podejrzewam, że wszystko, co potrzebujesz widzieć jest opisane w linkach powyżej. Zostaw LSystemy i Pythona, bo to armata na komara. Załączam prosty przykład. Można to zrobić dużo, dużo lepiej i pewnie prościej, ale dałem sobie 10 minut, a poza tym nie znoszę tych wszystkich proceduralnych generatorów, nudzą mnie :(. Celowo nie opisuję nodów, żebyś miał z tego jakąś zabawę :P

 

bbad8cede63728abmed.jpg

podGen.otl.zip

Napisano

Nr. 4. mam chmurę punktów ze scattera, animuje na niej scaleX i Z rotacjeY, potem lekkie tubulance za pomocą vop sopi teraz chcę na to dać lekką rotacje per point z ograniczonym kątem jak coś takiego uzyskać?

Napisano

Z matematycznego punktu widzenia punkty nie mają orientacji, więc nie mogą się obracać. To co się obraca to układ współrzędnych przyczepiony to punktu. W najprostszym przypadku układem współrzędnych może być wektor, choć to bardzo niedoskonały układ. Solidnym układem jest macierz (3 x wektor). Układ w przeciwieństwie do punktu ma swoją orientację (względem innego układu, czyli obiektu).

 

Macierz rotujesz w Vopach jednym nodem który przyjmuje kąt w radianach oraz oś obrotu. Gotową rotację najprościej obserwować przenosząc dowolny wektor do układu współrzędnych punktu. Czyli macierz -> rotacja -> aplikacja na wektor. A reszta jest w Helpie :)

Napisano

Cały problem w tym, że średnio mi idzie chyba szukanie czegokolwiek w helpie. Zwykle jak coś robię to tworzę większość w parę minut i zonk na cały dzień. Hmm... nie ma jakiejś książki, która opisuje wszystko?

Napisano
Zwykle jak coś robię to tworzę większość w parę minut i zonk na cały dzień.

No to jak w parę minut rotujesz punkty w Mai?

 

Hmm... nie ma jakiejś książki, która opisuje wszystko?

 

Ponoć Britannica jest niezła, tylko droga. Za to Wikipedia jest na wyciągnięcie ręki :) Podałem Ci słowa klucze: macierz, rotacja. Mam wrażenie, że Ci się po prostu nie chce szukać. Jakbyś wklepał "rotate" w Helpie wiedziałbyś, że dwa z trzech przykładów do RotateVOP wyjaśniają wszystko.

Napisano

Dziś nawet chciałem użyć tego noda ;) Więc w takim razie to chyba moja tendencja to pomijania plików z examples, obiecuje się poprawić :P

 

Użyłbym pewnie particli do tego, co zupełnie nie byłoby potrzebne z tego co widzę ;)

 

 

 

Poza tym żeby przestać być ignorantom chyba najpierw trzeba nim być :P

Napisano

Wszyscy jesteśmy ignorantami, inaczej się dziś nie da. Chodzi o to, żeby walczyć samemu a pytać o konkrety, kiedy czegoś nie możesz znaleźć.

 

 

ps cząsteczkami też mógłbyś to zrobić w H. btw.

Napisano

Używam PointWrangle i robię coś takiego att=max(P.Y) uzyskuje wynik dla każdego punktu(co jak już wiem jest całkiem logiczne z uwagi na to działa), więc jak rozumiem muszę stworzyć listę/tablicę i z niej wyznaczyć max z tym, że według tego co widzę wranglery nie mogą tworzyć tablic, więc w takim razie czy się mylę i da się jakoś to zrobić czy muszę wyznaczyć max dla att primitive i promoteAtt zmienić do dla punktów?

 

Szczerze mówiąc upierałbym się bym przy wykorzystaniu wraglera/vopSOP żeby mieć całość w jednym nodzie.

Napisano
Używam PointWrangle i robię coś takiego att=max(P.Y) uzyskuje wynik dla każdego punktu(co jak już wiem jest całkiem logiczne z uwagi na to działa), więc jak rozumiem muszę stworzyć listę/tablicę i z niej wyznaczyć max z tym, że według tego co widzę wranglery nie mogą tworzyć tablic, więc w takim razie czy się mylę i da się jakoś to zrobić czy muszę wyznaczyć max dla att primitive i promoteAtt zmienić do dla punktów?

 

Szczerze mówiąc upierałbym się bym przy wykorzystaniu wraglera/vopSOP żeby mieć całość w jednym nodzie.

 

Nie bawilem sie jeszcze pointWrangle ale podejrzewam ze dziala podobnie jak reszta Vexa wiec bedziesz musial zrobic to w dwoch nodach. Podobna sprawe mialem tu (jest tam tez link do topica z hip'em). Mierzylem dystans kazdego punktu ale zeby znalezc ten ktory jest najbardziej podobny do mojego wzorowego dystansu musialem wywalic to porownanie do PythonSOP.

Ewentualnie jak chcesz mozna zrobic to w jednym nodzie za pomoca inlineCPP lub HDK. Prosta sprawa.

Napisano (edytowane)

W takim razie pozostawię na 2. nie chce zaczynać nowych rzeczy i odwracać uwagi od tego co teraz robię, bo przeważnie kończy się porzuceniem jakiegoś projektu. Dzięki za odpowiedź :)

 

Edit

 

Poradziłem już sobie inaczej przepisując funkcje z użyciem absolute

Edytowane przez legomir
Napisano (edytowane)

Jeszcze jedno pytanie robię jakiś głupi błąd, ale za cholere nie wiem gdzie. Mam ten atrybut z wczoraj i teraz w filter expression wpisuje

$TY == @att

 

dostaje błąd w postaci expression stack error

 

EDIT poradziłem sobie point expression, ale kolejny problem w details viem widzę, że jakieś 20 punktów ma TY równe mojemu max_y z tym, że expressia znajduje 3 punkty na tej wysokości domyślam się, że problem jest zaokrąglenie jak mogę je zmienić?

Edytowane przez legomir
Napisano

W Vexie masz tylko rint ale to ci da integer. Mozesz pomnozyc przez 1000 lub inna sume aby przesunac przecinek i zrobic poronanie integer. Porownywanie floatow ma wiele minusow i nie ma sensu z tym walczyc czasami.

 

Co ty chesz zrobic, bo moze za bardzo kombinujesz?

Nie moglys zapodac Hipa jak kazdy normalny uzytkownik Houdego? ;)

Napisano

Ogólnie to chce zrobić asset robiący wiązki kabli mam pattern kabli(circle lub znormalizowany shape, tworzy mi za pomocą prostego równania n shapów tworzących wiązkę kabli układającą sie w koło). Tutaj już wszystko ogarnięte.

 

Teraz mi potrzebny wave deformer(żeby kable zwisały powiedzmy z sufitu ;) ) ponieważ to raczej dla nauki pobawiłem się http://www.fundza.com/expressions/expressionsqr.html i utworzyłem prostą deformacje, teraz chce dodać do tego trochę kontroli, a ponieważ nie do końca jestem fanem suwaczków wymyśliłem sobie żeby można było to trochę ręcznie modyfikować za pomocą czegoś w rodzaju handle z circle i modyfikowania krzywej za pomocą att transfer, ponieważ nie mam pomysłu na inną metode, a minimalne i maksymalne wartości są według details viem dla sporej ilości obiektów takie same i zgadzają się mniej więcej z ilością rowków chciałem utworzyć grupę punktów do, której będę kopiował circle. Z grubsza o to chodzi chociaż w planach jest sporo więcej ^^ Tego hipa dołączę jak ogarnę trochę to co tam się dzieje, bo z reguły mam dużo własnych przyzwyczajeń i jestem chaotyczny.

Napisano (edytowane)

Problem, którego nie potrafię sam rozwiązać jak na razie:

 

problemowe.png

 

Niebieskie moja krzywa a właściwie jej odcinek, białe to przykładowe punkty strzałka w bok pokazuje jak rozchodzi się att od funkcji jaką mam(w drugą strone to lustrzane odbicie), czerwony kwadrat to nazwijmy to hanle, które zamierzam wykorzystać do modyfikatora.

 

W czym problem: chce aby handle można było modyfikować to jak "głęboki" jest konkretny cykl ponieważ modyfikuje krzywą od sinusa to dostaje piękne liczby ułatwiające wszystko, ale nie potrafię wymyślić metody transportu atrybutów tak, aby P.y konkretnego handle(primitiv) działało tylko na punkty w jednym cyklu. Jeśli coś jest niejasne postaram się jeszcze doprecyzować.

Edytowane przez legomir
Napisano

Ruszyłem nieco dalej, ale kolejny problem jest jakiś sposób aby tworzyć lub edytować parametry primitive w VOP, albo aby tworzyć grupy primitiv? Mam niejasne poczucie iż powinienem do tego użyć AttVOP, ale nie wiem jak.

Napisano (edytowane)

Dobra to kolejne, tym razem python SOP, chce dostać się do att punktu, który był o dwa przed tym, który jest obecnie przetwarzany mam coś w tym rodzaju:

 

# This code is called when instances of this SOP cook.
node = hou.pwd()
geo = node.geometry()


#init delete point


#Some UI parametr to control a curve.
iteration = node.parm("iteration").eval()


#Some params for interation
lengh = range(iteration)


# Add code to modify the contents of geo.
for i in lengh:
   point = geo.createPoint()
   position = 0.0
   if i==0:
       geo.addAttrib(hou.attribType.Point, "pos", (position))
       point.setPosition((position,position,0.0))
   elif i==1:
       position = 1.0
       point.setPosition((position,position,0.0))
       point.point.setAttrib("pos",(position))
   else: 
       a = geo.iterPoints()[i-1]
       b = geo.iterPoints()[i-2]

 

i teraz jak chce się dobrać do a.point.atributValue("position") zwraca mi błąd. Nie za bardzo mam pomysł jak to ruszyć z miejsca.

Edytowane przez legomir
Napisano

Troche za duzo tego "point'a" tutaj:

point.point.setAttrib("pos",(position))

Poza tym nie chodzi ci czasem o point.setAttribValue?

 

Po co tyle razy wolasz iterPoints? nie lepiej wrzucic raz, zachowac w zmiennej i potem od tej zmiennej odejmowac?

a = geo.iterPoints()[i-1]
b = geo.iterPoints()[i-2]

 

Nadal moze nie dzialac bo nie sprawdzalem kodu w akcji ale tyle widze na pierwszy rzut oka.

Napisano

W Pythonie 2.x range robi liste numerow przez co zapychasz pamiec dodatkowymi danymi a xrange tylko generuje numery bez tworzenia obiektow. W Pythonie 3.X range przejelo funkcje xrange. Google it i wywali ci tone topikow na ten temat.

Napisano
You can pin wire points to their positions in the source geometry with the pintoanimation or gluetoanimation point attribute. (pintoanimation locks the point’s position, while gluetoanimation locks the point’s position and normal.)

 

In the wire source geometry network, create a group containing the root points, and use the AttribCreate node to create the attribute. Use the following settings:

 

Group

The name of the group containing the root points, such as roots.

 

Name

pintoanimation or gluetoanimation

 

Class

Point

 

Value

1

 

Trochę próbuję z wire solverem i natrafiłem na coś takiego. O ile rozumiem do w SOPach przed dopimport mam zrobić grupę i att(integer czy float?) i pin automatycznie mi to rozpozna. Próbuje źle czy trzeba coś zrobić jeszcze czego nie opisano?

Napisano

Wszystko jest tak, jak opisano... the only catch is, że to powinien być float. W H13 możesz po prostu w PointWrangerze dać jedną linię:

 

@pintoanimation = 1 ? !vertexprimindex(0, @ptnum) : 0;

Napisano

Nie mogę znaleźć wskazówki jak to zrobić mam kulę na nią wrzucony animowany noise, a potem wyskaterowane particle chciałbym teraz aby particle poruszały się po kulce. Próbowałem to zrobić particlami i kolizją ustawioną na slide jednak w tej sytuacje particle spadają chciałbym aby po prostu się poruszały po powierzchni.

Napisano (edytowane)

To ci bedzie potrzebne http://forums.odforce.net/topic/18705-is-there-a-way-to-snap-points-on-a-surface-using-an-sdf/

 

Dodatkowo mozesz jeszcze w to sie zaopatrzyc https://cmivfx.com/store/163-houdini+fluid+effects+for+td's

 

PS. Wlasnie doszedl nowy topik w ktorym szerzej omowione sa metody raySOP i intersectVOP :

http://forums.odforce.net/topic/14903-project-a-point-onto-a-geometry-in-vops/

Edytowane przez mantragora
Napisano (edytowane)

W Houdinim12 zużycie RAMu mam na poziomie 300/400Mb bez niczego po uruchomieniu programy na XP 32bit

W H13 na win7 64 jakieś 3gb to normalne?

 

Edit jeszcze screen z task menagera zaraz po otwarciu:

 

DQCDt1C.png

Edytowane przez legomir
Napisano

.... i sprawdzcie teraz (jak mozecie) ta samą akcję pod linuxem :) - aczkowliek słyszałem ze juz nad tym pracują i moze niebawem będzie to poprawione pod windą (tzn. zarządzanie pamięcią)

Napisano

Domyślny alokator pamięci Visual Studio jest tak wolny, że panowie postanowili go podmienić alokatorem z TBB (o ile pamiętam), który jednak okazał się pod Windowsem potwornie zasobożerny (albo ma buga). Pod Linuksem używają jemalloca, który jest bodaj jednym z najlepszych rozwiązań.

Napisano

Dzięki wielkie wszystkim za odpowiedzi. Na linuxie nie będę mógł na razie sprawdzić, ale zainstaluje najnowszy built i zobaczymy co z Tego wyjdzie(u znajomego też na windzie jest ok, więc może to naprawili już a ja po prostu przegapiłem.

Napisano

Zainstalowałem dziś 13.0.343 Problem nadal jest według Houdiniego prawie 2gb zajmuje OpenGL cashe wie ktoś jak można to zmniejszyć, bo przeglądając opcje nie mogłem znaleźć takiej opcji.

Napisano

Szukaj w menu Windows -> Cache Manager. 2048 to jest max standardowy przypisany. Na swiezo nie powinien byc zapelniony. Cos grzebales w ustawieniach lub sterowniki zmieniales?

Napisano

W sensie nie jest zapełniony, ale jako, że domyślne rozmiary innych cashy są pozmniejszałem, więc przyszło mi na myśl, że to być przez to.

Napisano

Mam taką sytuacje obiekt z animowanym att podpięty pod Solver SOP. Tam porównuje wartości animowanego att, żeby dowiedzieć się w jakiej klatce został aktywowany z tym, że z tego wywnioskowałem empty object zczytuje wartości tylko w 1 klatce przez co nie ma animacji z drugiej strony jeśli włączę, że obiekt jest aktywny to w każdej klatce tworzy się obiekt jest jakiś sposób na rozwiązanie tego? Na razie spróbuję to zrobić podpinając jakoś zamiast emptyObj coś innego co będzie czytać att z dop import. ale chciałbym się dowiedzieć czy można to zrobić jakoś inaczej.

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