An Avatar Inverse Kinematics System Using Geometric Transformations
The minimum set of tracked inputs generally required for tele-immersive virtual reality includes the head and a single hand. The calculations needed to add moving arms and legs are typically brittle systems with little end-user flexibility. I created a modular system of arm and leg inverse kinematics using simple geometric transformations. Users of the Ygdrasil VR authoring language can easily instantiate and modify these template-based components as needed.
|Users can choose a default avatar that includes an articulated right arm and a left arm that makes slow random motions.||The avatar stride is velocity dependent and steps forwards and backwards over changing terrain.|
|In order to accomodate arm lengths beyond the default, the arm breaks at the elbow and is easily modified to break at the wrist.||Avatar footfall is found using gravity to drop a marker from a location out in front of the hip that increases with stride.|
Download the video here (MP4 8.3MB)
The Ygdrasil website.
Links to the articulated avatar scene file and the arm, leg and velocity scene templates it utilizes.
Documentation for the distance, pointAtNode, moveToNode and gravity nodes used by the modules.
The implementation utilizes simple geometric transforms instead of compiled code. The base of the upper arm is pointed at the wrist via the Ygdrasil pointAtNode node. From this position, the arm is bent away from the wrist at an angle that increases as the distance to the wrist decreases. The position of the elbow relative to the body is constrained by the up vector built into pointAtNode. Finally, the forearm is pointed at an elbow position a fixed distance down the upper arm.
The leg implementation uses the Ygdrasil gravity node to drop a ray onto the surface at the next footfall location. A separate velocity widget increases the distance of the gravity node away from the user as velocity increases. The actual foot position is not tied to the user but, rather, has its frame of reference in the world coordinate system. Upon taking a new step, the foot is moved to the new footfall position via a moveToNode node and then left at that location untill a new step is taken. The remaining parts of the leg are implemented using the same principles decribed above for the user arm.