iron sight using inverse kinematic
I'm trying to accomplish a generic iron sight system, without any animation, that can be used with any handgun of any size that i define.
However i'm such a noob with Vector3 and Quaternions and maths.
Right now i have this gun with a child to locate the sights relatively to the gun :
Basically i want to place one transform over another, by moving a parent object of this transform and not the transform itself. So there are deltas and offsets involved.
This is the script i call when i want to calculate the position of the hand so that the gun is iron sighted in the center of the screen.
public void SetIronSightPosition(Weapon currentWeapon)
{
// IronSightCenterPos is the target position for the weapon sights. It's a child of the camera so always in center.
// currentWeapon is the weapon, its transform is whatever center was defined while modeling (not relevant, i think, for this script). Weapon is child of right hand.
// currentWeapon.SightsPosition is the transform of the sights of the weapon. it's a child of the weapon.
// _ikRightHandPos and _ikRightHandRot are the position and rotation of the right hand IK goal
// The script must place the weapon sights precisely on the IronSightCenterPos(pos + rot)
// Since the gun is placed through right hand IK, correct position and rotation offsets must be calculated. The target IK position must be stored in IronSightGunPos.
// In short, i must place currentWeapon.SightsPosition exactly over IronSightCenterPos, only by moving the right hand IK.
// Below is what i've tried yet, it doesn't work (imprecise + depends on player rotation)
// Get delta between IK hand and weapon sights
var deltaPos = currentWeapon.SightsPosition.position - _ikRightHandPos;
var deltaRot = Quaternion.Inverse(currentWeapon.SightsPosition.rotation) * _ikRightHandRot;
// Set IK iron sight position
IronSightGunPos.position = IronSightCenterPos.position;
IronSightGunPos.rotation = IronSightCenterPos.rotation;
IronSightGunPos.localRotation = deltaRot;
IronSightGunPos.localPosition = -1 * (deltaRot * -deltaPos);
}
Please help, and let me know if some information is missing.
Your answer
Follow this Question
Related Questions
Trying to transform my character's local position on a GetKey. 0 Answers
How do i calculate the outer bounds??? 0 Answers
Unity transform.forward issue 1 Answer
What is the difference between setting transform.eulerAngles and transform.rotation? 1 Answer
Make the correct rotation to face the gameobject to his direction 0 Answers