Cursos e Bibliotecas Ver Mais

Galeria 3D1 Ver Mais

Dan-Tao3d   Piracicaba - AC
Caue Rodrigues   Serra-ES - ES
GARGAMEL   Maceio - AL
RSFX   São Paulo
Antonio   São Paulo - AC

Portfólios Ver Mais

maiconsl   Rio Grande do Sul - RS
HEBERSON   Macapá/AP - AP
Daian   Belo Horizonte - MG

GRUPO DE ESTUDO: MAXScript

Por: tiagodmed  

Em: 11/05/2009 21:18

pow Tiagao, desculpa ai mas to sem tempo mesmo, agora que as coisas acalmaram perto de eu voltar de férias.... bom, no caso do controlador baseado em spline, tem algumas formas mais simples e rapidas de fazer isso. Porém vou seguindo o seu raciocinio entap fiz isso aqui rapidinho: myCtrlA= Circle pos: [0,0,0] radius: 20 myCtrlB= Circle pos: [0,0,0] radius: 20 rotate myCtrlB (angleaxis 90 [1,0,0]) myCtrlC= Circle pos: [0,0,0] radius: 20 rotate myCtrlC (angleaxis 90 [0,1,0]) convertTo myCtrlA SplineShape convertTo myCtrlB SplineShape convertTo myCtrlC SplineShape addAndWeld myCtrlA myCtrlB 0 addAndWeld myCtrlA myCtrlC 0
No modo de constução do maxscript vc jah pode colocar antes a variavel do que vc vai contruir, nao precisa fazer isso depois de contruido ok ? A forma mais rapida de fazer um Attach dos elementos de um spline é com o addAndweld, mas precisa estar tudo em editable spline, senao nao funciona. No final do script voce tem o myCtrlA como variavel do seu circulo, que deve sair como Circle01, pra renomear ele voce pode fazer o seguinte: myCtrlA.name = "Controle" Voce depois pode colocar uma interface e colocar outra variavel pra vc colocar o nome que voce quiser, outra coisa que tbm pode fazer e colocar o Enable in Viewport. Nao esqueça que a variavel desse comando eh Boolean ou seja: é True ou Flase, On ou Off e poderia ser 1 ou 0. Dá uma olhada no help do maxscript que lah tem tudo certinho. Valeu !
Putz cara, valeu mesmo pela colaboração, isso me ajudou a entender muitas coisas sobre o funcionamento do MAXScript, principalmente como interpretar as tags que tem no help :-P hehehehe. O lance de usar a variável antes do código tb é uma mão na roda. Já fiz alguns testes pra entender, e gravar bem o processo, tentei usar outros comandos que tem no Help [code:1:e66374b3dd]myCtrlA= Circle pos: [0,0,0] radius: 20 convertTo myCtrlA SplineShape myCtrlB= Circle pos: [0,0,0] radius: 20 rotate myCtrlB (angleaxis 90 [1,0,0]) convertTo myCtrlB SplineShape myCtrlC= Circle pos: [0,0,0] radius: 20 rotate myCtrlC (angleaxis 90 [0,1,0]) convertTo myCtrlC SplineShape addAndWeld myCtrlA myCtrlB 0 addAndWeld myCtrlA myCtrlC 0 myCtrlA.wirecolor = color 255 255 0 myCtrlA.thickness=1.5 myCtrlA.sides=4 myCtrlA.displayRenderMesh=true myCtrlA.render_auto_smooth=false myCtrlA.steps= 4 myCtrlA.optimize=true myCtrlA.name= "Controle"[/code:1:e66374b3dd] Uma coisa que notei é que todos os comandos (do SplineShape) tem o termo .render_ antes do comando, mas nem todos precisam dele pra funcionar, como o .displayRenderMesh por exemplo, ele funciona sem o .render mas já o .render_auto_smooth não funcionou sem o .render
E ai pessoal, achei um exemplo bem legal do Paul Neale pra usar custom attributes com wire parameters: [code:1:2635d0c157] --Make some objects and add a blank modifier to the box b=box() s=sphere() eM=emptyModifier() addModifier b eM --Create the defintion for the custom attribute def=attributes testAttrib ( --Parameter block to store the tracks of animation parameters testP rollout:testR ( --A track of animation --Look under scripted plugins for the types that can be used. animationTrack type:#float UI:mySpinner ) --The rollout that will show up in the modifier panel. rollout testR "test" ( --The spinner that is connected to the animationTrack spinner mySpinner "My Spinner" ) ) --Add the definition to the emptyModifier custAttributes.add eM def --As a test wire the radius of the sphere to the param block 2 track. paramWire.connect eM.testAttrib[#animationTrack] s.baseObject[#radius] "animationTrack" max modify mode select b [/code:1:2635d0c157] http://forums.cgsociety.org/showthread.php?t=312769
Então, quebrei a minha cabeça aqui um pedaço da tarde e consegui entender como funciona esse codigozinho :S, como é que uma coisinha dessas incomoda tanto, huahuahuahua. Bom enfim, eu juntei o script anterior, o que cria o controlador, e esse script novo do paul neale (apanhei mas consegui, hehehe, deu até pra fazer algumas personalizações no codigo) A ferramenta criada faz o seguinte: ela cria o "controlador", cria um point, adiciona o Attribute holder no controlador, adiciona um parametro com slider ao attribute holder que vai controlar o point, depois ele faz um wire parameter para lincar o slider ao movimento do eixo Y do point. Eu fiz as seguintes limitação para o slider, ele vai de 0 a 1000 e o slider fica como default em 100. Bom eis o script: [code:1:4978b8f0d9] myCtrlA= Circle pos: [0,0,0] radius: 20 convertTo myCtrlA SplineShape myCtrlB= Circle pos: [0,0,0] radius: 20 rotate myCtrlB (angleaxis 90 [1,0,0]) convertTo myCtrlB SplineShape myCtrlC= Circle pos: [0,0,0] radius: 20 rotate myCtrlC (angleaxis 90 [0,1,0]) convertTo myCtrlC SplineShape addAndWeld myCtrlA myCtrlB 0 addAndWeld myCtrlA myCtrlC 0 myCtrlA.wirecolor = color 255 255 0 myCtrlA.thickness=1.5 myCtrlA.sides=4 myCtrlA.displayRenderMesh=true myCtrlA.render_auto_smooth=false myCtrlA.steps= 4 myCtrlA.optimize=true myCtrlA.name= "Controle_Camera" pt=Point pos: [0,100,0] eM=emptyModifier() addModifier myCtrlA eM def=attributes focoAttrib ( parameters focoP rollout:focoR ( animaPosition type:#float UI:MoveTarget default: 100 ) rollout focoR "Foco" ( slider MoveTarget "Move Target" range: [0,1000,0] ) ) custAttributes.add eM def paramWire.connect eM.focoAttrib[#animaPosition] pt.pos.controller[#Y_Position] "animaPosition" max modify mode select myCtrlA [/code:1:4978b8f0d9]
Olá pessoal da 3d1... bom dia a todos!! :) tiagodmed: ai cara! tudo bem?? Parabéns por este maravilhoso tópico; realmente é demais mesmo. Tenho estudado há alguns meses script no Max, porém confesso a vc que não achei nada fácil Thiago e não aprendi e nem absorvi muita coisa. Já tentei escrever alguns scripts bem básicos mas ainda não consegui, o problema também é que estou desenvolvendo um pequeno curta e estudando muito modelagem de personagens,anatomias e animação gráfica. Para mim parar a carroçeria que estou desenvolvendo e seguindo um "fio da meada" é meio complicado, porém vou tentar dá um pé no freio momentaneamente e ver o que posso aprender nesse belo tópico. Como vc mesmo falou que tem que manjar pelo menos o básico de programação, e eu não sei nada, ou quase nada, então vc já viu né?? huahua! ;) A minha pequena vantagem é que sei Inglês, nível médio e sei um pouco de lógica matemática. Há tempos que venho notando que realmente o maxscript é a ferramenta digamos assim, do futuro do Max, ou até mesmo a nível superior, a nível da C.G. Muitos dos problemas podem ser resolvidos com a ajuda de scripts, como vc bem citou. O problema é que o mais simples dos scripts requer um código bem grande mesmo; imagina um script bem complexo?? Parabéns pela sua ótima colaboração e irei ficar de olho bem aberto nesse tópico ok?? tenho muito a aprender sobre script; acho uma área "fabulosa" da C.G!! Pelo pouco que entendo de maxscript uma coisa eu tenho certeza: é a "menina dos olhos" Abraços cara e muito obrigado pela sua ótima colaboração...vlws!! __________________________ [i:d757414575]"FORÇA & CORAGEM SEMPRE"...[/i:d757414575]
E aí pessoal do 3d1! Acabei de me cadastrar no forum e tb to estudando um pouco de script nos últimos meses... Espero poder contribuir e aprender com esse grupo de estudos! Pra já começar com alguma coisa, vou postar o que andei estudando ultimamente... Eu estava fazendo um script para retirar um modificador de vários objetos ao mesmo tempo, por exemplo: Você tem vários objetos numa cena com modificadores diversos e alguns têm Turbosmooth aplicado, outros tem instancias de TurboSmooth e você gostaria de remover todos esses TurboSmooth. Sem script você teria que fazer isso um por um, e, se forem muitos objetos, pode ser até inviável... Eu comecei criando um script que analisava os objetos e verificava se havia um turbosmooth neles. Algo tipo: " for x in selection do ( t = x.modifiers[#TurboSmooth] if (t != undefined) then (deleteModifier 1) ) " mas, o deleteModifier nesse script simplesmente remove o modificador do topo da stack e isso era ruim porque o Turbosmooth podia não estar no topo e podia haver mais de um... Pesquisando, me deparei com um pequeno código do Borislav (Bobo), o rei do MaxScript, hehehehe, e descobri o que um cara do nível dele faria, o que deixou meu código ridículo... :(:( " for o in selection do for i = o.modifiers.count to 1 by -1 where classof o.modifiers[i] == TurboSmooth do deleteModifier o i " O código dele resolve todos os problemas de uma maneira muito mais elegante! hehehehe Ele não só encontra o modificador por sua classe e não pelo seu nome (fazendo com que não haja problema se o TurboSmooth estiver renomeado no stack) como remove toda e qualquer quantidade de Turbosmooths que estiverem nos objetos... perfect! A grande sacada pra mim foi o "count to 1 by -1" que faz o software contar de trás pra frente (do maior pro menor número) os modificadores, encontrando os que tem a classe Turbosmooth e removendo-os em um loop! Isso porque o Max numera os modificadores de cima pra baixo, onde o último que você aplicou tem o número "1". Se você remove o primeiro modificador o número de todos os outros abaixo dele mudam para manter a ordem, ou seja: se você deleta o "1", o "2" vira "1", o "3" vira "2" e assim sucetivamente. Por isso o ideal é apagar de baixo pra cima! (os de cima não mudam de número quando o de baixo é apagado...) Achei fantástico e o código além de simples é muito útil pra qualquer modificador que se queira remover! Basta mudar o nome da classe do modificador no código! Numa interface, pode-se até colocar uma lista com todos os modificadores para o usuário escolher qual quer remover! Descobri tb como fazer isso, mas fica pra um outro post... :P Um abraço para todos! Espero ter contribuído! ;)
Putz, muito legal esse script. Agora, quando o cara ta achando que ta começando a entender um pouco, o cara vê um codigo desses :-P hehehehe. Será que complica muito o cara ter na interface o botão remover e o botão adicionar, pq além de tirar é legal poder colocar o turbosmoth instanciado em todos os objetos da cena. :D
Estou acompanhando o tipico só de curioso mesmo... e passei aqui para saudar no Starship77, seja muito bem vindo ao forum da 3D1!!! Abraço
Valeu Grasiano! tiagodmed, é até mais simples fazer um pra adicionar, e colocá-los numa interface tb não é difícil... Só que ao invés de adicionar os Turbosmooths como instance, eu faria um que adicionasse Turbosmooths individuais em cada objeto, pois, no Max, quando você seleciona vários objetos ao mesmo tempo e aplica um modificador, ele automáticamente vai como instance (por isso não precisaria de um script pra isso), mas pra aplicar individuais, vc tem que ir um por um, aí o script ajudaria no caso de serem muitos objetos... ficaria assim: " for x in selection do if validModifier x TurboSmooth then --testa se o modificador é aplicável ao objeto ( addModifier x (TurboSmooth()) --aplica o modificador x.modifiers[#TurboSmooth].iterations = spn1.value --essa variável é um spinner que eu coloquei na interface pra definir o número de "iterations" do Turbosmooth. vc pode trocar por 1 pra testar ou simplesmente remover a linha. ) " assim eu fiz dois botões, um com cada script, chamados Turbosmooth Killer e Turbosmooth Add! ;) Posto sobre a interface em seguida...

Faça o login para poder comentar

Usuários conectados

Total de mensagens publicadas pelos membros da comunidade: 710365.

Total de membros registrados: 137784

Últimos membros registrados: fernandadias371, Tomasleal-, moilveira, Jandir , ivonei.energia, JoaoMartins, victormartinsc, jvmagalhaes.

Usuário(s) on-line na última hora: 473, sendo 1 membro(s) e 472 visitante(s).

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

Legenda: Administrador, Especial, Moderador, Parceiro .

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