Cursos e Bibliotecas Ver Mais

Galeria 3D1 Ver Mais

Bona Studio 3D   Jaraguá do Sul/SC - Brazil - SC
Helio Lima   Taubaté - SP - SP
Bona Studio 3D   Jaraguá do Sul/SC - Brazil - SC
rafazenidesign   Bento Gonçalves, RS, Bras - AC

Portfólios Ver Mais

claudiosdr   Brasil - CE
Jhonatan   Campo Mourao - PR
Leandro Fernandes   Londrina/Curitiba - PR

Expressions avançado (Controller e Wire parameters)

Por: alysson  

Em: 04/10/2013 13:31

Bom dia pessoal, interrompi um pouco meus estudos de reaction manager pra tentar aprender um pouco sobre expressions.

Estou testando um caso parecido quando um carro estaria em movimento com suas rodas girando com wire parameters associado a um Dummy ou shape master de movimento, e de repente preciso ir desacelerando o giro do pneu na medida que sai do chão, para o caso fictício de um carro híbrido que voa. Como a aceleração é muita ainda fora do solo, pensei em complicar mais um pouco fazendo ela parar a partir de uns 5m do solo por exemplo e recolhendo na horizontal pra um vôo. É um estudo de caso pra aprender como se insere a expressão condicional.

Eu fiz uma roda que por wire parameters é girada pelo movimento em x de un dummy. Apliquei a fórmula de RAIO x 2 x pi x 360 / comprimento do arco (depois corrijo a formula, pois não tenho certeza).

Com isso ela funciona perfeitamente, porem se sai do chão, ela continua girando. Por reaction manager e até por aplicação direto no track view na animação, consegue isso fácil. Porém quero um rig que funcione com total controle.

Como tem essa possibilidade de aplicar o wire parameters em float list e ter junto outro float expression, estou estudando isso.

No help do max tem as funções, assim como no proprio controler.

Eu precisava entender como o max vai ler a seguinte condição.

Roda_rotacao=ArcLenght, if (dummy_altura<=5m)
Roda_rotacao=0, if (dummy_altura>5m)

Já vi algumas fórmulas, como na esteira de um tanque de guerra, onde a fórmula era o comprimento do giro retificado/comprimento da esteira esticada. Muito simples, onde com 3 variáveis scalar, cruza as fórmulas e funciona perfeitamente.

Mas no meu caso, só precisava entender como o mas precisa ler essa fórmula condicional acima.

Alguém pode me ajudar a raciocinar isso?

Até agora parei no help, onde ele diz que a fórmula condicional é formada pela expressão: if(p,q,r), onde p é nonzero.

Estou pesquisando a respeito.


Legal esse negócio aí.. C poderia fazer um video depois mostrando esse conceito :)..


Vê se não dá pra fazer com o Float Motion Capture.. Com MIDI por exemplo eu sei q dá (q eu fiz sem querer uma coisa q n parava de girar..).. Mas aí entra a questão de um botão ou fader com sensibilidade de pressão/velocidade, então n sei se dá pra fazer o mesmo com joystick ou um botão de teclado (teclado do pc)... Por exemplo, c põe com wire parameters e o mestre do wire c riga de motion capture e no caso do midi (pegando a velocidade/pressão do controle) c deixa o máximo do parametro como um valor meio baixo (q ele vai dar aquela rotação \'a cada sample do motion capture\') e o minimo com zero... Então.. aí por exemplo, se vc apertar com mais força a roda vai girar mais rapido.. se apertar com menos força a roda vai girar mais devagar, se largar o botão a roda vai parar.. :)..


Aliás, talvez c já até tenha feito esse controle, mas não deu pra \'sentir\' ele né.. q o rig sem motion capture não é animado q nem um com.. Aí.. sei lá.. como não dá pra mexer em controladores (normalmente) enquanto está se dando play na animação (como ocorre no motion capture) as vezes c já fez esse controle e não \'sentiu\' ele pq não é um uma transformação simples e sim uma \'transformação ao quadrado\', ou seja, aceleração e desaceleração.. Não dá pra \'sentir\' um controle desse sem estar usando e dando play ao mesmo tempo (usar o controle com a animação rodando).. =DDD..(se o motion capture não desse play pra gravar, não existiria movimento... hehe)..


Mas manjando de expressões matemáticas, acho q dá pra fazer direto no wire.. Aí no caso o \'float\' seria gerido por uma expressão né..


@edit:

Alias... isso é só uma ideia q eu tive agora.. Sabemos que a aceleração e a desaceleração são o quadrado do valor do movimento né.. Então.. Por exemplo se eu:

-Crio um helper, chamo ele de \'acelerador\'
-Zero ele (dou Freeze Transform...)
-Dou o wire de parametros do helper pra roda, da posição Z do helper pro giro da roda.
-Só que na expressão (logo abaixo das janelinhas dos objetos) eu ponho a posição em Z ao quadrado.. (\"Z position * Z position\")..


Teoricamente, se vc subir a roda acima de Z=1 a roda vai acelerar, e se vc descer a roda abaixo de Z=-1, a roda vai desacelerar.. Isso é teorico :)...



A Beleza está entre a Ética e a Razão!..
Rapaz...pode ser uma ótima solução esse negocio do controle ao quadrado. Eu só estou avaliando diversas possibilidades pra pegar estudos de caso complexos e aprender bastante sobre expression, e até para saber até onde eu preciso montar script via Window Listener do maxscript, ou um script completo salvo e carregado através de um arquivo externo, ou expressiona via float expression, ou expression direto no wire, ou simplesmente rigs simples com constraints de movimento e rotação associados com IKs e controles de movimento com limits. Sempre pensando no método mais simples para o mais complicado.

Como maxscript tem muito material de estudo, estou preocupando mais com expressions, que achei pouca coisa e de pouca complexidade pra estudar.

Certamente quero aprender à risca as possibilidades matemáticas e físicas proporcionadas pelo expressions. Pra isso, vou até procurar amigos formados em matemática e engenheiros que conheço, pra me auxiliar em cálculos avançados que não tenho muito hábito.

Vou levar esse tópico paralelo pra avançar nessas questões e aprendermos um pouco mais. Pelo visto são poucos curiosos no fórum e de pouca vontade pra pesquisa, pois sei que tem muita gente fera por aí.

Agradeço muito a sua presença aí novamente, Fox.

Estarei digerindo diariamente esse assunto também.

Sobre o motion capture, vou relembrar algum teste que fiz antigamente com seu tutorial. Talvez pode me abrir a mente pra visualizar outras possibilidades complementares.
Então... Logo antes de eu dormir eu testei esse do valor ao quadrado logo na expressão do wire.. Deu certo =D.. Ele acelera pra um lado, se vc voltar desacelera, e se vc baixar ele faz a mesma coisa pro outro lado também (faz o mesmo de ré)..

Hehe, se usar esse de acelerar+desacelerar dá pra fazer um motor de maquina de lavar bem facil hehehe...

Mas imagino que dê ainda mais certo se usar uma formula da fisica mesmo (as formulas do \'MUV\' (movimento uniformemente variado)..



Legal q com esse tipo de coisa dá pra automatizar movimentos complexos repetitivos (ex:andar).




A Beleza está entre a Ética e a Razão!..
Então véio.. Fui repetir o q eu fiz ontem... Ou alguma coisa saiu bem errado ou eu tive muita sorte ou observei de maneira equivocada ontem... Esquisito, q eu me lembro q dava certo (na verdade, ou deu certo ou deu pra me enganar hehe..)


Mas então tentei replicar e acabei aprendendo mais um pouquinho...


A formula pra um controle de \'acelerador\', de um jeito bem facil:
(Um nome mais perfeito pra isso é chamar de Controlador de Movimento Uniforme, pq vai \'acelerar\' ou \'desacelerar\' quando vc subir ou descer o controle.. se deixar o controle parado em um lugar sem ser o Zero a estrela vai ficar girando numa velocidade constante (c tem q dar play pra testar de maneira efetiva XDD)
(a imagem postada é isso)
(dá literalmente pra brincar de acelerador com um botão ou fader agora =DDD)

(Acelerador)+T*Acelerador/Potencia
( ( ( que é igual à rotação em Z ) ) )

\"Acelerador\" = Posição Z do helper controlador de velocidade. (criado como \'escalar\')
\"Potencia\" = Constante ou outro valor (daria pra por... marchas .. hehe) pro giro máximo.(é como a sensibilidade do acelerador.. quanto mais alto o valor, mais fraco vai ser o giro por segundo)
\"T\" = O tempo do proprio 3ds..



Dessa maneira funciona legal um acelerador, e dessa funciona mesmo q eu testei aqui algumas vezes.. hehe... Esse esqueminha fez o seguinte:
-A altura do helper (Z.Pos) controla a velocidade do giro (Z.Rot) da estrela amarela.. O quão mais alto tiver o helper, o mais rapido a estrela girará, movimento gera aceleração e desaceleração.. Se o helper for pra zero, a estrela para.. Se o helper for pra baixo, \'dá ré\'.. :)..

(evidentemente q dá pra ao invés de ser o Z.Pos de um helper poderia ser um valor de Attribute Holder, etc.. esse eu fiz pra ser rapido e simples mesmo q eu tive q tentar varias vezes heheh)


Já pra essa raposa q eu to fazendo vou tentar fazer um \'auto-step\' com coisa derivada disso.. (tipo.. se eu aperto um botão fraquinho ele anda devagar, se eu apertar um botão forte ele anda rapido.. Aí se eu aumentar um fader o passo vai ser maior, se eu diminuir o fader o passo vai ser menor =D)..





A Beleza está entre a Ética e a Razão!..
Nossa cara, [:o] \\*/\\*/\\*/\\*/\\*/

To espantado, a especulação gerou até técnicas legais aí pra personagem. Muito bom mesmo.

A solução parece perfeita. Estava até olhando um livro Bible do max 2012, vi muita coisa de rig lá. Talvez pudesse ter algo de expression no sentido condicional que estava buscando. O seu já está com as fórmulas condicionais integradas em uma só de maneira direta.

Vou tentar buscar algumas coisas alternativas nessa linha pra melhorar o repertório de expression.

Foi perfeito, arrebentou mais uma vez.
É.. hehe.. Então.. Puramente ao quadrado dá erro pq o resultante de uma elevação ao quadrado sempre vai ser positiva né.. XD..

E aprendi q parâmetros diferentes tem, meio q, naturezas matemáticas diferentes.. Por exemplo, determinadas coisas não tem valores negativos e tal... E essa questão radial do angulo, e essa transposição q vc fez entre posição e rotação q eu nem entendí direito ainda.

Eu queria ver também se dá pra aplicar ou um ou outro controller, e também se dá pra aplicar um E/ou ou outro controlando interativamente o % aplicado de cada controller..
(eu tenho uma noção muito vaga de que isso é possivel com expressões.. aliás eu imagino que dê sim pra fazer com expressões.. Mas não formei a lógica disso ainda na minha mente XD)..(errr... acho q talvez float list já faz isso né heheuheuhuehe XDD)
A Beleza está entre a Ética e a Razão!..
Pois é. Estou tentando também inserir isso na mente com maior clareza.
Se eu conseguisse lembrar todas fórmulas matemáticas possíveis, tentaria logo de cara essas situações e/ou, >=, <=, etc.
Mas estou buscando auxílio.
Nessas próximas duas semanas vou dedicar um pouco mais nisso, e buscando ajuda de matemáticos, físicos e engenheiros.
E estou percebendo se conseguir fazer uma lista de situações, você não vai só inserir dados diretos de movimentos puros, como em poses inteiras de personagens hein. To na expectativa...
É... aquela segunda formula tava errada também... Mas engana de maneira bem mais efetiva que a primeira.. hehe..

Aquela formula não prevê a aceleração e a desaceleração D=...


Fiz uma outra aqui, um pouco diferente.. Nessa, o campo dinâmico da quantitade de giro (o quão cada 1 do acelerador vai girar) é determinado pela altura de outro helper (poderia ser um valor fixo nesse caso...)

Bom... Esse FUNCIONA =D.. FUNCIONA MESMO... XDD

O \"cambio\" vai dizer meio q a potencia do \"acelerador\"...

Testa aí, baixa com esse link.. Tá animado com um exemplo tosco.. A formula c vê no z rotation dele lá no painel Motion:

http://www.filedropper.com/accel







Bom.. o q eu tava falando de \'auto-step\' ia ser tipo o seguinte... Isso é teórico, mas, agora percebo que de fato é bem provavel que dê certo sim:

-Tem o controlador da \'pegada\' (um controlador q tem o desenho de uma pegada.. q vai dizer onde o pé vai estar, etc..).
-Congelando frames de uma animação da raposa andando, vou ver a curva que as patas fazem no movimento de andar.
-Vou criar uma spline baseada nessa curva.
-No meio desse spline eu coloco um helper.
-Linko a \'pegada\' (o controlador do pé... eu costumo chamar de \'pegada\') ao helper q tá no meio da spline.
-Path Constraint da pegada à spline
-Aplico esse controle de aceleração ao helper q tá no meio da spline


(Cara, logo enquanto eu tava escrevendo eu já percebí equivocos nessa linha de raciocinio acima.. Mas a nivel de uma explicação de algo que eu ainda não fiz tá até q bom hehe.. )


E é isso aí.. Então.. Quando eu levantar o \'acelerador\', o personagem vai andar.. Mais rapido ou mais devagar dependendo do quão alto está o \'acelerador\'... Se eu puzer um Float Motion Capture com MIDI por exemplo, pela pressão, quanto mais forte eu apertar um botão, mais rapido o personagem vai andar... Claro que, eu poderia por num fader, aí eu teria a vantagem de deixar o fader parado (e o botão tem a vantagem de ir e voltar =D)..

...E... (pensei nisso agora =D)
Se criando uma spline \'máxima\' (com um helper pra segui-la), e uma spline \'minima\' (com um helper pra segui-la), ao invés de dar path constraint na pegada, seria outra expressão (ou uma alteração, numa só expressão agora um pouco mais complexa), onde, ao invés de ter o giro, teria a posição de dois helpers andando (de path constraint) por 2 splines, e a posição final da \'pegada\' seria uma interpolação entre esses 2 valores.. Então (aí acho q ia ter q criar outro helper pra dizer .. O controle dessa interpolação seria feito por outro \'helper\' (ou atributo de attribute holder)... Basicamente, a pegada ficaria na \'media ponderada\' entre o helper q segue a spline maxima e o helper que segue a spline minima, controlando essa interpolação com um divisor/multiplicador variavel e controlavel pelo usuário, dá pra andar rapido e devagar, com um passo curto ou largo... Saca... eeuhuehueuhuehuehueuhueuhueuhueuheuhueuhe... hahahah.. =D




É, véio.. é q a lógica que o 3dsmax segue não é a mesma que a fisica e tal, tem uma lógica bastante rígida, mas está bem longe da fisica.. principalmente e evidentemente na questão da dimensão do Tempo.. Um matemático ou fisico iriam entender essa logica bem rapido realmente.. mas não é a mesma que a usada na realidade.. (não dá pra usar diretamente as formulas da fisica... Isso q eu fiz foi uma \"adaptação\" da formula da Velocidade no MUV, proque o 3ds meio q \'entende\'.. tipo assim né... XD)..





PS: Cria um topico com o mesmo nome na seção de \'grupos de estudo\' ou pede pro modera mudar esse topico pra lá.. q aí a gente n fica upando esse.. sei lá.. quem n entende pode achar q é spam e tal.. =D






A Beleza está entre a Ética e a Razão!..

Faça o login para poder comentar

Usuários conectados

Total de mensagens publicadas pelos membros da comunidade: 710611.

Total de membros registrados: 138076

Últimos membros registrados: deluronforte, Aahiravan026, Percivalgodfrey, Canithencer, Virk, fabriciostm, mariaalrb, machadowr.

Usuário(s) on-line na última hora: 407, sendo 2 membro(s) e 405 visitante(s).

Membro(s) on-line na última hora: claro_lima, deluronforte.

Legenda: Administrador, Especial, Moderador, Parceiro .

3D1 © Três D1 © 1999-2024. Todos direitos reservados.