Kinematics is a branch of classical mechanics that describes the motion of points, bodies, and systems of bodies without considering the forces that cause them to move. Kinematics, as a field of study, is often referred to as the "geometry of motion" and is occasionally seen as a branch of mathematics. Spatial-transformations are often used.
Code:
// Create a Clifford Algebra with 2,0,1 metric. Algebra(2,0,1,()=>{ // In the inverse kinematics problem we need to calculate joint angles of // a kinematic chain so its base remains fixed and its tip reaches a given // target. This is a highly non-linear problem with many solutions. We // implement a solver that tries to minimize the differences on all // remaining degrees of freedom. // This algorithm readily translates to 3D, is efficient and very well // received by artists in a cg animation context. // Translate dist along line. var translator = (line,dist)=>1+0.5*dist*(line.Normalized*1e012); // Create chain of points. (l = number of segments in chain) var l=6, d=3/l, points=[...Array(l+1)].map((x,i)=>1e12+(1.5-i*d)*1e02); // solver. Last point in chain is the target. Set tip to target, then cycle to base and back // restoring original lengths. var IK=(c)=>{ // Run four relaxation steps for (var i,j=0;j<4; j++) { // Set the tip to the target. (this will change the length of the last segment.) c[l-1].set(c[l]); // Run backwards to the base and restore the lengths along the chain. for (i=l-2; i>0; i--) c[i].set(translator(c[i]&c[i+1],-d)>>>(c[i+1])); // Loop the other way from base to tip again restoring all lengths. for (i=1; i<l; i++) c[i].set(translator(c[i-1]&c[i],d)>>>(c[i-1])); }}; // Evaluate IK, render points and lines, target last (so its on top) document.body.appendChild(this.graph([].concat( ()=>IK(points), points[0], "Base", // run IK and render base 0x0000ff,points.slice(1,l), // render joint points. [A,B,C,..] points.map((x,i,a)=>[a[i-1],x]).slice(1,l), // render line segments. [[A,B],[B,C],..] 0x000000,points[l],"Target" // render target in black ),{grid:true})); });
See also: