Tutorial de Ragdolling

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial de Ragdolling

Mensagem por MauroC em Dom Mar 31, 2013 10:18 am

Meio copiado do facepunch, meio escrito com meus conhecimentos.
Note que isso será feito em partes (múltiplos posts).

VERSÃO EM PDF: https://www.dropbox.com/s/uckdhhgc61ukmgj/Ragdolling.pdf (man I love Dropbox)
Note que eu recomendo a versão que está aqui mesmo, está mais organizada que o PDF.

PARTES

1: Introdução
2: Programas
3: Básicos do Autodesk
4: Estrutura básica do .qc
5: Compilando um prop
6: Usando o VTFEdit
7: Ragdolling 1: Otimizando
8: Ragdolling 2: Bones (animação)
9: Ragdolling 3: Collision Models
10: Estrutura avançada do .qc
11: Parâmetros avançados de shaders
12: Ragdolling 4: Fingerposing
13: Ragdolling 5: Eyeposing
14: Ragdolling 6: Bodygroups e skins
15: Faceposing 1: Ragdoll com múltiplos SMDs
16: Faceposing 2: Edição de vértices e facebones
17: Faceposing 3: Autokey e morphers
18: Faceposing 4: Flexes no .qc


PARTE 1 - INTRODUÇÃO
Você joga Gmod? É claro que sim, se não jogasse não estaria lendo isso.
Mas você já sonhou em fazer seus próprios ragdolls e addons? Sim? Então aqui está um tutorial para te ensinar!
A maioria das pessoas pensa que mexer com programas de modelagem 3D é difícil, mas a verdade é que é difícil sim. Mas para fazer ragdolling, só precisamos saber usar 5% do programa. Essencialmente, é algo que qualquer um pode fazer.
Mas, enfim, o que é ragdolling? É a arte de pegar um modelo de um jogo qualquer e colocá-lo no Gmod como um ragdoll.
Isso é feito por um processo simples que estarei explicando.


Última edição por MauroC em Sab Abr 20, 2013 12:11 pm, editado 2 vez(es)
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Dom Mar 31, 2013 10:37 am

PARTE 2 - VOCÊ VAI PRECISAR
Na verdade, eu falei que era simples, mas você precisa instalar uns 15 programas pra conseguir fazer ragdolling.
Tenha uns 7GB de espaço sobrando.

1 - Obter os modelos - Claro, você não vai criar seu próprio ragdoll, apenas vai transformar um modelo existente em um. Para isso, você precisa ter os arquivos, então aqui vão alguns métodos:

-Internet: simplesmente procure no Google, ou veja se consegue achar aqui: http://www.models-resource.com/

-Dolphin: se for um jogo de Wii/Gamecube, tem como você extrair os arquivos direto do filesystem do jogo.

-3DRipper: Programa que permite você obter o modelo direto de um jogo que esteja rodando. http://www.deep-shadows.com/hax/3DRipperDX.htm

2 - Editar os modelos
Você também vai precisar de um programa para fazer o ragdolling propriamente dito. Eu recomendo o 3ds Max 2012, se você for estudante tem como conseguir DE GRÁTIS! (é só se registrar no site da Autodesk.) Nota: use a versão 2012! http://www.autodesk.com/products/autodesk-3ds-max/overview
Outros programas incluem o XSI (usado no HL2) e Maya. Mas, sério, usem o Autodesk. É o que vou usar neste tutorial.

3 - Compilar
A última parte consiste em colocar seus arquivos em um formato que o Gmod pode ler. Você precisará de:
Bloco de notas
Plugins para exportar SMD e VTA no Autodesk:

http://www.chaosincarnate.net/cannonfodder/cftools.htm (importar e exportar SMDS)
http://www.wunderboy.org/3dapps.php (exportar VTAs)
GUIStudioMDL (para compilar os SMDs) http://www.wunderboy.org/apps/guistudiomdl2.php
VTF Edit (converter as texturas para VTF) http://nemesis.thewavelength.net/index.php?c=178
Source SDK (ache no Steam em Biblioteca - Ferramentas)
Garry's Workshopper (para fazer o upload de addons) http://wiki.garrysmod.com/page/Workshop_Publisher_Tool

Acho que é só disso que você vai precisar. Só.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Dom Mar 31, 2013 3:40 pm

PARTE 3: USANDO O AUTODESK

Bom, vamos assumir que você já tenha um bom conhecimento de perspectiva e saiba o que é wireframe. Ótimo!
Vamos para os básicos do 3ds Max, começando pelos controles do mouse e câmera.

O botão esquerdo seleciona. Use com o CTRL para selecionar mais objetos e use com o ALT para deselecionar.
Deixe o botão do meio apertado para mover a cena.
Use o botão direito para abrir o menu de propriedades (útil para clonar, congelar e esconder objetos)
Clique no cubo branco no canto superior direito para manipular o ângulo da câmera.

As três ferramentas básicas que vamos usar são Mover, Girar e Redimensionar. Mais tarde usaremos a ferramenta de linkagem, que não adianta explicar agora.
Quase sempre deixaremos o menu no "Modify" (o arco-íris azul).


E é só isso que você precisa manjar pra usar o Autodesk. Vamos aprender mais ao longo dessa jornada mágica.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Dom Mar 31, 2013 3:52 pm

PARTE 4: ARQUIVOS QC

Eu sei, parece estranho colocar os arquivos .qc antes da compilação, mas eu achei mais importante. Vamos agora ver não só os .qc, mas outros formatos de arquivo que estaremos usando:

.MDL : O arquivo de modelo propriamente dito, usado pelo GMod e Source. É o que vamos ver no HLMV.
.SMD : Tipo de arquivo que você vai compilar no GUIStudioMDL.
.VTA : Contém os dados do faceposing.
.VMT : Arquivo de parâmetros de um material.
.VTF : Arquivo de textura.
.QC : Parâmetros de compilação.

Os arquivos .qc podem ser abertos com um bloco de notas. Se você tiver o MDLDecompiler, pode usar a engenharia reversa e ver que um .qc é mais ou menos assim:
Código:
$cd "C:\Program Files\Steam\steamapps\maurocazzaniga\garrysmod\garrysmod\addons\gmod addons"
$modelname "player/gman_high.mdl"
$model "gman_high_reference" "gman_high_reference.smd" {
    flexfile "mdldecompiler_expressions.vta" {
          flex "upper_right" frame 2
          flex "lower_right" frame 4
          flex "upper_left" frame 6
          flex "lower_left" frame 8
          flex "AU42" frame 9
          flexpair "AU1" 1.0 frame 10
          flexpair "AU2" 1.0 frame 11
          flexpair "AU1AU2" 1.0 frame 12
          flexpair "AU4" 1.0 frame 13
          flexpair "AU1AU4" 1.0 frame 14
          flexpair "AU2AU4" 1.0 frame 15
          flexpair "AU12" 1.0 frame 16
          flexpair "AU12AU25" 1.0 frame 17
          flexpair "AU15" 1.0 frame 18
          flexpair "AU17" 1.0 frame 19
          flexpair "AU14" 1.0 frame 20
          flexpair "AU10" 1.0 frame 21
          flex "AU10SL" frame 22
          flex "AU16" frame 23
          flexpair "AU6" 1.0 frame 24
          flexpair "AU9" 1.0 frame 25
          flexpair "AU25" 1.0 frame 26
          flexpair "AU18" 1.0 frame 27
          flexpair "AU22" 1.0 frame 28
          flexpair "AU20" 1.0 frame 29
          flex "AU32" frame 30
          flex "AU24" frame 31
          flex "AU38" frame 32
          flex "AU31" frame 33
          flexpair "AU26" 1.0 frame 34
          flexpair "AU27" 1.0 frame 35
          flexpair "AU26Z" 1.0 frame 36
          flexpair "AU27Z" 1.0 frame 37
          flexpair "AU22Z" 1.0 frame 38
          flexpair "AU13" 1.0 frame 39
          flex "AD96L" frame 40
          flex "AD96R" frame 41
          flex "AD30L" frame 42
          flex "AD30R" frame 43
          flex "AD32" frame 44
    }
    eyeball righteye ValveBiped.Bip01_Head1 -1.120 -3.450 68.180 eyeball_r 1.000  4.000 gman_facehirez 0.630
    eyeball lefteye ValveBiped.Bip01_Head1 1.200 -3.450 68.280 eyeball_l 1.000  -4.000 gman_facehirez 0.630
    // If you uncomment the following lines the eyes will be closed
    // I'm including it anyway in case anyone wants to experiment
    // eyelid  upper_right "mdldecompiler_expressions.vta" lowerer 2 -0.250000 neutral 2 0.160000 raiser 2 0.310000 split 0.1 eyeball righteye
    // eyelid  lower_right "mdldecompiler_expressions.vta" lowerer 4 -0.380000 neutral 4 -0.240000 raiser 4 -0.040000  split 0.1 eyeball righteye
    // If you uncomment the following lines the eyes will be closed
    // I'm including it anyway in case anyone wants to experiment
    // eyelid  upper_left "mdldecompiler_expressions.vta" lowerer 6 -0.240000 neutral 6 0.160000 raiser 6 0.310000 split -0.1 eyeball lefteye
    // eyelid  lower_left "mdldecompiler_expressions.vta" lowerer 8 -0.360000 neutral 8 -0.230000 raiser 8 -0.020000  split -0.1 eyeball lefteye
    mouth 0 "mouth"  ValveBiped.Bip01_Head1 0.000 1.000 0.000
    flexcontroller eyelid right_lid_raiser "range" 0.000 1.000
    flexcontroller eyelid left_lid_raiser "range" 0.000 1.000
    flexcontroller eyelid right_lid_tightener "range" 0.000 1.000
    flexcontroller eyelid left_lid_tightener "range" 0.000 1.000
    flexcontroller eyelid right_lid_droop "range" 0.000 1.000
    flexcontroller eyelid left_lid_droop "range" 0.000 1.000
    flexcontroller eyelid right_lid_closer "range" 0.000 1.000
    flexcontroller eyelid left_lid_closer "range" 0.000 1.000
    flexcontroller eyelid half_closed "range" 0.000 1.000
    flexcontroller eyelid blink "range" 0.000 1.000
    flexcontroller brow right_inner_raiser "range" 0.000 1.000
    flexcontroller brow left_inner_raiser "range" 0.000 1.000
    flexcontroller brow right_outer_raiser "range" 0.000 1.000
    flexcontroller brow left_outer_raiser "range" 0.000 1.000
    flexcontroller brow right_lowerer "range" 0.000 1.000
    flexcontroller brow left_lowerer "range" 0.000 1.000
    flexcontroller nose right_cheek_raiser "range" 0.000 1.000
    flexcontroller nose left_cheek_raiser "range" 0.000 1.000
    flexcontroller nose wrinkler "range" 0.000 1.000
    flexcontroller nose dilator "range" 0.000 1.000
    flexcontroller mouth right_upper_raiser "range" 0.000 1.000
    flexcontroller mouth left_upper_raiser "range" 0.000 1.000
    flexcontroller mouth right_corner_puller "range" 0.000 1.000
    flexcontroller mouth left_corner_puller "range" 0.000 1.000
    flexcontroller mouth right_corner_depressor "range" 0.000 1.000
    flexcontroller mouth left_corner_depressor "range" 0.000 1.000
    flexcontroller mouth chin_raiser "range" 0.000 1.000
    flexcontroller phoneme right_part "range" 0.000 1.000
    flexcontroller phoneme left_part "range" 0.000 1.000
    flexcontroller phoneme right_puckerer "range" 0.000 1.000
    flexcontroller phoneme left_puckerer "range" 0.000 1.000
    flexcontroller phoneme right_funneler "range" 0.000 2.000
    flexcontroller phoneme left_funneler "range" 0.000 2.000
    flexcontroller phoneme right_stretcher "range" 0.000 1.000
    flexcontroller phoneme left_stretcher "range" 0.000 1.000
    flexcontroller phoneme bite "range" 0.000 1.000
    flexcontroller phoneme presser "range" 0.000 1.000
    flexcontroller phoneme tightener "range" 0.000 1.000
    flexcontroller phoneme jaw_clencher "range" 0.000 1.000
    flexcontroller phoneme jaw_drop "range" 0.000 2.000
    flexcontroller phoneme right_mouth_drop "range" 0.000 1.000
    flexcontroller phoneme left_mouth_drop "range" 0.000 1.000
    flexcontroller mouth sneer_left "range" 0.000 1.000
    flexcontroller mouth right_dimpler "range" 0.000 1.000
    flexcontroller mouth left_dimpler "range" 0.000 1.000
    flexcontroller mouth right_cheek_puffer "range" 0.000 1.000
    flexcontroller mouth left_cheek_puffer "range" 0.000 1.000
    flexcontroller mouth mouth_sideways "range" -1.000 1.000
    flexcontroller mouth jaw_sideways "range" -1.000 1.000
    flexcontroller mouth lip_bite "range" 0.000 1.000
    flexcontroller mouth lower_lip "range" 0.000 1.000
    flexcontroller head head_rightleft "range" -30.000 30.000
    flexcontroller head head_updown "range" -15.000 15.000
    flexcontroller head head_tilt "range" -15.000 15.000
    flexcontroller eyes eyes_updown "range" -30.000 30.000
    flexcontroller eyes eyes_rightleft "range" -30.000 30.000
    flexcontroller body body_rightleft "range" -30.000 30.000
    flexcontroller chest chest_rightleft "range" -30.000 30.000
    flexcontroller head head_forwardback "range" -0.200 0.200
    flexcontroller gesture gesture_updown "range" -1.000 1.000
    flexcontroller gesture gesture_rightleft "range" -1.000 1.000
    localvar biter
    %biter = (( bite * ( 1.000 -  lip_bite)) +  lip_bite)
    localvar upper_right_raiser
    %upper_right_raiser = ((( right_lid_raiser * ( 1.000 - ( right_lid_droop *  0.800))) * ( 1.000 -  right_lid_closer)) * ( 1.000 -  blink))
    localvar upper_right_neutral
    %upper_right_neutral = (((( 1.000 - ( right_lid_droop *  0.800)) * ( 1.000 -  right_lid_raiser)) * ( 1.000 -  right_lid_closer)) * ( 1.000 -  blink))
    localvar upper_right_lowerer
    %upper_right_lowerer = ( right_lid_closer + ( blink * ( 1.000 -  right_lid_closer)))
    localvar upper_left_raiser
    %upper_left_raiser = ((( left_lid_raiser * ( 1.000 - ( left_lid_droop *  0.800))) * ( 1.000 -  left_lid_closer)) * ( 1.000 -  blink))
    localvar upper_left_neutral
    %upper_left_neutral = (((( 1.000 - ( left_lid_droop *  0.800)) * ( 1.000 -  left_lid_raiser)) * ( 1.000 -  left_lid_closer)) * ( 1.000 -  blink))
    localvar upper_left_lowerer
    %upper_left_lowerer = ( left_lid_closer + ( blink * ( 1.000 -  left_lid_closer)))
    localvar lower_right_raiser
    %lower_right_raiser =  right_lid_closer
    localvar lower_right_neutral
    %lower_right_neutral = ((( 1.000 -  right_lid_closer) * ( 1.000 - ( right_lid_tightener *  0.500))) * ( 1.000 - ( right_cheek_raiser *  0.250)))
    localvar lower_right_lowerer
    %lower_right_lowerer =  0.000
    localvar lower_left_raiser
    %lower_left_raiser =  left_lid_closer
    localvar lower_left_neutral
    %lower_left_neutral = ((( 1.000 -  left_lid_closer) * ( 1.000 - ( left_lid_tightener *  0.500))) * ( 1.000 - ( left_cheek_raiser *  0.250)))
    localvar lower_left_lowerer
    %lower_left_lowerer =  0.000
    %AU1R = (( right_inner_raiser * ( 1.000 -  right_outer_raiser)) * ( 1.000 -  right_lowerer))
    %AU1L = (( left_inner_raiser * ( 1.000 -  left_outer_raiser)) * ( 1.000 -  left_lowerer))
    %AU2R = (( right_outer_raiser * ( 1.000 -  right_inner_raiser)) * ( 1.000 -  right_lowerer))
    %AU2L = (( left_outer_raiser * ( 1.000 -  left_inner_raiser)) * ( 1.000 -  left_lowerer))
    %AU4R = (( right_lowerer * ( 1.000 -  right_inner_raiser)) * ( 1.000 -  right_outer_raiser))
    %AU4L = (( left_lowerer * ( 1.000 -  left_inner_raiser)) * ( 1.000 -  left_outer_raiser))
    localvar AU1AU2AU4R
    %AU1AU2AU4R = (( right_inner_raiser *  right_outer_raiser) *  right_lowerer)
    localvar AU1AU2AU4L
    %AU1AU2AU4L = (( left_inner_raiser *  left_outer_raiser) *  left_lowerer)
    %AU1AU2R = ((( right_inner_raiser *  right_outer_raiser) * ( 1.000 -  right_lowerer)) + ( %AU1AU2AU4R /  2.000))
    %AU1AU2L = ((( left_inner_raiser *  left_outer_raiser) * ( 1.000 -  left_lowerer)) + ( %AU1AU2AU4L /  2.000))
    %AU1AU4R = ((( right_inner_raiser * ( 1.000 -  right_outer_raiser)) *  right_lowerer) + ( %AU1AU2AU4R /  2.000))
    %AU1AU4L = ((( left_inner_raiser * ( 1.000 -  left_outer_raiser)) *  left_lowerer) + ( %AU1AU2AU4L /  2.000))
    %AU2AU4R = ((( right_outer_raiser * ( 1.000 -  right_inner_raiser)) *  right_lowerer) + ( %AU1AU2AU4R /  2.000))
    %AU2AU4L = ((( left_outer_raiser * ( 1.000 -  left_inner_raiser)) *  left_lowerer) + ( %AU1AU2AU4L /  2.000))
    %AU9R =  wrinkler
    %AU9L =  wrinkler
    %AU38 =  dilator
    localvar lower_lip_active
    %lower_lip_active = Bad stack
    localvar right_open
    %right_open = (((( right_part +  right_puckerer) +  right_funneler) + ( right_upper_raiser *  0.500)) +  %lower_lip_active)
    localvar left_open
    %left_open = ((((( left_part +  left_puckerer) +  left_funneler) + ( left_upper_raiser *  0.500)) +  %lower_lip_active) + ( sneer_left *  0.500))
    localvar right_lip_suppressor
    %right_lip_suppressor = (((( 1.000 /  %right_open) * ( 1.000 -  presser)) * ( 1.000 -  %biter)) * ( 1.000 -  chin_raiser))
    localvar left_lip_suppressor
    %left_lip_suppressor = (((( 1.000 /  %left_open) * ( 1.000 -  presser)) * ( 1.000 -  %biter)) * ( 1.000 -  chin_raiser))
    %AU10R = ( right_upper_raiser * (( right_upper_raiser *  %right_lip_suppressor) *  0.500))
    %AU10L = ( left_upper_raiser * (( left_upper_raiser *  %left_lip_suppressor) *  0.500))
    localvar right_scaled_part
    %right_scaled_part = ( right_part * ( right_part *  %right_lip_suppressor))
    localvar left_scaled_part
    %left_scaled_part = ( left_part * ( left_part *  %left_lip_suppressor))
    %AU25R = ( %right_scaled_part * ( 1.000 -  right_corner_puller))
    %AU25L = ( %left_scaled_part * ( 1.000 -  left_corner_puller))
    %AU6R =  right_cheek_raiser
    %AU6L =  left_cheek_raiser
    %AU12AU25R = ( %right_scaled_part *  right_corner_puller)
    %AU12AU25L = ( %left_scaled_part *  left_corner_puller)
    %AU18R = ( right_puckerer * ( right_puckerer *  %right_lip_suppressor))
    %AU18L = ( left_puckerer * ( left_puckerer *  %left_lip_suppressor))
    %AU22R = ( right_funneler * ( right_funneler *  %right_lip_suppressor))
    %AU22L = ( left_funneler * ( left_funneler *  %left_lip_suppressor))
    %AU17R = Bad stack
    %AU17L = Bad stack
    localvar right_depressor_suppressor
    %right_depressor_suppressor = (( 1.000 / ((((((( %AU18R *  0.800) + ( %AU22R *  0.800)) +  %AU17R) +  %biter) +  right_corner_puller) +  right_stretcher) +  right_corner_depressor)) * ( 1.000 - ( jaw_drop *  0.500)))
    localvar left_depressor_suppressor
    %left_depressor_suppressor = (( 1.000 / ((((((( %AU18L *  0.800) + ( %AU22L *  0.800)) +  %AU17L) +  %biter) +  left_corner_puller) +  left_stretcher) +  left_corner_depressor)) * ( 1.000 - ( jaw_drop *  0.500)))
    %AU15R = ( right_corner_depressor * ( right_corner_depressor *  %right_depressor_suppressor))
    %AU15L = ( left_corner_depressor * ( left_corner_depressor *  %left_depressor_suppressor))
    localvar right_corner_suppressor
    %right_corner_suppressor = (( 1.000 / ((((((( %AU18R *  0.800) + ( %AU22R *  0.800)) +  %AU17R) +  %biter) +  right_corner_puller) +  right_stretcher) +  right_corner_depressor)) * ( 1.000 - ( jaw_drop *  0.500)))
    localvar left_corner_suppressor
    %left_corner_suppressor = (( 1.000 / ((((((( %AU18L *  0.800) + ( %AU22L *  0.800)) +  %AU17L) +  %biter) +  left_corner_puller) +  left_stretcher) +  left_corner_depressor)) * ( 1.000 - ( jaw_drop *  0.500)))
    %AU12R = (( right_corner_puller * ( right_corner_puller *  %right_corner_suppressor)) * ( 1.000 -  right_part))
    %AU12L = (( left_corner_puller * ( left_corner_puller *  %left_corner_suppressor)) * ( 1.000 -  left_part))
    %AU20R = ( right_stretcher * ( right_stretcher *  %right_corner_suppressor))
    %AU20L = ( left_stretcher * ( left_stretcher *  %left_corner_suppressor))
    localvar right_drop_suppressor
    %right_drop_suppressor = ((( 1.000 / (( 0.500 *  %right_open) +  right_mouth_drop)) * ( 1.000 -  presser)) * ( 1.000 -  %biter))
    localvar left_drop_suppressor
    %left_drop_suppressor = ((( 1.000 / (( 0.500 *  %left_open) +  left_mouth_drop)) * ( 1.000 -  presser)) * ( 1.000 -  %biter))
    localvar right_drop
    %right_drop = ( right_mouth_drop * ( right_mouth_drop *  %right_drop_suppressor))
    localvar left_drop
    %left_drop = ( left_mouth_drop * ( left_mouth_drop *  %left_drop_suppressor))
    %AU10SL = ( sneer_left * (( sneer_left *  %left_lip_suppressor) *  0.500))
    %AU32 = ( bite * ( 1.000 -  lip_bite))
    %AD32 =  lip_bite
    %AU24 = ( presser + (( 1.000 -  presser) *  tightener))
    %AU31 = Bad stack
    %AD96L = Bad stack
    %AD96R = Bad stack
    %AD30L = Bad stack
    %AD30R = Bad stack
    localvar jaw_overage
    %jaw_overage = Bad stack
    localvar jaw_underage
    %jaw_underage = Bad stack
    %AU26R = (( %jaw_underage * ( 1.000 -  %right_drop)) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU26L = (( %jaw_underage * ( 1.000 -  %left_drop)) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU27R = (( %jaw_underage *  %right_drop) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU27L = (( %jaw_underage *  %left_drop) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU26ZR = (( %jaw_overage * ( 1.000 -  %right_drop)) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU26ZL = (( %jaw_overage * ( 1.000 -  %left_drop)) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU27ZR = (( %jaw_overage *  %right_drop) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU27ZL = (( %jaw_overage *  %left_drop) * ( jaw_drop / ( jaw_clencher +  jaw_drop)))
    %AU22ZR = Bad stack
    %AU22ZL = Bad stack
    %AU22R = Bad stack
    %AU22L = Bad stack
    %AU16 = Bad stack
    localvar mouth
    %mouth = (((((((((((((((((((( %AU27R *  0.500) + ( %AU27L *  0.500)) + ( %AU27ZR *  0.500)) + ( %AU27ZL *  0.500)) + ( %AU26ZR *  0.350)) + ( %AU26ZL *  0.350)) + ( %AU22R *  0.350)) + ( %AU22L *  0.350)) + ( %AU22ZR *  0.500)) + ( %AU22ZL *  0.500)) + ( %AU18R *  0.250)) + ( %AU18L *  0.250)) + ( %AU25R *  0.350)) + ( %AU25L *  0.350)) + ( %AU32 *  0.500)) + ( %AU12AU25R *  0.500)) + ( %AU12AU25L *  0.500)) + ( %AU16 *  0.600)) + ( %AD32 *  0.500)) + ( %AU10SL *  0.360))
    %AU13R = Bad stack
    %AU13L = Bad stack
    %AU14R = ( right_dimpler * ( 1.000 -  %AU13R))
    %AU14L = ( left_dimpler * ( 1.000 -  %AU13L))
}
$lod 10
 {
  replacemodel "gman_high_reference" "lod1_gman_high_reference"
}
$lod 20
 {
  replacemodel "gman_high_reference" "lod2_gman_high_reference"
}
$lod 32
 {
  replacemodel "gman_high_reference" "lod3_gman_high_reference"
}
$lod 45
 {
  replacemodel "gman_high_reference" "lod4_gman_high_reference"
}
$shadowlod
{
  replacemodel "gman_high_reference" "lod5_gman_high_reference"
}
$cdmaterials "models\Gman\"
$cdmaterials "models\humans\male\"
$hboxset "default"
$hbox 1 "ValveBiped.Bip01_Head1" -1.250  -6.500  -3.190  8.250  3.500  3.310
$hbox 4 "ValveBiped.Bip01_L_UpperArm" 0.000  -2.750  -2.750  12.510  1.750  2.250
$hbox 4 "ValveBiped.Bip01_L_Forearm" 0.000  -2.190  -2.380  13.000  1.810  1.620
$hbox 4 "ValveBiped.Bip01_L_Hand" 0.060  -2.000  -1.500  4.060  1.000  2.500
$hbox 5 "ValveBiped.Bip01_R_UpperArm" 0.000  -3.000  -2.250  12.390  2.000  2.750
$hbox 5 "ValveBiped.Bip01_R_Forearm" -0.500  -2.200  -1.550  12.500  1.800  2.450
$hbox 5 "ValveBiped.Bip01_R_Hand" 0.060  -2.000  -2.500  4.060  1.000  1.500
$hbox 6 "ValveBiped.Bip01_L_Thigh" 0.000  -3.750  -3.250  17.850  3.750  3.250
$hbox 6 "ValveBiped.Bip01_L_Calf" 0.000  -3.510  -3.280  15.640  3.490  2.720
$hbox 6 "ValveBiped.Bip01_L_Foot" -1.070  -2.000  -2.840  5.040  5.000  2.160
$hbox 6 "ValveBiped.Bip01_L_Toe0" -0.500  -3.000  -2.190  2.500  0.000  2.460
$hbox 7 "ValveBiped.Bip01_R_Thigh" 0.000  -3.750  -3.250  17.850  3.750  3.250
$hbox 7 "ValveBiped.Bip01_R_Calf" 0.000  -3.510  -2.820  15.640  3.490  3.180
$hbox 7 "ValveBiped.Bip01_R_Foot" -1.060  -2.010  -2.280  5.050  4.990  2.720
$hbox 7 "ValveBiped.Bip01_R_Toe0" -0.500  -3.000  -2.600  2.500  0.000  2.100
$hbox 3 "ValveBiped.Bip01_Pelvis" -7.500  -5.500  -6.000  7.500  8.500  5.000
$hbox 2 "ValveBiped.Bip01_Spine2" -2.500  -2.500  -7.000  14.500  7.500  7.000
// Model uses material "gman_facehirez.vmt"
// Model uses material "plyr_sheet.vmt"
// Model uses material "tongue.vmt"
// Model uses material "eyeball_l.vmt"
// Model uses material "eyeball_r.vmt"
// Model uses material "lower_teeth.vmt"
// Model uses material "upper_teeth.vmt"
$attachment "eyes" "ValveBiped.Bip01_Head1" 4.30 -3.57 -0.04 rotate 0.00 -80.10 -90.00
$attachment "mouth" "ValveBiped.Bip01_Head1" 1.40 -4.90 0.00 rotate -0.00 -80.00 -90.00
$attachment "chest" "ValveBiped.Bip01_Spine2" 5.00 4.00 -0.00 rotate -0.00 90.00 90.00
$attachment "cameraeye" "ValveBiped.Bip01_Head1" 4.39 -4.02 -1.23 rotate 90.00 -80.17 0.00
$attachment "mouth_left" "ValveBiped.Bip01_Head1" 1.36 -4.39 -0.71 rotate 90.00 -80.24 0.00
$attachment "cheekbone_left" "ValveBiped.Bip01_Head1" 3.23 -4.14 -1.08 rotate 90.00 -80.20 0.00
$attachment "forward" "ValveBiped.forward" 0.00 0.00 0.00 rotate 0.00 0.00 0.00
$attachment "anim_attachment_RH" "ValveBiped.Anim_Attachment_RH" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment "anim_attachment_LH" "ValveBiped.Anim_Attachment_LH" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$attachment "anim_attachment_head" "ValveBiped.Bip01_Head1" 0.00 0.00 0.00 rotate -90.00 -90.00 0.00
$includemodel "m_anm.mdl"
$surfaceprop "flesh"
$eyeposition -0.000 0.000 70.000
$illumposition 1.302 0.009 35.302
$sequence idle "idle" loop ACT_IDLE 1 fps 30.00
$sequence ragdoll "ragdoll" ACT_DIERAGDOLL 1 fps 30.00
$ikchain rhand ValveBiped.Bip01_R_Hand knee  0.707 0.707 0.000
$ikchain lhand ValveBiped.Bip01_L_Hand knee  0.707 0.707 0.000
$ikchain rfoot ValveBiped.Bip01_R_Foot knee  0.707 -0.707 0.000
$ikchain lfoot ValveBiped.Bip01_L_Foot knee  0.707 -0.707 0.000
$collisionjoints "phymodel.smd" {

   $mass 90.0
   $inertia 10.00
   $damping 0.01
   $rotdamping 1.50
   $rootbone "valvebiped.bip01_pelvis"
   $jointmerge "ValveBiped.Bip01_Pelvis" "ValveBiped.Bip01_Spine1"

   $jointconstrain "valvebiped.bip01_spine2" x limit -48.00 48.00 0.00
   $jointconstrain "valvebiped.bip01_spine2" y limit -25.00 25.00 0.00
   $jointconstrain "valvebiped.bip01_spine2" z limit -25.00 50.00 0.00

   $jointconstrain "valvebiped.bip01_r_upperarm" x limit -39.00 39.00 0.00
   $jointconstrain "valvebiped.bip01_r_upperarm" y limit -79.00 95.00 0.00
   $jointconstrain "valvebiped.bip01_r_upperarm" z limit -93.00 23.00 0.00

   $jointconstrain "valvebiped.bip01_l_upperarm" x limit -30.00 30.00 0.00
   $jointconstrain "valvebiped.bip01_l_upperarm" y limit -95.00 84.00 0.00
   $jointconstrain "valvebiped.bip01_l_upperarm" z limit -86.00 26.00 0.00

   $jointconstrain "valvebiped.bip01_l_forearm" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_forearm" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_forearm" z limit -149.00 4.00 0.00

   $jointconstrain "valvebiped.bip01_l_hand" x limit -37.00 37.00 0.00
   $jointconstrain "valvebiped.bip01_l_hand" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_hand" z limit -57.00 59.00 0.00

   $jointconstrain "valvebiped.bip01_r_forearm" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_forearm" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_forearm" z limit -149.00 4.00 0.00

   $jointconstrain "valvebiped.bip01_r_hand" x limit -60.00 60.00 0.00
   $jointconstrain "valvebiped.bip01_r_hand" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_hand" z limit -57.00 70.00 0.00

   $jointconstrain "valvebiped.bip01_r_thigh" x limit -12.00 12.00 0.00
   $jointconstrain "valvebiped.bip01_r_thigh" y limit -8.00 75.00 0.00
   $jointconstrain "valvebiped.bip01_r_thigh" z limit -97.00 32.00 0.00

   $jointconstrain "valvebiped.bip01_r_calf" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_calf" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_calf" z limit -12.00 126.00 0.00

   $jointconstrain "valvebiped.bip01_head1" x limit -20.00 20.00 0.00
   $jointconstrain "valvebiped.bip01_head1" y limit -25.00 25.00 0.00
   $jointconstrain "valvebiped.bip01_head1" z limit -13.00 30.00 0.00

   $jointconstrain "valvebiped.bip01_l_thigh" x limit -12.00 12.00 0.00
   $jointconstrain "valvebiped.bip01_l_thigh" y limit -73.00 6.00 0.00
   $jointconstrain "valvebiped.bip01_l_thigh" z limit -93.00 30.00 0.00

   $jointconstrain "valvebiped.bip01_l_calf" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_calf" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_calf" z limit -8.00 126.00 0.00

   $jointconstrain "valvebiped.bip01_l_foot" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_foot" y limit -19.00 19.00 0.00
   $jointconstrain "valvebiped.bip01_l_foot" z limit -15.00 35.00 0.00

   $jointconstrain "valvebiped.bip01_r_foot" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_foot" y limit -25.00 6.00 0.00
   $jointconstrain "valvebiped.bip01_r_foot" z limit -15.00 35.00 0.00
   $animatedfriction 1.000 400.000 0.500 0.300 0.000
}

Estaremos estudando as partes simples do qc. Na próxima parte falaremos mais.

Código:
$cd "C:\Users\Maurinho\Documents\3dsMax\export\TECLADO"
$modelname "MAURO\teclado_key.mdl"
$model "studio" "pkey.smd"
$cdmaterials "models\mauro"

$hboxset "default"
$surfaceprop "metal"
$sequence idle "rkey.smd" fps 1.00
$collisionmodel "pkey.smd" {
   $concave
   $mass 0.2
   $inertia 1.00
   $damping 0.00
   $rotdamping 0.00
}

Comandos que você deve memorizar:

$cd : indica a pasta onde estão seus arquivos SMD.
$modelname : o nome do arquivo do seu modelo (ex: gman.mdl ou HL2\gman.mdl)
$cdmaterials : a pasta dentro de garrysmod\materials em que vão estar seus VMTs.
$surfaceprop : a "superfície" do seu objeto (ex: metal, flesh, wood, etc. Vou ver se consigo uma lista completa)

Falaremos do $model, $sequence e $collisionmodel na próxima parte. O resto dos comandos são padrão (copiar e colar em praticamente todos os seus qcs.)
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 01, 2013 1:28 pm

PARTE 5: COMPILANDO UM PROP

Vamos começar o nosso tutorial propriamente dito, fazendo um simples prop. Isso demora por volta de 30 min.
Para começarmos, você deve ter instalado o StudioMDL, os plugins do Autodesk e o Source SDK. Vamos começar configurando esses programas.

Começando pelo Source SDK. Rode ele na Steam, vai copiar alguns arquivos e irá aparecer a tela principal. Note que está configurado para Team Fortress 2, nós queremos para Garry's Mod. Clique em "Edit Game Configurations", coloque em "Add" e adicione o path do gameinfo.txt do seu GMod (SteamApps\seunome\garrysmod\garrysmod). Pronto.
Agora temos que configurar o StudioMDL, vá em Config - Set Orange Box Tools Path (o path é SteamApps\seunome\sourcesdk\bin\orangebox\bin). Selecione Orange Box (SDK Version) e coloque novamente o path do gameinfo.txt do GMod.

Vamos ao que interessa. Para nosso tutorial, vou usar de exemplo uma simples Morph Ball. Abrindo o arquivo .obj no Max, vemos isso:


Não precisa memorizar o que eu vou falar agora, cobriremos isso de novo em outro capítulo.
O primeiro passo é deletar os objetos que sejam inúteis (se existirem).
Depois temos que juntar tudo em um único objeto:


Clique em um objeto, selecione "Attach" e clique nos outros objetos. Vá apertando OK nas caixas de mensagem.

Agora só temos que redimensionar nosso prop. Faremos isso com a ajuda de um modelo de colisão oficial da Valve.
https://www.dropbox.com/s/le6v2xjki14xr7c/phymodel.max
GUARDE ESSE ARQUIVO, você precisará dele para todos os modelos que fizer!

Vá no menu do Autodesk, Import - Merge. Escolha esse arquivo.
Importe só o smdimport (não vamos precisar dos bones).

Veja que nosso prop está minúsculo:


Usando a ferramenta de redimensionar, vamos colocá-lo num tamanho adequado.

Pode deletar o smdimport agora.
Agora, uma parte importante: aperte SHIFT+T e anote todos os arquivos de imagem que você está usando.

Neste caso, temos apenas um: ball_n.png .

Só falta exportar. Menu do Autodesk - Export - Export. Crie uma pasta (dentro do Documents\3ds Max\export mesmo) e exporte dois arquivos como Valve HL2 SMD:
Um ragdoll.smd (Skeletal Animation)
Um prop.smd (Reference).

Continua na parte 5.2.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 01, 2013 1:40 pm

PARTE 5.2: FAZENDO O QC

Vamos agora compilar o modelo, crie um arquivo .qc e copie e cole isso aqui:
Código:
$cd "C:\Users\Maurinho\Documents\3dsMax\export\OTHERM\SAMUS\BALL"
$modelname "morphball.mdl"
$model "studio" "prop.smd"
$cdmaterials "models\otherm\samusvaria

$hboxset "default"
$surfaceprop "metal"
$sequence idle "ragdoll.smd" fps 1.00
$collisionmodel "prop.smd" {
   $concave
   $mass 0.2
   $inertia 1.00
   $damping 0.00
   $rotdamping 0.00
}
Já falamos sobre alguns comandos, mas vamos revisar:
$cd: a pasta em que estão seus SMDs.
$modelname: o nome do arquivo MDL.
$model (name) "prop.smd" : comando que indica o modelo, seu nome (pode ser qualquer um, neste caso, studio) e o SMD correspondente.
$cdmaterials: a pasta em que estarão os VMTs (próxima parte).
$surfaceprop: superfície do modelo.
$sequence (name) "ragdoll.smd" fps 1.00 : uma animação blank.
$collisionmodel "prop.smd" : neste caso, o modelo de colisão é o mesmo que o principal.

Faça as alterações necessárias, salve seu .qc e abra o GUIStudioMDL. Selecione Orange Box e Garry's Mod, vá em "Load QC File", carregue seu qc e clique em Compile.

Você agora deve ter um .MDL na pasta garrysmod\models. Agora abra o Source SDK, e vá em Model Viewer (será chamado de HLMV daqui em diante.) Abra seu modelo. Ops. Está tudo roxo!

Mas é porque não temos os VMTs. Vamos ver isso na parte 6.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 01, 2013 1:49 pm

PARTE 6: USANDO O VTFEDIT

Vamos lá, agora é hora de aprender a mexer com texturas. Essa parte é curta e simples, mas depois fica complicada pra caramba (em parâmetros avançados de shaders). Comece abrindo o VTFEdit.

Vá em Tools - Convert Folder. Como Input Folder, coloque a pasta em que estão as imagens usadas pelo seu prop (você anotou na parte 5). Como Output Folder, a sua pasta $cdmaterials (garrysmod\materials\models). Deixe Create VMT Files marcado. No To VTF, escreva o nome do seu arquivo (converta um arquivo por vez). No nosso caso, ball_n.png .

Vá até a sua pasta $cdmaterials e verá que tem dois arquivos: um VMT e um VTF. Abra o VMT. Deve ser mais ou menos isso:
Código:
"LightmappedGeneric"
{
   "$basetexture" "models/otherm/samusvaria/ball_n"
}
Se você atualizar o HLMV, verá que seu prop está invisível. Faça as seguintes mudanças:
Código:
"VertexLitGeneric"
{
   "$basetexture" "models/otherm/samusvaria/ball_n"
   "$halflambert" 1
}
Simples, não? Agora seu prop já está prontinho.
Vamos agora entrar no mundo complicado de RAGDOLLING.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Qua Abr 03, 2013 5:07 pm

RAGDOLLING 1: OTIMIZANDO

Vamos para o que interessa: ragdolling propriamente dito. Nesse tutorial só estarei demonstrando como fazer ragdolls humanos, se precisar eu faço um pra não-humanos também (é mais complicado).
Para este tutorial, vou demonstrar o ragdolling por meio de um modelo de um personagem conhecido: Solid Snake.

Vamos começar abrindo nosso arquivo .3ds. Vejam que está uma droga.



A primeira coisa a fazer é apertar SHIFT+T, definir os paths das texturas e anotar o nome de todos os arquivos que estão sendo usados, para podermos usar no VTFEdit depois. Lembre-se de deletar os objetos inúteis.



Obs.: seu modelo pode estar sem textura nenhuma. Neste caso, você terá que colocar as texturas manualmente (simplesmente arraste os arquivos para seus respectivos objetos).

O segundo passo é consertar o problema dos polígonos invertidos. Selecione "Element" na opção "Editable Mesh" e selecione os lugares que parecem estar "de dentro pra fora" (no nosso caso, todos).



Em seguida, ache a opção "Flip" e aperte. Voila! (obs: pode ser que o seu modelo esteja muito poligonal. Nesse caso, selecione as partes poligonais e selecione um "Smoothing Group", é uma das últimas opções.)



Faça isso com todos os lugares invertidos. Em seguida, junte tudo em um único objeto. Já estamos na metade do caminho.



Agora, só falta girar o objeto para que ele fique "de frente" (note que ele estava "deitado") e redimensionar com a ajuda do nosso amigo phymodel. Mas isso você já sabe fazer.



Agora é só adicionar os bones, que irei explicar na próxima parte.


Última edição por MauroC em Sab Abr 20, 2013 8:59 am, editado 2 vez(es)
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Sex Abr 05, 2013 2:06 pm

RAGDOLLING 2: BONES

Bom, agora que que já temos nosso modelo pronto, é hora de possibilitar o movimento. Para isso vamos ter que criar seu esqueleto.
O esqueleto é basicamente isso: um conjunto de ossos que quando se movimentam, levam alguns vértices juntos. São formados por duas partes: bones e o envelope.
A maioria dos tutoriais te ensina a fazer seus próprios bones, mas nós vamos usar os oficiais do HL2 porque assim temos menos chance de cometer erros.
Comece abrindo seu modelo. Vá em Import - Merge e escolha nosso amiguinho phymodel.max. Só que desta vez, importe tudo.

Agora delete o modelo do phymodel (deixe só os bones) :

Clique com o botão direito no seu modelo, clique em Object Properties e congele ele e deixe transparente:


O próximo passo é um pouquinho complicado: você tem que "encaixar" os bones dentro do seu modelo (use a ferramenta de Girar). Veja como ficou:

Descongele o seu modelo (botão direito - Unfreeze All) e faça ele ficar visível novamente (See-Through no Object Properties). Vá na aba Modify e adicione a ele um modifier Skin:

Agora, temos que adicionar todos os nossos bones para esse Skin:


Acabamos de fazer a primeira parte. Agora, temos que fazer a envelopagem, que é um processo bem complicado.
Primeiro, gire os bones para que seu modelo fique na posição referência (pose-T) :


Se sua reação foi "WTF", parabéns, você é normal. O que aconteceu é que os bones dos braços puxaram alguns vértices do corpo junto. O processo que vamos fazer agora, chamado envelopagem, consiste em determinar quais vértices estão ligados a quais bones (algo análogo no corpo humano seria quais músculos se movem com quais ossos).

Para começar a envelopagem, vá em Skin, Edit Envelope (lembre-se de marcar Select Vertices) e selecione algum bone que esteja com os vértices puxados (você vai ter que fazer envelopagem com todos, até os que estão normais)

Nesse caso, eu selecionei esses vértices que foram puxados para perto da mão:

Mude o Abs. Effect desses vértices para 1,0 (significa que eles acompanharão 100% o movimento da perna). Note que eles voltaram para seus devidos lugares:

Faça a envelopagem com todos os bones até ter um bom resultado (dica: movimente os bones de vez em quando para ver se nenhum vértice está fora de lugar, mas lembre-se de deixá-lo na pose-T). Para as mãos, você pode envelopar todos os vértices para o valvebiped_hand (não use os fingerbones ainda). Veja como ficou:


Pronto! Se você conseguiu fazer um bom trabalho (ou não), seu ragdoll está quase pronto. Lembre-se: para melhores resultados, teste o movimento agora (vai te poupar um trabalhão).

Exporte seu modelo duas vezes:
ragdoll.smd (Skeletal Animation)
reference.smd (Reference)


Última edição por MauroC em Sex Abr 05, 2013 2:13 pm, editado 1 vez(es)
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Sex Abr 05, 2013 2:13 pm

RAGDOLLING 3: COLLISION MODELS

Essa parte é bem curta. Bem, o jogo precisa de um modo de calcular as colisões entre os objetos. No caso de um prop, seu modelo de colisão é seu modelo de referência. Mas e no caso de um ragdoll, quando a posição dos vértices fica mudando?

Novamente, a maioria dos tutoriais te ensina como fazer seus próprios modelos de colisão, e é um processo meio complicado também. Para ragdolls não-humanos, você tem que criar seus próprios bones e seu próprio modelo de colisão (além de ter que definir todas as jointconstraints, que veremos depois). Como nosso ragdoll é humano, podemos usar o modelo que foi (é) usado para os personagens de HL2.

Abra o nosso caro phymodel.max:

Já foi meio caminho andado. Exporte o seguinte arquivo:

phymodel.smd (Reference)

Pronto! Acabamos essa parte. Seu ragdoll agora está quase pronto para ser compilado. Só falta fazer o .qc (veremos na próxima parte) e converter as texturas, mas esse você já sabe fazer.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Sex Abr 05, 2013 2:31 pm

PARTE 10: QC DE UM RAGDOLL

Nessa parte vamos aprender como é o .qc de um ragdoll. Basicamente, ele só vai ser diferente em um aspecto: vamos ter que fazer as jointconstraints. Já vou explicar o que é isso. Nosso QC:
Código:
$cd "C:\Users\Maurinho\Documents\3dsMax\export\SSNAKE"
$surfaceprop "flesh"
$modelname "ssnake.mdl"
$cdmaterials "models\MGS"
$model snake "reference.smd"
$sequence ragdoll    "ragdoll.smd" FPS 30       activity ACT_DIERAGDOLL 1
$collisionjoints "phymodel.smd" {

   $mass 90.0
   $inertia 10.00
   $damping 0.01
   $rotdamping 1.50
   $rootbone "valvebiped.bip01_pelvis"
   $jointmerge "valvebiped.bip01_pelvis" "valveviped.bip01_spine"

   $jointconstrain "valvebiped.bip01_spine2" x limit -48.00 48.00 0.00
   $jointconstrain "valvebiped.bip01_spine2" y limit -25.00 25.00 0.00
   $jointconstrain "valvebiped.bip01_spine2" z limit -25.00 50.00 0.00

   $jointconstrain "valvebiped.bip01_r_upperarm" x limit -39.00 39.00 0.00
   $jointconstrain "valvebiped.bip01_r_upperarm" y limit -79.00 95.00 0.00
   $jointconstrain "valvebiped.bip01_r_upperarm" z limit -93.00 23.00 0.00

   $jointconstrain "valvebiped.bip01_l_upperarm" x limit -30.00 30.00 0.00
   $jointconstrain "valvebiped.bip01_l_upperarm" y limit -95.00 84.00 0.00
   $jointconstrain "valvebiped.bip01_l_upperarm" z limit -86.00 26.00 0.00

   $jointconstrain "valvebiped.bip01_l_forearm" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_forearm" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_forearm" z limit -149.00 4.00 0.00

   $jointconstrain "valvebiped.bip01_l_hand" x limit -37.00 37.00 0.00
   $jointconstrain "valvebiped.bip01_l_hand" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_hand" z limit -57.00 59.00 0.00

   $jointconstrain "valvebiped.bip01_r_forearm" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_forearm" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_forearm" z limit -149.00 4.00 0.00

   $jointconstrain "valvebiped.bip01_r_hand" x limit -60.00 60.00 0.00
   $jointconstrain "valvebiped.bip01_r_hand" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_hand" z limit -57.00 70.00 0.00

   $jointconstrain "valvebiped.bip01_r_thigh" x limit -97.00 32.00 0.00
   $jointconstrain "valvebiped.bip01_r_thigh" y limit -12.00 12.00 0.00
   $jointconstrain "valvebiped.bip01_r_thigh" z limit -75.00 8.00 0.00

   $jointconstrain "valvebiped.bip01_r_calf" x limit -12.00 126.00 0.00
   $jointconstrain "valvebiped.bip01_r_calf" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_calf" z limit 0.00 0.00 0.00

   $jointconstrain "valvebiped.bip01_head1" x limit -20.00 20.00 0.00
   $jointconstrain "valvebiped.bip01_head1" y limit -25.00 25.00 0.00
   $jointconstrain "valvebiped.bip01_head1" z limit -30.00 30.00 0.00

   $jointconstrain "valvebiped.bip01_l_thigh" x limit -93.00 30.00 0.00
   $jointconstrain "valvebiped.bip01_l_thigh" y limit -12.00 12.00 0.00
   $jointconstrain "valvebiped.bip01_l_thigh" z limit -73.00 6.00 0.00

   $jointconstrain "valvebiped.bip01_l_calf" x limit -8.00 126.00 0.00
   $jointconstrain "valvebiped.bip01_l_calf" y limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_calf" z limit 0.00 0.00 0.00

   $jointconstrain "valvebiped.bip01_l_foot" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_l_foot" y limit -19.00 19.00 0.00
   $jointconstrain "valvebiped.bip01_l_foot" z limit -15.00 35.00 0.00

   $jointconstrain "valvebiped.bip01_r_foot" x limit 0.00 0.00 0.00
   $jointconstrain "valvebiped.bip01_r_foot" y limit -25.00 6.00 0.00
   $jointconstrain "valvebiped.bip01_r_foot" z limit -15.00 35.00 0.00

   

   $jointcollide valvebiped.bip01_l_forearm valvebiped.bip01_pelvis
   $jointcollide valvebiped.bip01_r_forearm valvebiped.bip01_pelvis
   $jointcollide valvebiped.bip01_l_forearm valvebiped.bip01_spine2
   $jointcollide valvebiped.bip01_r_forearm valvebiped.bip01_spine2
   $jointcollide valvebiped.bip01_r_thigh valvebiped.bip01_l_thigh
   $jointcollide valvebiped.bip01_r_calf valvebiped.bip01_l_calf
   $jointcollide valvebiped.bip01_l_foot valvebiped.bip01_r_foot
   $jointcollide valvebiped.bip01_l_foot valvebiped.bip01_r_calf
   $jointcollide valvebiped.bip01_r_foot valvebiped.bip01_l_calf
   $jointcollide valvebiped.bip01_l_forearm valvebiped.bip01_l_thigh
   $jointcollide valvebiped.bip01_l_forearm valvebiped.bip01_r_thigh
   $jointcollide valvebiped.bip01_r_forearm valvebiped.bip01_l_thigh
   $jointcollide valvebiped.bip01_r_forearm valvebiped.bip01_r_thigh
}
Copie e cole isso no seu qc. Faça as alterações necessárias nos comandos que você já conhece (exceto o $sequence, deixe ele assim).

Note que temos um bloco gigante $collisionjoints. Esses comandos, em especial o $jointconstrain, determina o quanto o bone pode girar. Usando o HLMV, você pode usar qualquer valor que você quiser, para deixar o seu ragdoll mais rígido ou mais flexível, mas esses que eu coloquei são os padrões para um humano. Portanto, deixe ele assim.

Agora, salve e compile seu modelo, do mesmo jeito que você fez com o prop. Converta todas as texturas e pronto! Seu ragdoll está prontinho para ser usado (verifique se tudo está certo no HLMV antes de usá-lo) e colocado em um addon.

Na próxima parte vamos aprender algumas técnicas para melhorar as texturas do seu modelo.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Sex Abr 05, 2013 3:19 pm

PARTE 11: SHADERS

Bom, até agora, esse era o VMT que você estava utilizando:
Código:
"VertexLitGeneric"
{
  "$basetexture" "models/otherm/samusvaria/ball_n"
  "$halflambert" 1
}
Vamos agora mostrar algumas técnicas para deixar suas texturas mais bonitas.

$alphatest

Faz um passe alpha na textura. Significa que, se a textura tiver transparência (geralmente, texturas de sobrancelhas, etc), essa transparência será usada no jogo. Note que esse parâmetro não é opcional, você só irá usá-lo quando for necessário.
Uso:
Código:
"$alphatest" 1

$bumpmap

Indica o bumpmap do material. Um bumpmap é uma textura cinza especial que serve para indicar a profundidade dos lugares na textura (basicamente, ele especifica a difusão da luz no material). Para converter um bumpmap, clique em Generate Normal Map nas opcões de conversão do VTFEdit e desmarque o Create VMT Files.
O bumpmap do Snake, por exemplo:

Uso:
Código:
"$bumpmap" "models\suatextura"

$envmap

O comando envmap simplesmente faz com que seu material tenha reflexão especular, ou seja, ele vai ter propriedades de reflexão de um metal.
Uso:
Código:
"$envmap" "env_cubemap"

Ambient Occlusion

Efeito especial de reflexão usado em rostos e olhos. Nota que você deve ter uma textura especial para isso.
Exemplo de ambient occlusion:

Uso:
Código:
"$ambientocclusion" 1
"$AmbientOcclColor" "[R G B]"  //deafult [0.33 0.33 0.33]
"$AmbientOcclTexture" "models\suatextura"

Phong Reflection

Esse é provavelmente o efeito de reflexão mais complicado. Ele requer uso de três parâmetros: o exponent (determina o "tamanho" do ponto principal de reflexão), o boost (aumenta os efeitos do phong) e os fresnel terms (determinam o tanto de rim lighting).
Uso:
Código:
"$phong" 1
"$phongexponent" 20  //deafult = 5
"$phongboost" 2  //deafult = 1
"$phongfresnelranges" "[X Y Z]"  //deafult [0.05 0.5 1], onde X=refletividade no ângulo de visão 0; Y=refletividade no ângulo de visão 45; Z= refletividade no ângulo de visão 90.
Para te ajudar a entender:



Na próxima parte vamos aprender outro tipo especial de shader, mas, por enquanto, isso é tudo o que você precisa saber.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Sex Abr 05, 2013 11:22 pm

RAGDOLLING 4: FINGERPOSING

Agora que já fez seu ragdoll e ele está funcionando bem (ou não), você deve estar querendo fazer as partes mais técnicas e estéticas, como os "posings".

Vamos começar com o fingerposing, que é bem simples.
É só você ter todos os bones das duas mãos (mesmo se for um ragdoll sem um braço, precisa ter todos os bones).

Fazer o fingerposing também é fácil. Em vez de colocar a mão inteira pra só um bone, é só fazer a envelopagem dos bones dos dedos. Cada dedo tem três partes. Sabendo disso, com seus conhecimentos de Gmod, acho que dá pra fazer sozinho, né?

Falando sério, não vou entrar em detalhes porque sou horrível nisso. Meu fingerposing sempre sai bugado. Mas é assim que se faz. Fácil, não?
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 08, 2013 2:36 pm

RAGDOLLING 5: EYEPOSING

Depois de muita preguiça, finalmente, a parte 5!
Eyeposing na verdade é muito fácil. Você só vai precisar anotar uns números e fazer um cálculo matemático.

Mas vamos começar. A primeira coisa que temos que ter é uma textura para o olho. Agora duplique essa textura. Tenha uma com o nome "eyeball_l" e a outra com o nome "eyeball_r".

Não usarei o modelo do Snake porque ele não tem uma textura do olho própria. Vamos então usar esse ragdoll do Adam Malkovich. Primeiro, você deve selecionar os dois olhos e transformá-los em objetos separados:

Certinho? Arraste as texturas para seus respectivos olhos e junte tudo de novo num objeto só usando o "Attach".

Agora vamos precisar definir um shader especial para os olhos. Até agora temos usado o VertexLitGeneric, que calcula a reflexão dos vetores de luz baseado na geometria triangular da superfície do nosso modelo. Agora vamos aprender a usar um novo shader, chamado EyeRefract.

Converta suas duas texturas, "eyeball_l e "eyeball_r" para VTF. Tenha dois VMTs também, eles serão iguais. Veja como deve ficar seu VMT:
Código:
"EyeRefract"
{
   "$Iris" "models/otherm/adamuniform/adam_eye"
   "$Envmap" "models\otherm\adamuniform\eye-reflection-cubemap-"
   "$AmbientOcclTexture" "models\otherm\adamuniform\eye-ambient"
   "$CorneaTexture" "models\otherm\adamuniform\eye-cornea"
   "$EyeballRadius" "0.3"
   "$Dilation" "0.5"
   "$ParallaxStrength" "0.25"
   "$CorneaBumpStrength" "1"
   "$AmbientOcclusion" "1"
   "$AmbientOcclColor" "[0.33 0.33 0.33]"

   "$halflambert" 1
   "$nodecal" 1
}
Copie e cole no seu VMT, vamos ver o que você vai precisar mudar:
$Iris : a textura do olho propriamente dito.
$EyeballRadius : o raio do olho (deafult 0.5)
$Dilation : o quanto a íris fica dilatada (deafult 0.5)
$AmbientOcclColor : a cor do ambient occlusion (deafult 0.33 0.33 0.33)

O resto deixe igual. Note que tem três texturas especiais, eye_ambient, eye_cornea e eye_reflection_cubemap. Naturalmente, eu disponibilizei esses arquivos para você baixar:
https://www.dropbox.com/s/9xse9ha1zhfiyyt/eye-ambient.vtf
https://www.dropbox.com/s/9aiuuebuvl6onxx/eye-cornea.vtf
https://www.dropbox.com/s/8mrpn64xa91lqc7/eye-reflection-cubemap-.vtf

Agora vamos precisar especificar o eyeposing no qc. Para isso, teremos que encontrar as coordenadas de cada olho. Volte no 3ds Max. Desta vez, escolha selecionar por Vertex, selecione o vértice central de cada olho e copie suas coordenadas:

Agora, teremos que colocar a seguinte linha duas vezes no qc:
Código:
eyeball side ValveBiped.Bip01_Head1 X Y Z eye_vmt diameter angle texture iris_scale
Vamos explicar cada um dos parâmetros:

side: coloque lefteye ou righteye (se for o olho esquerdo ou direito)
X Y Z: obviamente, as coordenadas que você obteve no 3ds Max.
eye_vmt: o nome da textura do seu olho (eyeball_l ou eyeball_r)
diameter: o diâmetro do olho. Deixe no valor deafult, 1.000
angle: o ângulo que os olhos estarão desfocados. Geralmente, você vai usar um valor de 2 a 4 (olho esquerdo) e -2 a -4 (direito).
texture: isso nem sei porque tem ainda, coloque o nome de qualquer VMT do seu ragdoll.
iris_scale: a escalagem da sua textura, o deafult é mais ou menos 0.65.

Veja como ficou o meu:
Código:
eyeball lefteye ValveBiped.Bip01_Head1 0.510 -3.028 68.605 eyeball_l 1.000  4.000 adam_face 0.630
eyeball righteye ValveBiped.Bip01_Head1 -1.962 -3.028 68.605 eyeball_r 1.000  -4.000 adam_face 0.630
Nota: coloque essas linhas dentro do comando $model.

Agora chegou a hora do temido cálculo. Temos que fazer um attachment para os olhos, senão eles não serão reconhecidos pelo engine. Para isso, usamos o seguinte comando (fora do $model) :
Código:
$attachment "eyes" "ValveBiped.Bip01_Head1" X Y Z absolute
A única coisa que temos que colocar são os valores XYZ. Naturalmente, o Y e o Z serão os mesmos. Mas o X é a média aritmética entre as posições X dos dois olhos. Que difícil, não?

E agora só falta colocarmos um último parâmetro, que vai dentro do $model, para dizer que queremos que os olhos se movam:
Código:
flexcontroller eyes range -45 45 eyes_updown
flexcontroller eyes range -45 45 eyes_rightleft

Salve e compile. Pronto! Não foi tão difícil.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Ter Abr 09, 2013 5:53 pm

RAGDOLLING 6: SKINS E BODYGROUPS

Vamos lá pessoal, não deu nem meia página ainda, estamos acabando de começar...
Essa parte é importante, pois ajuda você a economizar espaço (e trabalho)!
Vamos começar falando de skins (ou skingroups).

Vamos imaginar que seu personagem tenha dois estilos de roupa diferentes (ex: um terno e uma roupa normal, sei lá). Na pasta do seu modelo tem duas texturas diferentes. Então o que você faz? Cria dois .MDLs, obviamente!
ERRADO.
Você pode criar um único ragdoll que utiliza as duas texturas como skins diferentes!
Para isso, basta jogar este comando aqui:
Código:
$texturegroup skinfamilies
{
   { "original1"  "original2"  ...  "originalX"  }
   { "replace1_1"  "replace1_2"  ...  "replace1_X" }
   { ...          ...          ...  ...          }
   { "replaceX_1"  "replaceX_2"  ...  "replaceX_X" }
}

Vamos agora explicar o uso. Basicamente, você coloca os VMTs originais na primeira linha e coloca os VMTs da skin nas outras linhas! Você nem precisa especificar os materiais que não mudam!
Exemplos:
Código:
$texturegroup skinfamilies
{
        { "carinha_main"  }        \\skin deafult
        { "carinha_terno" }        \\skin alternativa
}
Para mais de uma textura:
Código:
$texturegroup skinfamilies
{
        { "carinha_main"          "calça_main"  }        \\skin deafult
        { "carinha_terno"        "calça_terno" }          \\skin do terno
        { "carinha_terno"        "calça_main"  }          \\terno com calça normal
}

Usando skins, você diminui o tamanho do seu addon e o número de modelos que o jogo tem que carregar.

Bodygroups tem uma função similar. Vamos imaginar que o seu personagem tenha um chapéu. Você não vai criar dois ragdolls, um com e um sem chapéu. Você vai fazer um ragdoll com chapéu removível, ou até com vários chapéus.

Vamos usar para este exemplo um modelo da Samus (que eu não alterei, por isso está sem texturas). Veja como está o modelo principal:

Note que ela está careca. Isso é porque vamos ter dois bodygroups diferentes para o cabelo, veja:



Importante: veja como, mesmo sendo o modelo só de parte do ragdoll, você DEVE ter todos os bones nos bodygroups.

Para colocarmos bodygroups no .qc, usamos o seguinte parâmetro:
Código:
$bodygroup name
{
      blank
      studio "model1.smd"
      studio "modelN.smd"
}
"name" é o nome que vai aparecer no menu do GMod, ex: hair, hat, etc.
Um bodygroup "blank" é simplesmente o bodygroup deafult, ou seja, sem nada (neste caso, careca).
Lembrando que um bodygroup não substitui nada no modelo principal (ex: se o seu blank tiver um chapéu, colocar um bodygroup vai fazer com que ele fique com dois chapéus).

Para o nosso exemplo, ficamos com:
Código:
$bodygroup hair
{
        studio "samus_bob.smd"
        studio "samus_ponytail.smd"
}

Não colocamos um "blank" porque obviamente não queremos ela careca.
Precisaremos separar um modelo em vários SMDs novamente na próxima parte.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Qua Abr 10, 2013 2:25 pm

FACEPOSING 1: DIVISÃO EM VÁRIOS SMDS

Atenção. Vamos agora entrar em uma parte extremamente chata e difícil do ragdolling: FACEPOSING.
Se você teve dificuldades até agora, adquira um pouco mais de prática antes de prosseguir. Se você acha que ragdolling é uma moleza, continue, mas se prepare para chorar.

No faceposing, vamos ter que criar várias cópias de um modelo, cada uma com uma expressão facial. Para isso, é muito mais fácil fazer cópias apenas do rosto (ocupa menos espaço e fica mais fácil de manusear). Para isso, vamos ter que dividir nosso modelo em dois SMDs (como se fossem bodygroups obrigatórios).

Vamos utilizar novamente o Snake como exemplo. Primeiro, apagamos tudo menos a cabeça e exportamos um SMD (snake_head)

E depois apagamos a cabeça e exportamos outro SMD (snake_main)


Aí no qc, a única coisa que temos que fazer são essas modificações:
Código:
$model snake "reference.smd"  \\em vez disso...

$model main "snake_main.smd"
$model head "snake_head.smd"  \\fazemos isso!

Pronto! Faça isso no modelo que você for fazer faceposing.

Na próxima parte veremos como fazer expressões faciais.


Última edição por MauroC em Sab Abr 20, 2013 11:50 am, editado 1 vez(es)
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 15, 2013 4:54 pm

FACEPOSING 2: FAZENDO AS EXPRESSÕES

Bom, agora é hora de fazermos as expressões faciais do nosso personagem. Para isso temos dois métodos:
EDIÇÃO DE VÉRTICES: mais difícil
FACEBONES: mais fácil, mas nem sempre pode ser usada

Vamos começar com edição de vértices, com o nosso conhecido Snake. Abra o SMD só da cabeça e copie o modelo (clique com botão direito - Clone). Vamos colocar o nome de "smile" porque vamos fazer uma expressão de sorriso (o nome que você colocar aqui é o nome que será usado no Garry's Mod!)

Delete a Skin (clique direito - Delete) :


Agora, vá em Editable Mesh - Vertices e mova os vértices para criar uma expressão, assim como eu fiz:

Fazendo agora do outro lado, temos nossa expressão terminada (nota: eu sou uma droga nisso)

Continue fazendo isso até você ter um modelo de cada expressão que você quiser.

Quanto ao método de facebones, você só vai poder usá-lo quando seu modelo já vem com o rosto envelopado (o que aconteceu comigo com os modelos de Other M que baixei). Vamos começar com nosso modelo "blank" (o que está na Skin do ragdoll) e o modelo que vamos editar:

Agora, simplesmente vamos mover os bones para conseguir nossa expressão:


Preste atenção agora. Copie só o modelo (na imagem os bones estão copiados também, mas foi uma cagada minha) e dê um clique direito em Skin - Collapse All:

Pronto! Para fazer mais expressões, continue editando os bones, copie o modelo e Collapse All.


IMPORTANTE: A sua referência para expressões é essa aqui: https://developer.valvesoftware.com/wiki/Character_Facial_Animation_Shapekey_Set
(Flexes oficiais para personagens do HL2)

Claro, não precisa fazer todas, faça apenas as que você achar necessário.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 15, 2013 5:12 pm

FACEPOSING 3: AUTOKEY

Agora vamos precisar fazer algo chato: Autokey. Isso consiste em colocar vários frames de animação, cada um com uma expressão. Vamos começar adicionando um modifier "Morpher" para o nosso modelo (note que eu fiz mais duas expressões) :


Vamos agora clicar em "Pick Object from Scene":

Selecione cada uma das suas expressões para um canal de morpher diferente (se você não consegue selecionar, é porque tem diferença no número de vértices, você deve ter deletado ou adicionado alguma coisa)


Agora vamos fazer o autokey. Você vai notar que parece fácil, mas é realmente chato quando você tem um modelo com mais de 20 flexes.
Comece selecionando Frame 1, clique no Auto Key e coloque a primeira expressão a 100% e as outras a zero:

Nota: mesmo as expressões que estão a 0% DEVEM TER O QUADRADINHO VERMELHO. Se não tiverem, irão ocorrer glitches no seu faceposing (devido ao intertweening automático do 3ds Max).
Vamos ir para o frame 2 e repetir o processo:

E novamente para o frame 3:


Agora saia do Auto Key e pronto! (imagine fazer isso com 20 frames e 20 flexes...) Agora, para exportar, selecione seu modelo principal e os bones da Skin do ragdoll (os valvebipeds) e vá em Export Selected - Source Vertex Animation (VTA)


Agora só falta colocar isso no qc.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 15, 2013 5:24 pm

FACEPOSING 4: FLEXES NO QC

Vamos agora colocar o faceposing no qc. Não é tão difícil assim.

Vamos começar definindo um $attachment para a cabeça:
Código:
$attachment "anim_attachment_head" "ValveBiped.Bip01_Head1" X Y Z absolute
Pode usar o mesmo X e Z que você usou para os olhos, mas deixe o Y como 0.000 .

Temos agora que definir os flexes, e isso pode ser meio chato. Primeiro, coloque este comando: (ATENÇÃO: TUDO DAQUI PRA FRENTE ESTÁ DENTRO DO $model head)
Código:
flexfile "path"
Sendo "path" o nome do seu arquivo VTA.

Comecemos agora a escrever os flexes. Um flex é escrito em três linhas assim:
Código:
   flex "name" frame number
   flexcontroller "phoneme" "name" "range" 0 1
   %name = name
name: o nome da expressão que você colocou no 3ds Max
number: o frame em que essa expressão está

Então, as expressões que fizemos na última parte ficariam assim:
Código:
flexfile "samus_expressions.vta"
flex "smile" frame 1
flexcontroller "phoneme" "smile" "range" 0 1
%smile = smile

flex "mouth_open" frame 2
flexcontroller "phoneme" "mouth_open" "range" 0 1
%mouth_open = mouth_open

flex "mad" frame 3
flexcontroller "phoneme" "mad" "range" 0 1
%mad = mad

Apesar de não termos feito isso, é de costume colocar um flex "blank" de vez em quando (para evitar bugs) mas isso nem sempre é necessário.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 15, 2013 5:27 pm

FINALIZANDO

Obrigado por acompanhar e ler este tutorial, que demorou muito tempo para ficar pronto. Eu espero que você possa cada vez mais acumular conhecimentos com a prática, e que possa fazer muitos addons para Garry's Mod. entrega um diploma
-MauroC


DÚVIDAS E PERGUNTAS E OUTROS AFINS: PODEM COMENTAR
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por 'Mave em Seg Abr 15, 2013 5:47 pm

Krl, fico mt bom mesmo asuaushaus
seu desenho tbm XD
Mas, antes de fazer tudo isso aí, eu preciso de um model certo?Mas os q eu quero n tem em lugar nenhum.Aonde q eu crio um?
avatar
'Mave
Special Member
Special Member

Inscrição : 19/03/2013
Idade : 18
Localização : Na puta que pariu

Ver perfil do usuário http://fc04.deviantart.net/fs70/f/2011/182/5/0/my_new_fursona_by

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Seg Abr 15, 2013 5:52 pm

Parte 2. Você pode criar um no 3ds Max (se você souber fazer modelagem 3D) ou conseguir um na internet, com os métodos que eu coloquei lá (especialmente o Models Resource, tem bastante coisa legal lá).
EDIT: Se você não conseguiu achar, eu posso te ajudar a ripar eles diretamente do jogo, é só me dar um toque na steam.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por ElGringo em Ter Abr 16, 2013 9:56 pm

Caramba, isso ta muito bom ! não tive tempo de ler ele completo mas pretendo, ta nos favoritos aqui. Parabéns.
avatar
ElGringo
Special Member
Special Member

Inscrição : 11/05/2012
Emprego/lazer : Professor
Localização : Santa Catarina

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por Xalalau em Ter Abr 16, 2013 11:05 pm

UHULL!!! Pena q perdi o primeiro comentario UHAESHUASE
Mas foi por um boa causa =3

Esse tutorial ta simplesmente FODA! Belissima traduçao de portugues maravilhoso e mto bem organizada!!! (Desculpa pelos acentos aih #teclado #ruim)

Esse tutorial n sai do ar ATE a minha MORTE! AUHSEHuasE
Amanha vou tomar uns cuidados com as imgs dele e divulgar =D

Vou salvar tb comigo ele todo editado certinho pra caso caia um meteoro no Forumeiros eu ainda possa te devolver o seu trabalho.

E, cara, eu dou um muito obrigado falando por todos nos!!! Pode ter certeza que nao tem outro tutorial em pt br como esse seu por ai. Sua contribuicao foi / vai ser mto boa para a comunidade =DD

Eu mesmo vou fazer um "teste de qualidade" nele qnd puder asuhehuase
A gente tem uns projetos legais de ragdolls aqui parados q nem começamos por razoes de noobice...

Ai, mto obrigado de novo =')

Vou tentar espalhar ao maximo seu post pra q as pessoas possam encontrar de boa!
avatar
Xalalau
Admin
Admin

Inscrição : 07/05/2012
Idade : 25
Localização : Rio de Janeiro

Ver perfil do usuário http://mrxalalau.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Qua Abr 17, 2013 12:14 pm

Valeu pessoal, eu queria que ficasse o melhor possível: objetivo, fácil de entender e com bastante ajuda visual. Vejo que eu consegui!
Podem testar e aplicar esse tutorial o quanto quiserem. Claro, tem 99% de chance que nas primeiras vezes vocês vão fazer alguma cagada, afinal, nos meus primeiros dias, eu era horrível nisso e meus ragdolls eram podres pra caramba...
E isso me traz a outro tópico: engenharia reversa faz maravilhas. Eu só melhorei nisso porque eu fiz muita engenharia reversa em inúmeros modelos.

E Xala, só 20% (as partes mais importantes) são traduzidas. O resto vem da minha experiência, tanto no ragdolling tanto como "professor"...

Mas, enfim, valeu pessoal, é ótimo poder passar os conhecimentos para frente.
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por Xalalau em Sex Abr 19, 2013 7:27 pm

AEW! Conforme prometi: Tutorial divulgado!!!

http://gmbrblog.blogspot.com.br/2011/10/tutoriais.html
http://steamcommunity.com/groups/gmbr2#announcements/detail/1568652965077289154
http://www.facebook.com/gmbroficial

Primeiramente vou deixar só aí, depois vou por mais links por aí na net.

EDIT:

CASO ALGUM DIA AS IMAGENS DO POST SUMAM!!!

Backup das imagens: mediafire.com ?cgztbmb9pou1noc
avatar
Xalalau
Admin
Admin

Inscrição : 07/05/2012
Idade : 25
Localização : Rio de Janeiro

Ver perfil do usuário http://mrxalalau.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por MauroC em Sab Abr 20, 2013 9:39 am

E uma perguntinha só: vocês gostariam que eu fizesse um tutorial de como fazer animações no 3ds Max (para sourcemodding), outro de como fazer ragdolls não-humanos e um de NPCs e Playermodels?
avatar
MauroC
Staff
Staff

Inscrição : 11/02/2013
Idade : 19
Emprego/lazer : Gênio/Estudante
Localização : Na vigésima sétima dimensão

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por Xalalau em Sab Abr 20, 2013 11:27 am

LoL, quanta coisa Oo

Faz o q vc quiser, a gente agradece =P
Só cuidado com o seu tempo aí pq eu sei q essas coisas consomem a sua alma UHASEUASE
avatar
Xalalau
Admin
Admin

Inscrição : 07/05/2012
Idade : 25
Localização : Rio de Janeiro

Ver perfil do usuário http://mrxalalau.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Tutorial de Ragdolling

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum