Foam map - vertex colors

Max scripts

Moderatorer: Super Moderatorer, Admins

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Foam map - vertex colors

Legg innav Tronotrond » ons 01 okt, 2014

Å få noe skikkelig foam på vann er alltid en utfordring. Vi har prøvd mye forskjellig her på huset, men så fort man vil ha det dynamisk og følge bølgene så blir det alltid veldig krøkkete og tungt å jobbe med. F.eks. spawne partikler på bølgehøyder.

Jeg begynte derfor i går på et script som gir vertexer over en gitt høyde en farge - og så fader dem ut over tid.
Dette burde brukes til å maske inn foam i shaderen på en ok måte. Dette er VELDIG basic, men hadde vært moro å "spille litt ball" med andre som faktisk kan scripte og se om man kanskje kan komme frem til noe brukbart ;)

Det er et par utfordringer jeg har lyst ttil å se nærmere på, og flott om noen har noen tanker rundt det.

1. Som Maxscript er dette ganske tregt. Et 32x32 plane går ca realtime, men ytelsen synker drastisk fort på større flater.
2. Det går å rendre animasjoner nå lokalt, men siden dette er "time dependent" så må nok dette bakes inn i objektet. Det hadde også vært en løsning på første punkt her. (Teste på lite plane, bake settings på et større)
3. I tillegg til høyde, legge til samme funksjonalitet der bølger "bryter". F.eks. på faces som har stor vinkelforskjell.
4. Hadde vært moro om dette kunne blitt kalkulert på render time displacement, men det er vel umulig..?
5. Andre tweaks?

Her er en video som demonstrerer scriptet
[youtube]http://www.youtube.com/watch?v=90UNERvK5KM[/youtube]


Scriptet ligger vedlagt og foreløpig krever det litt manuelt oppsett.
- Fungerer kun på Edit Mesh
- Bør slå på Vertex Channel Display under Object properties
- Må selecte alle vertexes og gi dem er vertex color for å aktivere vertex color kanalen på objektet..
Du har ikke de nødvendige tillatelsene for å vise filene som er tilknyttet dette innlegget.
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D


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

Legg innav hardrock_ram » ons 01 okt, 2014

Ser interessant ut :). Selve ideen er supernyttig, og opplegget med å bruke vertex color er en god idè. Men som du sier så er den vanskelig å bruke i praksis i øyeblikket ... Lurer på om Havards har noen ideèr ... :roll:
if your not living on a killing ground, you better make your own

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » ons 01 okt, 2014

Ja, er akkurat det om man kan få det brukbart i praksis. Jeg vil tippe å lage det som en plugin kunne gjort susen hastighetsmessig.
Houdini er genialt for slike ting som dette, men fryktelig tungvindt å drive å importere og eksportere scener og modeller hele veien.

Har ikke sett/hørt noe fra Haavards på en stund. Siden hans har vel vært nede siden han fullførste skolen..?
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

Howii
Innlegg: 326
Registrert: tir 21 aug, 2007
Sted: Oslo

Legg innav Howii » ons 01 okt, 2014

1. Min første tanke er å sette vertexcolor basert på høyde (y i maya- z i max?) kan du vel droppe, om det er shader det skal ende i. Da kan du vel likegodt bruke P i shadern og gjøre en selection der, for så å gjøre en ramp/bruke fractals osv on top, for å få en foam-area-maske, om det er dit du vill. Og så scatre ut projiserte foam-maps eller whatever.

For å dekke 3. punkt kan du i tillegg adde inn en sjekk på normal om den er steep, eller nabo normaler har stor forskjell eller noe sånt.

4. fungerer jo i utgangspunktet, siden det allerede skjer i shader.

Kjapt lite gjennomtenkt svar, så heller ikke videoen du posta, så du får ta mine skribler med en klype salt. Uansett er det en intressant utfordring :)
3d generalist - Storm Studios

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » ons 01 okt, 2014

Howii:
Måten du nevner fungerer til enkelte ting, men vil ikke oppføre seg som skum på havet. Din metode vil få foamet gradvis "inn" mens bølgen er på vei opp.. Og forsvinner like gradvis når den er vei ned. Atså en ren høyde-maske.

Skummet lages som regel helt på topp av bølgen eller i brytningen og blir liggende igjen selv om bølgen "drar videre".
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » fre 03 okt, 2014

Veldig kult så langt! Jeg har noen ideer, skal se om jeg ikke får testet ut litt i helga.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet
http://folk.ntnu.no/havardsc/site/wordpress/

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » lør 04 okt, 2014

Ok sweet! :D/
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » man 06 okt, 2014

Skrev gradeCallBackMesh på nytt gjennom .net-sdk'en og da takler den betydelig større mesher. Kjørte stabilt 15 fps på en ~60k mesh noe som er ~60x improvement på 32x32 meshen. Skulle prøve orginalscriptet på samme 60k-mesh og da hang max seg :) Kan poste kode etter jobb i morgen.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

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

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » man 06 okt, 2014

Ok! Gleder meg til å se/teste det :D
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

larsem8
Innlegg: 1506
Registrert: ons 09 nov, 2005
Sted: Kristiansand

Legg innav larsem8 » man 06 okt, 2014

Synes bare det ser ut som skummet flyttes sammen med bølgene når du har det aktivt? Som om vannmolekylene følger med bølgene..

Men det blir kanskje annerledes når det er shadet :)
Alle gode ting er 3D

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » man 06 okt, 2014

Her er sdk-kodesnutten. Ikke store greiene:

Kode: Velg alt

using Autodesk.Max;
using Autodesk.Max.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FoamMapUtils
{
    public class VertexColorGrading
    {
        IGlobal global;
        IInterface14 ip;
        IINode node;

        public int Channel { get; set; }
        public float HeightThreshold { get; set; }
        public float FadeInValue { get; set; }
        public float FadeOutValue { get; set; }

        public VertexColorGrading(uint nodeHandle)
        {
            try
            {
                global = GlobalInterface.Instance;
                if (global == null)
                    throw new ArgumentNullException("Global");
               
                ip = global.COREInterface14;
                node = ip.GetINodeByHandle(nodeHandle);
                if (node == null)
                    throw new Exception("Invalid node handle");
               
                /*
                triMesh = node.ObjectRef as ITriObject;
                if (triMesh == null)
                {
                    IIDerivedObject iDerived = node.ObjectRef as IIDerivedObject;
                    if (iDerived != null)
                        triMesh = iDerived.ObjRef as ITriObject;
                    if (triMesh == null)
                        throw new Exception("Object is not a tri mesh");
                }
                */
                Channel = 0;
                HeightThreshold = 5;
                FadeInValue = 60;
                FadeOutValue = 5;
            }
            catch (Exception e)
            {
                if (global != null)
                    global.TheListener.EditStream.Printf(e.ToString() + Environment.NewLine);
            }
        }

        public void GradeMesh()
        {
            IObject obj = node.EvalWorldState(ip.Time, true).Obj;
            IClass_ID cid = global.Class_ID.Create((uint)BuiltInClassIDA.TRIOBJ_CLASS_ID, 0);
            if (obj.CanConvertToType(cid) != 0)
            {
                ITriObject triMesh = obj.ConvertToType(ip.Time, cid) as ITriObject;
                IMesh mesh = triMesh.Mesh;
                IList<IPoint3> mapVerts = mesh.MapVerts(Channel);
                int numMapVerts = mesh.GetNumMapVerts(Channel);

                for (int i = 0; i < numMapVerts; i++)
                {
                    IPoint3 vertex = mesh.GetVert(i);
                    IPoint3 mapVert = mapVerts[i];

                    float r = mapVert.X * 255.0f;
                    float g = mapVert.Y * 255.0f;
                    float b = mapVert.Z * 255.0f;

                    if (vertex.Z > HeightThreshold)
                    {
                        float newG = Math.Max(0, (g - FadeInValue) / 255);
                        float newB = Math.Max(0, (b - FadeInValue) / 255);

                        mesh.SetMapVert(Channel, i, global.Point3.Create(1, newG, newB));
                    }
                    else if (g < 255)
                    {
                        if (g + FadeOutValue > 255)
                            mesh.SetMapVert(Channel, i, global.Point3.Create(1, 1, 1));
                        else
                            mesh.SetMapVert(
                                Channel, i, global.Point3.Create(
                                    1, (g + FadeOutValue) / 255, (g + FadeOutValue) / 255));
                    }
                }
            }
        }
    }
}


tilhørende maxscript:

Kode: Velg alt

(
   global VertexColorHeightAnimator
   (
      struct VertexColorHeightAnimatorStruct
      (
      private
         vertexColorGrading,
         opened = false,
         callbackId = #VertexColorHeightAnimatorTime,
         dllPath = @"E:\Visual Studio Projects temp\FoamMapUtils\FoamMapUtils\bin\Debug\FoamMapUtils.dll",
      
      public
         dialog =
         (
            rollout dialog "VertexColorHeightAnimator"
            (
               fn pickFilter obj = canConvertTo obj Editable_mesh--classof obj == Editable_mesh
                  
               pickbutton pbPickObject "Pick object" align:#right filter:pickFilter
               spinner spnHeightThreshold "Offset" range:[-1e4, 1e4, 0] enabled:false align:#right
               spinner spnFadeIn "Fade in" range:[0, 255, 60] enabled:false align:#right
               spinner spnFadeOut "Fade out" range:[0, 255, 5] enabled:false align:#right
               checkButton cbActiveTimeCallback "Enable" enabled:false align:#right
               
               on spnHeightThreshold changed val do
                  (VertexColorHeightAnimator.getVertexColorGrading()).HeightThreshold = val
                              
               on spnFadeIn changed val do
                  (VertexColorHeightAnimator.getVertexColorGrading()).FadeInValue = val
               
               on spnFadeOut changed val do
                  (VertexColorHeightAnimator.getVertexColorGrading()).FadeOutValue = val
               
               on cbActiveTimeCallback changed isChecked do
               (
                  if isChecked then
                     VertexColorHeightAnimator.addTimeCallback()
                  else
                     VertexColorHeightAnimator.removeTimeCallback()
               )
               
               on pbPickObject picked obj do
               (
                  if classOf obj == Editable_Mesh or querybox "Convert to mesh to continue" then
                  (
                     if classOf obj != Editable_Mesh then
                        convertTo obj Editable_mesh
                     
                     pbPickObject.text = obj.name
                     cbActiveTimeCallback.enabled = true
                     spnHeightThreshold.enabled = true
                     spnFadeIn.enabled = true
                     spnFadeOut.enabled = true
                     
                     obj.showVertexColors = true
                     
                     VertexColorHeightAnimator.createVertexColorGrading obj.handle
                     meshop.setMapSupport obj \
                        (VertexColorHeightAnimator.getVertexColorGrading()).Channel true
                  )
               )
               
               on dialog open do VertexColorHeightAnimator.open()
               on dialog close do VertexColorHeightAnimator.close()
            )
         ),
         
         fn getVertexColorGrading =
         (
            vertexColorGrading
         ),
         
         fn addTimeCallback =
         (
            print "Adding time callback"
            registerTimeCallback VertexColorHeightAnimator.gradeMeshCallback
         ),
         
         fn removeTimeCallback =
         (
            print "Removing time callback"
            unregisterTimeCallback VertexColorHeightAnimator.gradeMeshCallback
         ),
         
         fn addRenderCallback =
         (
            print "Adding render callback"
            callbacks.addScript #postRenderFrame "::VertexColorHeightAnimator.gradeMeshCallback" id:callbackId
         ),
         
         fn removeRenderCallback =
         (
            print "Removing render callback"
            callbacks.removeScripts id:callbackId
         ),
         
         fn createVertexColorGrading handle =
         (
            vertexColorGrading = dotnetObject "FoamMapUtils.VertexColorGrading" handle
         ),
         
         fn gradeMeshCallback =
         (
            print "Setting vertex colors.."
            vertexColorGrading.gradeMesh()
         ),
         
         fn open =
         (
            print "Opening"
            addRenderCallback()
            opened = true
            createDialog dialog
         ),
         
         fn close =
         (
            print "Closing"
            removeRenderCallback()
            opened = false
            destroyDialog dialog
         ),
         
         on create do
         (
            dotnet.loadassembly dllPath
            
            if isStruct VertexColorHeightAnimator do
               VertexColorHeightAnimator.close()
         )
      )
      VertexColorHeightAnimator = VertexColorHeightAnimatorStruct()
      OK
   )
)
VertexColorHeightAnimator.open()


Maxscriptet er basically det samme som du hadde, bare byttet ut den gradCallback-funksjonen med et kall til .net-objektet sin metode i stedet. Mekket også scriptet slik at du bare har 1 global slik at du ikke poluter max med å deklarere alt som global, jeg er ganske nazi på slike ting 8-) Da er det bare å endre pathen til .dll-fila i structen og kjøyre på.

For øyeblikket er det lekker scriptet en del minne, men det skal jeg prøve å få fikset. Er ikke så godt kjent med sdk'en enda.
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

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

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » ons 08 okt, 2014

Har du en kjapp (om det i det hele tatt er mulig) måte å få compila dette riktig til en dll? Jeg har satt opp visual studio, men får ut .GUP e.l. litt utfra hvilken 3dsMax plugin type jeg velger..

Er også helt fersk i SDKen, så mulig jeg bare er helt på villspor :-k
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

havards
Innlegg: 211
Registrert: ons 13 des, 2006

Legg innav havards » ons 08 okt, 2014

Siden det skrevet i .net-api'et så er det litt enklere. Du lager bare et nytt C#-prosjekt, .net-versjon 4.0. velg class library som type og refererer inn Autodesk.Max.dll som ligger i root-mappa til max. Når du da bygger så vil du få ut ei .dll-fil.

Du lager basically bare en vanlig biblioteksfil uavhenging av max, noe som er veldig digg og fleksibelt. Max leser .net-biblioteker og har full støtte for det i maxscript. Om du skulle ha gått c++-sdk-veien så måtte du eksplisitt ha definert hva du vil skal være synlig i maxscript og alt annet hazzle som kommer med det. På jobb så sitter vi både med c++ og .net-sdk'en til autocad/civil3d og jeg er ca 1000 ganger mer produktiv når jeg skriver mot .net-apiet, så jeg foretrekker det i max også :)
02:14 Misfortune • hun skjuler så jævlig mye i smutthølet

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

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » ons 08 okt, 2014

Aaaah! Hehe, faktisk enklere enn jeg forventa! Takker!
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D

Brukeravatar

Trådstarter
Tronotrond
Innlegg: 3748
Registrert: lør 29 okt, 2005
Sted: Houston, TX
Kontakt:

Legg innav Tronotrond » ons 08 okt, 2014

Noe kjappere, ja! hehe.. Vel, at det er så enkelt å jobbe i .net mot Max visste jeg ikke. Det forandrer jo en hel del. Jeg må jobbe litt for å få dette mere realistisk, men jeg har noen planer og tanker i bakhodet.

Takk så mye for hjelpa!

[youtube]http://www.youtube.com/watch?v=iw0t_W_k7XA[/youtube]
TD/Technical Animator, Corporate Marketing - National Oilwell Varco, Houston, TX
Freelance 3D/VFX Artist - Hille3D


Gå tilbake til «Max scripts»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 1 gjest

cron