## Custom joints latency

A place to discuss everything related to Newton Dynamics.

Moderators: Sascha Willems, walaber

### Custom joints latency

Hi,

I'm still developing an airhockey game. To move the mallet, I'm using a custom joint. Every graphics tick I update the joint with the new mouse position and let Newton calculate the necessary force to bring the mallet to the new position. Now, the problem is that there seems to be a small latency on the mallet. Is there any solution for this problem? This is how I initialize my joint:

Code: Select all
`        m_physicsJoint = NewtonConstraintCreateUserJoint(m_physicsWorld, 6, PhysicsJointCallback, m_physicsMallet, NULL);        NewtonJointSetUserData(m_physicsJoint, m_physicsMallet);        NewtonUserJointSetRowStiffness(m_physicsJoint, 0.98f);        NewtonUserJointSetRowAcceleration(m_physicsJoint, 1.0f); `

And this is my joint callback function:

Code: Select all
`   NewtonBody* body = (NewtonBody*) NewtonJointGetUserData(joint);   dMatrix matrix;   NewtonBodyGetMatrix(body, &matrix[0][0]);   dVector pin0(1.0,0.0,0.0);   dVector pin1(0.0,1.0,0.0);   dVector pin2(0.0,0.0,1.0);   dVector position;   position.m_x = MainWindow::m_currentMousePosition[0];   position.m_y = 1.3;   position.m_z = MainWindow::m_currentMousePosition[2];   // Update joint   NewtonUserJointAddLinearRow(joint, &matrix.m_posit[0], &position[0], &pin0[0]);   NewtonUserJointAddLinearRow(joint, &matrix.m_posit[0], &position[0], &pin1[0]);   NewtonUserJointAddLinearRow(joint, &matrix.m_posit[0], &position[0], &pin2[0]); `

I've already tried to speedup the process by multiplying the force vector in the force&torque callback with f.e factor k:

Code: Select all
`       dVector force;       NewtonBodyGetForce(m_physicsMallet, &force[0]);       force *= 5;       NewtonBodySetForce(m_physicsMallet, &force[0]);`

Maybe I shouldn't do it with joints, but then I lose the advantage of collision detection when the mallet hits the puck. Does anyone have a good idea tot solve this issue?

Greetz!
doggyboy

Posts: 4
Joined: Wed Jun 25, 2008 3:02 pm

### Re: Custom joints latency

I perform picking and dragging in my game and have found that applying spring forces myself in the force and torque callback works better than using a custom joint. You would apply a force proportional to the distance of the mouse to the mallet with some damping (F = k*x-damp*v).

However, the problem with your code is that you use NewtonUserJointSetRowStiffness and NewtonUserJointSetRowAcceleration when creating the joint, rather than in the callback. Put NewtonUserJointSetRowStiffness in the callback and remove NewtonUserJointSetRowAcceleration since that replaces the forces calculated by the engine to enforce the constraint. Try changing this first and see if it gets better. With the exact solver, the result with the custom joint may be acceptable.

- Andrew
andrew11

Posts: 3
Joined: Sun Sep 25, 2005 9:44 pm

### Re: Custom joints latency

Hi,

I've removed the NewtonUserJointSetRowAcceleration and putted NewtonUserJointSetRowStiffness in the callback, but the result stays the none or less same. During some previous tests, I've already tried to use spring force, but that gives strange results. The mallet actually keeps bouncing around the destination point. Maybe you can explain to me how I should set the parameters from the damping term to avoid this strange behavior?

Greetz,
Doggyboy
doggyboy

Posts: 4
Joined: Wed Jun 25, 2008 3:02 pm

### Re: Custom joints latency

The way to reduce the bouncing around is by using what's called a "critically damped" spring. The critical damping coefficient is sqrt(4*mass*k). With less damping, the system is under damped and will oscillate. With more damping, the system will take longer to settle to the right position.

Calculation of the damping:
Code: Select all
`float springk = 500;    // may adjust this valuefloat vdamping = sqrtf( 4 * mass * springk );        // critically damped`

Here is pseudocode for the calculation of the force:
Code: Select all
`dVector force = (destination - bodyposition) * springk - vdamping * bodyvelocity;`

I hope this helps make the results better.
andrew11

Posts: 3
Joined: Sun Sep 25, 2005 9:44 pm

### Who is online

Users browsing this forum: No registered users and 4 guests