I have managed to implement the 3D version, with two restricted tangent axis, thereby ending up with a 2×2 matrix. The only difference is for 3D, you need to build an orthogonal basis from the supplied legal axis of movement and derive a second constraint identical to the one you derived.
]]>If either body moves (in this case I move only body b), we can’t recompute u, since the constraint would always be satisfied. That means that we compute u once, when the constraint is created, from the initial positions of the bodies. But if we are doing that, why can’t we just supply an axis rather than compute it? The answer is, we can, because the creator of the constraint could do the same thing if they just positioned the bodies appropriately upon creation of the constraint. So if I were to position b in the second position in my image above initially, I could make the constraint use (1, 0) as the axis rather than (8, 6).
I hope that clears things up a bit,
William
I understand as follows:
We have u initially as the relative position between the two bodies, which is transformed with one of the bodies.
t is always perpendicular to u
In your code, you are using the specified legal axis, and the tangent axis, and additionally, the relative position.
So since you have the original equation as
C = t.u = t.(xa + ra – xb – rb)
dC/dt = t.(va + Cross(wa,ra) – vb – Cross(wb,rb)) + Cross(wb,t).u
and u = xa + ra – xb – rb
Where do you incorporate the specified axis in the equation as you do in the code? All I see is t vectors in your derivation and the relative position u, and not the actual legal axis of movement.
I understand that even if we specify the legal axis upon initialisation, this axis and the tangent vector to this axis can change with the movement of one of the bodies.
Contrary to a revolute joint, where the relative position is always zero, we are saying the relative position between the two bodies can be non-zero only if the tangent vector is perpendicular to this relative position vector.
Thanks for your help
]]>The local axis and tangent should be computed on initialization. Then in each iteration we transform those into world coordinates using the rotation matrix (only) of the body that we fixed the axis with.
One thing that may be tricky is solving the system. The b vector is going to be (which I didn’t expand in the post):
b = -Jv b = [ tT ra x t -tT -(rb + u) x t ] * [ va wa vb wb ]T b = tT * va + (ra x t) * wa - tT * vb - ((rb + u) x t) * wb
Where u and t are the world space axis and tangent of the joint that we have from initialization.
You can look at my (ignore the motor and limit stuff and focus on the joint constructor and initialization)
William
]]>I have a a body at (-20,0,0) and an immovable body at (0,41,0). The world anchor point is at (-20,0,0). Therefore the initial world u vector should be along the line connecting the two body’s center points? I am having trouble getting the simulation correct and trying the 2D case first.
Also, at each frame I have Cross(wa, t) in the velocity equation, therefore the tangent vector should change with body A and be fixed relative to body B.
Thanks for your help
]]>