Jump to content

Cząsteczki tworzące dany obiekt


safian

Recommended Posts

Witam,

napotkałem się z zagadką, której nie mogę rozwiązać. Mianowicie moim zamysłem jest stworzenie z cząsteczek wyemitowanych z emittera kulę. Tymi cząsteczkami są animowane ptaki i czy jest jakiś zacny sposób na okiełznanie tych ptoków, aby utworzyły kulę?

 

Próbowałem z newton fieldem, ale latały one jak odrzutowce, a nie oto mi chodzi. Mój niedoświadczony móżdżek nie ma pojęcia w jaki sposób to zrobić, liczę na Waszą pomoc i z góry dziękuję.

 

Przykład w załączniku.

Link to comment
Share on other sites

  • Replies 81
  • Created
  • Last Reply

Top Posters In This Topic

Dzięki wielkie, goal się udał, będę musiał jeszcze trochę pokombinować. Nasuwa mi się jeszcze pytanie, w jaki sposób mogę zatrzymać animację ptaka, gdy już będzie tworzył ów kulę? Chodzi mi głównie o to, że dałem do instancera snapshoty animowanego ptaka i czy da radę w danym momencie po prostu zatrzymać tą animację?

Link to comment
Share on other sites

Hmm.. jeżeli Twoje ptaki mają instance z włączonym cycle animate to myślę (tzn. tak mi się wydaje :rolleyes: ) że tutaj należy skupić swoją uwagę tj. możesz zrandomizować całość z odrobiną kodu + zapewne "wyłączyć" animację w pewnym momencie w zakładce "Cycle".

Link to comment
Share on other sites

@asblaze

 

Masz na myśli brainbugz?

 

@legomir

 

Działa, działa, ale tym sposobem nie da rady stworzyć dobrej kuli z tych ptaków.

 

EDIT:

Poradziłem się legomira i skryptem podpiąłem ptaki do vertexów sphere'a. O taką kule z ptaków mi chodziło, jednak pozostaje kwestia w jaki sposób miejsce startu ustawić za książką, a następnie żeby wróciły do swojego miejsca? Moja nieobeznanie w cząsteczkach już męczy.

Edited by safian
Link to comment
Share on other sites

Hej,

 

odświeżam temat, bo wróciłem do tego, a zmienił się pomysł na to. Mianowicie zastanawia mnie czy da radę zrobić to w ten sposób, aby ptaki tak jakby wlatywały w obiekt, a następnie ten obiekt się wraz z wlatywaniem wypełniał/kompletował? Chodzi mi o taki obiekt jak niżej:

 

16bkkdw.jpg

 

Macie jakieś pomysły, które by mnie naprowadziły na efekt końcowy?

Link to comment
Share on other sites

Particle są banalne - wystarczy kumać dobrze skryptowanie, operacje na wektorach, macierzach, mieć ogólne pojecie o optymalizacji algorytmów i oko do ruchu i śmigasz wszystko co chcesz. Polecam!

 

Fakt! Bez umiejętności skryptowania kontrola nad particlami jest dla mnie strasznie oporna...

 

Anyway, sobie już poradziłem z poprzednim problemem. Teraz mam taki jeden tyci-tyci - mianowicie sobie volume axisem chcę wciągnąć moje ptaszyska z kuli. Fakt, faktem wysysam je, ale jest to strasznie niepłynne (błyskawicznie po pierwszej klatce wyrywa je z formy kuli, a mi bardziej zależy na płynnym wyssaniu). Jeżeli ktokolwiek zrozumiał ten bełkot to prosiłbym o radę.

Link to comment
Share on other sites

Słabo zrozumiałem ... ale pewnie masz strength na volume axis za duży noi na particlach masz conserve - zmniejsz do 0.98 albo nawet mniej 0.95 albo jeszcze mniej i zobacz czy się coś zmienia. Ogólnie parametr converve działa per substep więc jest mega czuły i poniżej 0.9 to zaczyna się mega ostre hamowanie particli bez sił.

Link to comment
Share on other sites

Troszeczkę kombinowałem z conserve i niestety dalej to samo. W volume axis magnitude mam ustawione nawet na 0.01 i efekt ten sam. Dziwna sprawa.Tutaj screen efektu, o jaki mi chodzi. Może ktoś ma pomysł na inne rozwiązanie. :)2m490.jpg

Link to comment
Share on other sites

Może pokombinuj z drag field. Ustaw bardzo małe oddziaływanie volume axis i ujemny kulisty drag field z ujemnym zanikiem przyśpieszający z czasem cząstki.

 

Samemu volume axis też warto zrobić fade zaniku. Zobacz na obrazku w helpie co zrobi attenuation w połączeniu z invert.

Miękkie wejście w pole siłowe, pewnie tego Ci trzeba.

http://download.autodesk.com/us/maya/2010help/index.html?url=Fields__Work_with_volume_axis_fields.htm,topicNumber=d0e393274

Link to comment
Share on other sites

Hi.

 

Jeżeli chodzi o wszelakie Field'y to uwierz mi wszystko jest w helpie całkiem jasno wytłumaczone :).

Twoim problemem jest wydaje mi się Attenuation które działa na zasadzie: jak bardzo przyłożona siła maleje od centrum volume axis field (jednostką są unity z tego co pamiętam) - oczywiście możesz całość odwrócić poprzez tick w "invert attenuation".

 

Pomoże Ci to wszystko zwizualizować skrót klawiszowy "T" po zaznaczeniu VAF.

 

W połączeniu z Conserve powinieneś dostać efekt który chcesz uzyskać.

 

 

 

Pozdr.

Link to comment
Share on other sites

@MarshallCały czas wertuję helpa, kombinuję na wszystkie sposoby z attenuation i cały czas jest efekt tego wyrywania się ptaków. Pierwsza klatka - żadnej reakcji, druga klatka - nagły zryw ptaków o większą odległość, a następnie działa wszystko tak jak bym chciał.Dla zobrazowania tego zrobiłem szybki playblast:

 

http://www.youtube.com/watch?v=8jn8wni9bmM

Edited by safian
Link to comment
Share on other sites

No po prostu nie wierzę. Robiłem tym samym sposobem, kluczując magnitude i wychodził kicz. Muszę wydedukować to jeszcze raz i zobaczyć co źle robiłem.

 

Mimo wszystko Marshall wielkie dzięki, bardzo mi pomogłeś, a szczególnie uspokoiłeś psychicznie (pokój cały zadymiony ;). Zresztą dzięki wszystkim, którzy próbowali mi pomóc, bardzo mi się podoba, że można na Was liczyć ;).

Link to comment
Share on other sites

Miesiek, jak zauważyłeś masz w Rotation options ustawiony "Aim direction" na "Velocity". Jak się nie ruszają particle Twój wektor Velocity jest zerowy, więc Maya nie zmienia orientacji biektu, który jest skierowany w prawo. Co u Ciebie się dzieje to jak particle się zaczynają ruszać tostają automatycznie niezerowy wektor w lewo i stąd masz to pierdyknięcie, a potem już spokojnie lecą. Jako, że środek obrotu masz "w ogonie ptaka" to masz gigantyczny przeskok.

  • Like 1
Link to comment
Share on other sites

Kolejne odświeżenie, kolejne pytanie :P.W jaki sposób jestem w stanie dać różne kolory, na losowo wybrane ptaki? Powiedzmy mam 5 materiałów i chciałbym, aby każdy ptak losowo miał nałożony jeden z tych materiałów, a co jeszcze ważne - nie zmieniały się w czasie jak to zrobiłem przed chwilą... Teraz w instancerze dodałem po 20 snapshotów animacji ptaka z każdego materiału i właśnie po każdych 20 snapshotach danego koloru ten sam ptak zmienia kolor na następny kolor - chciałbym to zniwelować!

 

Szperając trochę po necie wyczytałem, że w Mai ustawienie losowego shadera z geometrią (tudzież moimi ptakami) jest nie możliwe.

Próbowałem również atrybutem rgbPP, ale nic z tego...

Edited by safian
Link to comment
Share on other sites

W tym sęk, że tak na początku zrobiłem - zrobiłem 5 kopii snapshotów, dałem je wszystkie do instancera i gdy przykładowo przelecą snapshoty o kolorze pomarańczowym to wszystkie potem stopniowo ptaki zmieniają kolor na powiedzmy niebieski, bo są to kolejne snapshoty w kolejce w instancerze. Mi chodzi o efekt, aby każdy ptak miał swój kolor przez całą animację.

 

Są na to jakieś inne sposoby? Ewentualnie jest inny sposób na podłączenie animacji ptaka do cząsteczek od tego ze snapshotami?

Link to comment
Share on other sites

Jakto się nie da - wszystko się da tylko trza by to ładnie oskryptować i na podstawie Id particla zrobić kolejne sekwencje - do zrobienia, ale musiałbyś poskryptować trochę, więc zrób tak jak mówi praetorian - kilka wersji snapshotów z różnymi materiałami.

Link to comment
Share on other sites

Jakto się nie da - wszystko się da tylko trza by to ładnie oskryptować i na podstawie Id particla zrobić kolejne sekwencje - do zrobienia, ale musiałbyś poskryptować trochę, więc zrób tak jak mówi praetorian - kilka wersji snapshotów z różnymi materiałami.
Tak jak mówiłem - po zrobieniu kilku wersji snapshotów ptaki zmieniają kolor, a to jest dla mnie nie pożądany efekt. Aczkolwiek znalazłem inne wyjście z tej sytuacji. Mianowicie cząstki są podpięte pod vertexy sphere. W takim razie zrobię 5 wersji sphere z powycinanymi tak vertexami, aby te 5 wersji tworzyło cały jeden sphere, a następnie do każdego nParticleShape podepnę 5 wersji instancera, gdzie do każdego z osobna podepnę instancera z innym kolorem ptaków.

 

Trochę chaotyczne i pracochłonne, aczkolwiek dzięki temu uzyskam pożądany efekt :). Mimo wszystko dzięki za pomoc.

Link to comment
Share on other sites

Masz tutaj prezent. Jak zaznaczysz jakiś obiekt polygonowy to poniższy kod Pythonowy w jego wertexach stworzy Ci particle. Nie byłoby to Ci za bardzo potrzebne gdyby nie fakt że tworzy on tyle obietków partiklowych ile wpiszesz w parametrze "numberOfCopies". Co więcej, nie stworzy już particla w miejscu gdzie particle już jest. Czyli teraz do każdego obiektu particlowego podepnij sobie teraz swoje animacje z różnymi kolorami i jesteś w domu:

 

import maya.cmds as cmds
import random
import math

objHold = cmds.ls(sl=True)

if (len(objHold)>0):
   numberOfCopies = 5
   allParticleObjs = []

   for counter in range(0,numberOfCopies):
       newPartObj = cmds.particle()
       allParticleObjs.append(str(newPartObj[0]))

   vertNum = int(cmds.polyEvaluate(objHold, v=True ))

   for vertId in range(0,vertNum):
       holdVert = objHold[0] + ".vtx[" + str(vertId) + "]"
       partPos = cmds.xform(holdVert, ws=True, a=True, q=True, t=True)
       particleObject = math.floor(random.uniform(0,numberOfCopies))
       cmds.emit( object=allParticleObjs[int(particleObject)], position=(partPos[0],partPos[1],partPos[2]) )
else:
   cmds.warning("Zaznacz jakis obiekt polygonowy")

 

Wisisz mi piwo :)

Link to comment
Share on other sites

Kurde, stary. Jesteś genialny :), piwo to za mało :d. Tak głupio mi jeszcze narzekać, ale po "go to start of playback range" particle w podglądzie znikają, a w outlinerze są. Wiesz może co się dzieje? Po renderze też ni widu ni słychu partikli.

 

Zauważyłem też, że jak chcę sobie je obrócić atrybutem spriteTwistPP (nParticleShape1.spriteTwistPP = frame *4; ) to nic się nie zmienia.

 

Btw. próbowałem particlesami oraz nParticlesami i to samo.

Edited by safian
Link to comment
Share on other sites

Fakt, źle skonstruowałem pytanie, ale mniejsza. Takie kombinacje były, ponieważ w mojej scenie są już utworzone particle i jak miałem ustawione wszyściutko jak w twojej scenie to moje ptaki migotały - tak jak to już miało miejsce u mnie wcześniej. Zdaje się, że to działa tylko przy emitowaniu cząstek.

Link to comment
Share on other sites

Zdaje się, że to działa tylko przy emitowaniu cząstek.

To bez znaczenia - cała "logika" wyboru cyklu i klatki z cyklu jest w expressions, a to co jest w creation expression i nie działa na nieemitowanych partiklach, można przenieść do runtime expr (zamieniając rand() na noise()). Twoje ptaki migotały (rany, jak to brzmi :) ) pewnie dla tego, że każda cząsteczka przebiegała po każdym cyklu (snapshocie), zamiast w obrębie jednego, wcześniej wylosowanego.

Zajrzyj do expressions, bo mam wrażenie, że zerknąłeś tylko na atrybuty instancera.

  • Like 1
Link to comment
Share on other sites

Twoje ptaki migotały (rany, jak to brzmi :) ) pewnie dla tego, że każda cząsteczka przebiegała po każdym cyklu (snapshocie), zamiast w obrębie jednego, wcześniej wylosowanego.

 

Tak, właśnie przyczyną było to, że po jednym cyklu, instancer od razu leciał do kolejnego, zamiast zostać przy tym jednym. Szczerze mówiąc Panowie byliście moją lekcją podstaw cząstek, więc trudno jakkolwiek było mi samemu z tym walczyć. Kolejny raz wielkie dzięki (ja pierdziele, ile razy już mi pomogliście :) )

Link to comment
Share on other sites

To bez znaczenia - cała "logika" wyboru cyklu i klatki z cyklu jest w expressions, a to co jest w creation expression i nie działa na nieemitowanych partiklach, można przenieść do runtime expr (zamieniając rand() na noise()). Twoje ptaki migotały (rany, jak to brzmi :) ) pewnie dla tego, że każda cząsteczka przebiegała po każdym cyklu (snapshocie), zamiast w obrębie jednego, wcześniej wylosowanego.

Zajrzyj do expressions, bo mam wrażenie, że zerknąłeś tylko na atrybuty instancera.

 

Dopiero zajrzałem do tego co podesłałeś. Jak wywalisz creation expression a w before dynamics przerobisz na:

seed(id);
pS.birdId = int(rand(pS.numOfBirds));
pS.geoId = pS.cycleFrames*pS.birdId + frame%pS.cycleFrames;

 

to będzie lepiej.

 

Co więcej wrzuciłbym numOfBirds i CycleFrames też do tej ekspresji i niech się liczy z automatu i wywalić to z atrybutów shapa - bez sensu trzymać na to oddzielne parametry i zmieniać za każdym razem jak się animacja zmieni. Coś na kształt:

 

$instancerName = "instancer1";
$snapShotObj = "snapshot1";

$st = `snapshot -q -st $snapShotObj`;
$et = `snapshot -q -et $snapShotObj`;
$cycleFrames = ($et[0] - $st[0] + 1);
$numBirds = size(`instancer -q -obj $instancerName`) / $cycleFrames;

seed(id);
pS.geoId = $cycleFrames*(int(rand($numBirds))) + frame%$cycleFrames;

 

Noi generalnie Twoja metoda jest dużo efektywniejsza niż safiank zaproponował, ale skoro safiank zaczyna przygodę z dynamiką to może tę metodę niech na razie nie wykorzystuje, bo chyba za dużo ekspresji w ekspresji :) Ale resp z szacunkiem za optymalizację idzie :D

 

Pozrawiam!

M

 

edit: birdId też jest w sumie nie potrzebne bo jedziemy po id particla :)

Edited by beny
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy