Inverse Kinematics
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Inverse Kinematics
Boa Noite :D, esta script esta dando um loop infinito no transform.rotation no objeto na qual eu coloco ela, que seria o INIMIGO.
Ela Inverte e faz o inimigo mirar para o player, porem ela envia as posisões x,z,y erradas no transform.rotation do INIMIGO e ele fica girando a parte do corpo na qual eu linkei "forearm "
Alguem pra dar uma dica? :cyclops:
Ela Inverte e faz o inimigo mirar para o player, porem ela envia as posisões x,z,y erradas no transform.rotation do INIMIGO e ele fica girando a parte do corpo na qual eu linkei "forearm "
- Código:
#pragma strict
var forearm : Transform;
var hand : Transform;
var target : Transform;
var transition : float = 1.0;
var elbowAngle : float;
private var armIK : Transform;
private var armRotation : Transform;
private var upperArmLength : float;
private var forearmLength : float;
private var armLength : float;
function Start () {
var armIKGameObject = new GameObject("IK");
armIK = armIKGameObject.transform;
armIK.parent = transform;
var armRotationGameObject = new GameObject("Rotation");
armRotation = armRotationGameObject.transform;
armRotation.parent = armIK;
upperArmLength = Vector3.Distance(transform.position, forearm.position);
forearmLength = Vector3.Distance(forearm.position, hand.position);
armLength = upperArmLength + forearmLength;
}
function Update () {
}
function LateUpdate(){
//Store rotation before.
var storeUpperArmRotation : Quaternion = transform.rotation;
var storeForearmRotation : Quaternion = forearm.rotation;
//Upper Arm looks target.
armIK.position = transform.position;
armIK.LookAt(forearm);
armRotation.position = transform.position;
armRotation.rotation = transform.rotation;
armIK.LookAt(target);
transform.rotation = armRotation.rotation;
//Upper Arm angle.
var targetDistance : float = Vector3.Distance(transform.position, target.position);
targetDistance = Mathf.Min(targetDistance, armLength - 0.00001);
var adjacent : float = ((upperArmLength*upperArmLength) - (forearmLength*forearmLength) + (targetDistance*targetDistance))/(2*targetDistance);
var angle : float = Mathf.Acos(adjacent/upperArmLength) * Mathf.Rad2Deg;
transform.RotateAround(transform.position, transform.forward, -angle);
//Forearm looks target.
armIK.position = forearm.position;
armIK.LookAt(hand);
armRotation.position = forearm.position;
armRotation.rotation = forearm.rotation;
armIK.LookAt(target);
forearm.rotation = armRotation.rotation;
//Elbow angle.
transform.RotateAround(transform.position, target.position - transform.position, elbowAngle);
//Transition rotations with animation rotation.
transition = Mathf.Clamp01(transition);
transform.rotation = Quaternion.Slerp(storeUpperArmRotation, transform.rotation, transition);
forearm.rotation = Quaternion.Slerp(storeForearmRotation, forearm.rotation, transition);
}
Alguem pra dar uma dica? :cyclops:
Última edição por NandoDine em Sex Nov 18, 2016 8:04 pm, editado 1 vez(es)
NandoDine- Membro
- PONTOS : 2977
REPUTAÇÃO : 5
Áreas de atuação : JS, PHP, MySQL, Web Design (Estudando C#)
Respeito as regras :
Re: Inverse Kinematics
Opa, já arrumei a script :D Tópico Resolvido!
NandoDine- Membro
- PONTOS : 2977
REPUTAÇÃO : 5
Áreas de atuação : JS, PHP, MySQL, Web Design (Estudando C#)
Respeito as regras :
Tópicos semelhantes
» SOBRE "IK" INVERSE KINEMATICS
» [RESOLVIDO] uma duvida de Inverse Kinematics
» [RESOLVIDO] Uma dúvida sobre Quaternion.Inverse
» [RESOLVIDO] uma duvida de Inverse Kinematics
» [RESOLVIDO] Uma dúvida sobre Quaternion.Inverse
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos