Vanskelig teknisk problem

Max scripts

Moderatorer: Super Moderatorer, Admins


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Vanskelig teknisk problem

Legg innav hardrock_ram » ons 19 sep, 2012

Jeg lager bilrigg, og tenkte å få bilen til å oppføre seg relativt korrekt. Bilen skal følge en path. Forhjulene skal følge pathen nøyaktig, mens bakhjulene skal følge fysisk korrekt bane, dvs. at de tar innersvinger i forhold til forhjulenes spor.
SK_pathfølger_foran er objektet som følger linja nøyaktig, altså forhjulene. SK_pathfølger_bak er bakakslingen. Bilens akselavstand er 545.475 units.

Koden er lagt inn i en scriptkontroller i et tredje objekt:

Kode: Velg alt

if currentTime >0 then
(
   dist = (distance SK_pathfølger_foran.pos SK_pathfølger_bak.pos) - 545.475
   retning = normalize (SK_pathfølger_foran.pos - SK_pathfølger_bak.pos)
   vektor = retning * dist
   SK_pathfølger_bak.pos = SK_pathfølger_bak.pos + vektor
   SK_pathfølger_bak.dir = retning
   SK_pathfølger_foran.dir = retning

)
else
(
   SK_pathfølger_foran.rotation = (quat 0.707107 0 0 0.707107)
   SK_pathfølger_bak.transform = (matrix3 [1,0,0] [0,0,1] [0,-1,0] [0,304.848,500])

)

[ 0, 0, 0 ]


Problemet er at skalaen på objekter blir forandret. Her er "svaret" jeg får når jeg spør om alle skalaen på aktuelle objekter:

Kode: Velg alt

"SK_pathfølger_foran"
[1.00001,1.00001,1.00001]
"SK_pathfølger_bak"
[1.00001,1.00001,1.00001]


Dette forplantet seg naturlig nok til objekter som var linket til disse. Det jeg gjorde da lage et mellomobjekt som har position- og orientation-constraint til SK_pathfølger_XXX, altså IKKE linket. Som en ekstra precaution la jeg inn SK_pathfølger_XXX.scale = [1,1,1] i scriptet. Problemet er at ALLIKEVEL rapporteres det at objektene som er linket til mellomobjektene ikke har scala [1,1,1], men når jeg spør om hva de har som scala, så får jeg [1,1,1] til svar. Har noen peiling på hva som foregår her i det hele tatt? :roll:
if your not living on a killing ground, you better make your own


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » lør 22 sep, 2012

Noen? (havards?) :roll:
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » lør 22 sep, 2012

Post en test-scene da:)
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet
http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » lør 22 sep, 2012

Problemene mine er skaleringsproblemene som er nevnt. Jeg bruker de nevnte mellomobjektene med position- og orientation constraint, pluss at jeg ber de om å sette skalaen til [1,1,1] for hvert skifte av frame. Jeg tror det går fint ... du kan uansett spørre etter alle objekter i scenen med avvikende skala og se hva du får som resultat. Pass på å beveg timeslideren og herje litt i scenen først ;)

Videre har jeg problemer med å kjøre do-while loops i script kontrolleren. Programmet henger seg opp. jeg har lagt inn en sjekk for å kjøre loopen maks ti ganger, jeg har puttet all koden fra forskjellige kontrollere inn i samme, fjernet objekter de begge delte på lista med variabler osv, uten resultat.

Tanken er at pathfølgerne følger linja, mens raySendere sender rays som treffer terrenget. bakkefølgerne plasseres på intersection. For å ta hensyn til tilting av bilen forskjellige retninger så sendes det først ut en stråle. Det regnes ut en sinus-verdi og raySenderen plasseres slik at hjulene beholder korrekt akselavstand og bredde. Fordi terrenget kan variere (humper, ujevnt osv.) så gjøres hele sjekken på nytt, enten maks ti ganger, eller når akselavstanden er innenfor en viss feiltoleranse.
venstre_foran_bakkefølger (venstre forhjul) er utgangspunktet som de andre skal justere seg etter, og høyre side skal justeres etter venstre.
Koden ligger i trasform-kontrollere til ctrl_super. Det er kun de nevnte objektene som er i bruk. Resten av sceneobjektene er bare klare til senere.

Hele denne løsningen (selve koden og at jeg har lagt scriptkontrollerne i et tredje objekt) synes jeg er utrolig uelegant, men det er så langt kunnskapsnivået mitt rekker ... :( Helt topp å få hjelp da! ;)

EDIT: Fjernet fil
Sist redigert av hardrock_ram den tir 25 sep, 2012, redigert 2 ganger totalt.
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » lør 22 sep, 2012

While-loopen din må ha

Kode: Velg alt

(distanse>1 or distanse<-1 and whileStop >0)
som condition.
Da funker de utkommenterte controllerne (de krasjer ikke - jf. uendelig loop som låser controlleren) - aner ikke om de gjør det du vil da.
Dunno hva som endrer scalen på de objektene, men det virket som det løste seg når du setter scalen eksplisitt slik du gjør i den første controlleren. Du kan jo evt si at linkede objekter ikke skal arve scalen.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 sep, 2012

Ja, det med skalaen ser ikke ut til å lage noen problemer. Det som plagde meg er når det skjer noe som man ikke vet HVORFOR skjer, så kan det plutselig bli et problem i en helt annen anledning senere ...

while-loopen skulle selvfølgelig ha "and". Det var sløvt av meg ...

takk for hjelp så langt! :)
Sist redigert av hardrock_ram den søn 23 sep, 2012, redigert 1 gang totalt.
if your not living on a killing ground, you better make your own


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » søn 23 sep, 2012

Når den første pathfølgeren beveger seg for raskt så skråner den bakerste pathfølgeren helt ut på en rar måte. hvis jeg senker hastigheten så skjer ikke dette ... veldig rart. Vet du hva dette kan skyldes? Jeg er litt skeptisk til at dette skjer mtp. bilens hastighet i en eller annen animasjon ... Jeg legger ved en fil som har problemet (til_3dhue_2). Det skal bare være å bevege slideren så ser du. Det snåleste er at noen ganger fungerer det når jeg beveger slideren frame for frame, men forandrer jeg litt på pathen så fungerer kanskje ikke det, men da fungerer det når jeg bare trykker play og lar den gå.
Det er akkurat som at den ikke alltid rekker å kjøre hele scriptet før den går videre til neste frame. I fila "til_3dhue_3" skjer nesten det samme. Hvis du trykker play og lar den gå i loop, så ser du at den på frame 0 ikke resetter posisjonen til pathfølger_bak, slik det står i scriptet at den skal gjøre. :?

Jeg tenker at jeg må tvinge fram en oppdatering på hver frame eller noe ...?

Det blir mange spørsmål her, men dette er såpass teknisk at jeg ikke finner noe om det på google ... :(

EDIT: Fjernet fil
Sist redigert av hardrock_ram den tir 25 sep, 2012, redigert 2 ganger totalt.
if your not living on a killing ground, you better make your own

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » man 24 sep, 2012

Jeg kan ikke så mye om rigging sånn generelt og lite om script controllers. Men huk av realtime i Time configuration, da slipper max å skippe frames for å opprettholde riktig speed og jeg tror du får evaluated alle controllerne riktig da, med litt lavere framerate som tradeoff så klart. Printing til listeneren er også med å sakke ting ned.

Sånn ellers ville jeg kanskje ha skrevet controllerne i et maxscript som en struct. Så lager du en global instans av structen som du kaller på i scriptcontrolleren. Da blir det litt enklere å holde styr på alt som skal skje.

F.eks:

Kode: Velg alt

struct myCarRigStruct
(
    leftWheel,
    rightWheel.
    ...,
    myCarVariableN,

    fn handleLeftWheel arg1 arg2 .. argN =
    (
        -- gjør stuff med et hjul her f.eks
    ),

    fn handleAllWheels =
    (
        ...
    ),
    osv
)

global carRig01 = myCarRigStruct
carRig01.leftWheel = $Wheel001
osv..


Så i CTRL_super kan du nå ha 1 script controller der du kaller på structen og de metodene du vil kjøre:

Kode: Velg alt

::carRig01.handleLeftWheel arg1 arg2
::carRig01.handleAsianDrivingSkills asian
::carRig01.myFunction()
[0, 0, 0]


Du kan i stedet for å ha det i et controller objekt registrere funksjonen i et timecallback.

Men snasen rig så langt da. Skal du legge til suspension, drift m.m?
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

http://folk.ntnu.no/havardsc/site/wordpress/


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » man 24 sep, 2012

Ja, å ha koden i en struct har jeg tenkt på selv også. Jeg vurderer å flytte alt over når det fungerer sånn noenlunde. Litt bedre å skrive i editoren enn i scriptkontroller-vinduet også ... Jeg får se hva jeg gjør. I prinsippet liker jeg at alt ligger i scenen uten å være avhengig av globale variabler eller callbacks som må lastes inn.

Ang timeCallback så kjøres ikke det under rendering. Da må animasjonen isåfall bakes. Videre blir det en ganske grov metode å animere på, siden man ikke får realtime feedback. Jeg har en testrigg jeg lagde hvor man kjører rundt i viewport og styrer med slidere. Den følger terrenget samtidig som timeslideren går. Det ser jo litt kult ut, men er egentlig ganske ubrukelig.

Takk for skryt av riggen ellers :). Jeg får se hva jeg legger inn av ting og tang. Drift må selvsagt til, men jeg tror nok at det blir manuell (håndanimert) drifting. Suspension blir det naturlig pga. riggoppsettet, men jeg skal prøve å ta i bruk spring controller i tillegg som prikken over i-en :)

Problemet mitt er at jeg ikke liker terrain-following systemet mitt i det hele tatt. Jeg burde sende ut rays rundt nedre halvdel av hjulene isteden, og kalkulere hvor høyt hjulet skal løftes basert på vektor dot produkt utifra rayen og terrengpolygonens normalvektor eller noe slikt. Problemet er at jeg enda lærer maxScript og jeg suger i matte, så jeg valgte den enkleste løsningen :P. Problemet mitt nå er at hjulene ikke kan treffe skarpe kanter, da vil første halvdel av hjulet gå inn i kanten, fordi den enda ikke er detected av rayen jeg sender ovenifra. I går så jeg DENNE på yputube. Terrain follow på siste halvdel av den videoen er mye mer nøyaktig enn mitt. Det er heller noe slikt jeg burde ha.

EDIT: Når jeg tenker på det så trenger jeg jo egentlig bare å sende rays rett ned fra raySenderene i et rektangel som tilsvarer hjulenes bredde og diameter, og be om den med den høyeste Z-verdien ... Hvordan er det mulig å være så idiot at jeg kom på det først nå? :P
Fjernet dessuten filene som var lagt ut. De inneholdt masse feil i scriptet ellers. Kan heller legge ut en ny siden.
if your not living on a killing ground, you better make your own


Gå tilbake til «Max scripts»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 1 gjest

cron