### IK Solver Question

Posted:

**Tue Oct 14, 2014 11:20 am**I would like to get the positional vector and orientation (Quaternion) from an animationstate at time t?

How can I do that?

Thanks

Jack

How can I do that?

Thanks

Jack

Support and community hang-out spot for Ogre3D

https://forums.ogre3d.org/

Page **1** of **1**

Posted: **Tue Oct 14, 2014 11:20 am**

I would like to get the positional vector and orientation (Quaternion) from an animationstate at time t?

How can I do that?

Thanks

Jack

How can I do that?

Thanks

Jack

Posted: **Tue Oct 14, 2014 4:15 pm**

Code: Select all

```
myAnimState->setTimePosition(t);
myEntity->_updateAnimation()
// read position / orientation data straight from your skeleton now
```

Posted: **Wed Oct 15, 2014 4:47 am**

It is actually yet another IK Solver question here.

I'd like to solve the IK every time step like this
And I've set the target like this
In the SolveIK function, I need to setTargetPosition for the interpolated positions rather than the target position,

so that the IK Solver can solve and update the skeleton, what interpolations functions can I use to interpolate the

left arm between the current position and the target position, and when should I apply it?

Thanks

Update:

Or should I do something like this?

Jack

I'd like to solve the IK every time step like this

Code: Select all

```
void Worker::SolveIK(Ogre::Real time) {
Ogre::Vector3 position = mLefthandChain->getPosition();
Ogre::Vector3 bonePos = mLefthandBone->getPosition();
//position.x -= MOVEMENT_SPEED * time;
//position.y += MOVEMENT_SPEED * time;
//Update skeleton, for intermediate positions
mOTSkeleton->solve();
mOTSkeleton->updateSkeleton();
}
```

Code: Select all

```
void Worker::SetTarget(Ogre::Vector3 target) {
mTarget = target;
// do interpolation here
}
```

so that the IK Solver can solve and update the skeleton, what interpolations functions can I use to interpolate the

left arm between the current position and the target position, and when should I apply it?

Thanks

Update:

Or should I do something like this?

Code: Select all

```
void Worker::SolveIK(Ogre::Real time) {
Ogre::Vector3 position = mLefthandChain->getPosition();
Ogre::Vector3 bonePos = mLefthandBone->getPosition();
//position.x -= MOVEMENT_SPEED * time;
//position.y += MOVEMENT_SPEED * time;
//Update skeleton, for intermediate positions
mOTSkeleton->solve();
mOTSkeleton->updateSkeleton();
}
void Worker::SetTarget(Ogre::Vector3 target) {
mLefthandChain->setTargetPosition(target);
// do interpolation here
}
```

Posted: **Wed Oct 15, 2014 5:26 am**

I've actually not implemented IK in Ogre, but I have used it in other frameworks. The way I've seen the API done is in the form of a manager that takes the following parameters:

- source bone

- target affector

- blend in time

- blend out time

From there you activate or deactivate blending, and it will do a linear interpolation between the real skeleton and your affector over the amount of time you specify with blend in/blend out. So it will boil down to something like this:

- source bone

- target affector

- blend in time

- blend out time

From there you activate or deactivate blending, and it will do a linear interpolation between the real skeleton and your affector over the amount of time you specify with blend in/blend out. So it will boil down to something like this:

Code: Select all

```
fInterpVal += Math::Clamp(frame_time * blendInOrOut, 0.0, 1.0);
vFinalPos = Math::lerp(vCurPos, vTargetPos, fInterpVal);
qFinalRot = Quaternion::Slerp(fInterpVal, qCurRot, qTargetRot);
// apply final position and rotation to the actual bone
```

Posted: **Wed Oct 15, 2014 7:34 am**

Hello,c6burns wrote:Code: Select all

`fInterpVal += Math::Clamp(frame_time * blendInOrOut, 0.0, 1.0); vFinalPos = Math::lerp(vCurPos, vTargetPos, fInterpVal); qFinalRot = Quaternion::Slerp(fInterpVal, qCurRot, qTargetRot);`

Thanks so much for helping!

I don't understand why we need to clamp the value to 0.0 or 1.0

because as far as interpolation is concerned, should we use a number *between* 0.0 to 1.0

Correct me if I am wrong!

Thanks

Jack

Posted: **Wed Oct 15, 2014 8:16 am**

Below is Math::Clamp
Clamp is just making sure we don't go above 1.0 or below 0.0 using std::max and std::min Anything in between those two values will be unaffected

You might do it differently and not need clamp, like by using an IK manager class with IK blend state classes, or however complex you want to get. I mainly just wanted to show you linear interpolation of positions using Math::lerp and spherical linear interpolation of orientations using Quaternion::Slerp

Code: Select all

```
/** Clamp a value within an inclusive range. */
template <typename T>
static T Clamp(T val, T minval, T maxval)
{
assert (minval <= maxval && "Invalid clamp range");
return std::max(std::min(val, maxval), minval);
}
```

You might do it differently and not need clamp, like by using an IK manager class with IK blend state classes, or however complex you want to get. I mainly just wanted to show you linear interpolation of positions using Math::lerp and spherical linear interpolation of orientations using Quaternion::Slerp

Posted: **Wed Oct 15, 2014 8:57 am**

Hello,

It works now.

But There seems to be working with rotations only, no translations.

So my question is now how do I ensure the end-effector reaches the target

with rotation allowed only?

So my quesitons are:

1) How can I test reachability?

2) How to interpolate the end-effector to the target with rotations only?

Thanks

Jack

It works now.

But There seems to be working with rotations only, no translations.

So my question is now how do I ensure the end-effector reaches the target

with rotation allowed only?

So my quesitons are:

1) How can I test reachability?

2) How to interpolate the end-effector to the target with rotations only?

Thanks

Jack

Posted: **Thu Oct 16, 2014 9:35 am**

You could test reachability by measuring the distance between the solution and the actual target.

I guess in IK you wouldn't need to alter the position of bones, just the rotations, since the limb of a skeleton is set up as a hierarchy. So altering the parent orientation will alter the position of the children appropriately. As I said I've never implemented IK, just used it in a turnkey engine ... my current ogre project only required physics ragdolls so I've left IK for another day.

I guess in IK you wouldn't need to alter the position of bones, just the rotations, since the limb of a skeleton is set up as a hierarchy. So altering the parent orientation will alter the position of the children appropriately. As I said I've never implemented IK, just used it in a turnkey engine ... my current ogre project only required physics ragdolls so I've left IK for another day.