Cinemática Inversa (IK) é uma técnica comum em animação por computador para mover personagens de forma eficiente e interagir realisticamente com seu ambiente. O processo de criar um movimento realista para um personagem muitas vezes requer muitas iterações e pequenos ajustes nas várias articulações. Com IK, você pode posturar e animar várias partes do personagem ajustando um único objeto.
Essa técnica de animação pode fornecer soluções para os seguintes exemplos:
IKControl
Você pode usar um IKControl para adicionar IK de forma procedural aos seus rigs de personagem fora do Editor de Animação. O Studio permite que você aplique IK programaticamente a todos os personagens, como R15, Rthro e personagens importados personalizados, para criar movimentos e interações realistas em seu jogo.
Ao adicionar um IKControl, defina as propriedades necessárias corretamente para evitar resultados de animação inesperados e não naturais. Assim como em toda animação, teste seus IKControls para garantir que você alcance o comportamento desejado.
Propriedades necessárias
Ao adicionar um IKControl ao Humanoid ou AnimationController do seu personagem, você deve definir as seguintes propriedades necessárias para habilitar IK:
| Propriedade | Descrição |
|---|---|
| Type | Especifica o tipo de comportamento do controle IK. Veja Enum.IKControlType para a lista de opções de comportamento. Os tipos de comportamento comuns são Position ou Transform. |
| EndEffector | Uma BasePart ou Bone no rig do seu personagem que rastreia em direção ao Target. Por exemplo, você pode definir um osso LeftHand como um EndEffector para alcançar um objeto de maçaneta definido como o Target. |
| Target | O objeto que o EndEffector alcança ou aponta. Um Target pode ser qualquer objeto com uma posição no mundo. |
| ChainRoot | Define a cadeia de BaseParts ou Bones que o IKControl afeta. Todas as partes conectadas entre o ChainRoot e o EndEffector são afetadas pelo IKControl usando o tipo de comportamento definido. Por exemplo, se a LeftHand do seu personagem estiver definida como o Target, você pode aplicar IK em todo o braço esquerdo definindo o ChainRoot para o LeftUpperArm. Para aplicar IK apenas nas partes abaixo do cotovelo, defina o ChainRoot para o LeftLowerArm. |
Testar IKControls
Você pode adicionar e editar IKControl programaticamente ou diretamente através do Explorer. Você pode até adicionar e fazer alterações no IKControl durante um teste de Jogo para verificar rapidamente como várias propriedades afetam os movimentos de um personagem.
Para testar rapidamente seu IKControl usando um Attachment como alvo:
No mezzanino do Studio, inicie um teste de jogo.
Clique no ícone ⊕ ao lado do HumanoidRootPart do modelo do seu personagem e adicione um Attachment.

Selecione o Attachment e use a ferramenta Mover para posicionar o objeto na frente do seu personagem na viewport.

Na janela Explorer, selecione o ícone ⊕ ao lado do Humanoid do seu personagem e adicione um IKControl.

Selecione o IKControl e defina os seguintes valores de propriedade na janela Properties:
- Type: Selecione Transform no dropdown.
- Target: Selecione o novo objeto Attachment criado na Explorer.

Propriedades do IKControl 
Explorer - Modelo do Personagem O braço esquerdo do seu personagem agora deve alcançar o alvo Attachment. Você pode experimentar movendo o Attachment ou editando as propriedades do IKControl para alcançar resultados diferentes.
Adicionar restrições
Você pode usar Constraints para restringir como as articulações podem se mover ao alcançar seu alvo. As restrições podem garantir que articulações como os cotovelos e joelhos se dobrem de forma natural, ou para fazer as articulações mecânicas girarem em uma orientação específica.


Para adicionar restrições ao seu personagem usando IKControl, seu IKControl e a restrição devem atender às seguintes condições:
- Os attachments referenciados nas propriedades Attachment0/Attachment1 da restrição devem se conectar às mesmas partes que o Motor6D Part0/Part1.
- As posições relativas de Attachment0/Attachment1 devem ser iguais às posições correspondentes dos CFrames Motor6D C0/C1.
- A restrição e o IKControl compartilham o mesmo pai Model.
As instruções a seguir descrevem o processo de adicionar um HingeConstraint para restringir a rotação do cotovelo de um personagem e adicionar um BallSocketConstraint ao punho para limitar o ângulo de rotação.
Cotovelo
Os personagens Roblox R15 já incluem attachments em suas articulações que você pode usar para aplicar a restrição do cotovelo. Para o cotovelo, tanto o LeftUpperArm quanto o LeftLowerArm incluem um LeftElbowRigAttachment. Juntamente com a adição de uma restrição, você também precisa adicionar attachments filhos adicionais ao LeftElbowRigAttachment de cada parte para especificar em torno de qual eixo o cotovelo pode girar.
Para adicionar o HingeConstraint e os attachments filhos:
Na Explorer, localize o LeftLowerArm do seu modelo e clique no ⊕ button.
Adicione um HingeConstraint com o nome LeftElbowConstraint.
Na Explorer, navegue até o LeftUpperArm.LeftElbowRigAttachment e adicione um attachment:
Clique no ⊕ button para adicionar um Attachment com o nome LeftElbowConstraintAttachment0.
Na viewport, selecione o attachment e use a ferramenta Rotacionar para girar o attachment de modo que o PrimaryAxis amarelo seja o eixo da rotação esperada do seu cotovelo.

Defina a propriedade LeftElbowConstraint.Attachment0 para este novo attachment.
Na Explorer, navegue até o LeftLowerArm.LeftElbowRigAttachment do seu modelo e adicione um attachment:
- Clique no ⊕ button e adicione um Attachment com o nome LeftElbowConstraintAttachment1.
- Defina a propriedade LeftUpperArm.LeftElbowConstraint.Attachment1 para este novo attachment.
- Copie a propriedade LeftElbowConstraintAttachment0.CFrameOrientation e cole-a como o valor da propriedade LeftElbowConstraint.Attachment1.CFrameOrientation.

Teste seu IKControl para verificar se o cotovelo gira apenas em torno de seu eixo de dobradiça:
Pulsos
Mesmo com a restrição do cotovelo, o IKControl ainda pode produzir poses não realistas com os pulsos.

Você pode melhorar isso adicionando um BallSocketConstraint para limitar a rotação do pulso. Embora isso seja semelhante ao processo de adicionar um HingeConstraint ao cotovelo, você pode usar a propriedade LimitsEnabled nesta restrição para controlar ainda mais o alcance de movimento do pulso.
Para adicionar um BallSocketConstraint para o pulso:
- Na Explorer, localize o LeftHand do seu modelo e clique no ⊕ button.
- Adicione um BallSocketConstraint com o nome LeftWristConstraint.
- Localize o LeftLowerArm.LeftWristRigAttachment do seu modelo e adicione um attachment:
- Clique no ⊕ button e adicione um Attachment com o nome LeftWristConstraintAttachment0.
- Na viewport, selecione o attachment e use a ferramenta Rotacionar para girar o attachment de modo que o PrimaryAxis amarelo aponte para as pontas dos dedos do modelo.

- Defina a propriedade LeftWristConstraint.Attachment0 para o novo LeftWristConstraintAttachment0.
- Localize o LeftHand.LeftWristRigAttachment do seu modelo e adicione um attachment:
- Clique no ⊕ button e adicione um Attachment com o nome LeftWristConstraintAttachment1.
- Copie a propriedade LeftWristConstraintAttachment0.CFrameOrientation e cole-a como a propriedade LeftWristConstraintAttachment1.CFrameOrientation.
- Defina a propriedade LeftWristConstraint.Attachment1 para este novo LeftWristConstraintAttachment1.
- Na Explorer, selecione o LeftWristConstraint.
- Na janela Properties, defina o seguinte:
- Ative LimitsEnabled.
- Defina UpperAngle para 80. Isso controla quanto o eixo da restrição pode girar, e 80 graus é aproximadamente quanto o pulso deve ser capaz de se dobrar.
- Dependendo do seu personagem, você pode querer ajustar a direção que o cone está apontando. Você pode fazer isso usando a ferramenta Rotacionar para girar o Attachment0 da restrição.
Ao selecionar o LeftWristConstraint, um cone verde aparece visualizando o alcance de movimento do pulso.

Com a restrição configurada, teste o IKControl com a mão apontando para baixo na frente do personagem, e o pulso deve rotacionar e se dobrar de forma mais realista.