in Sources/Kinect/Microsoft.Psi.AzureKinect.Visualization/AzureKinectBodyVisualizationObject.cs [177:279]
private void UpdateVisuals()
{
this.visualJoints.BeginUpdate();
this.visualBones.BeginUpdate();
if (this.CurrentData != null)
{
var trackedEntitiesBrush = new SolidColorBrush(this.Color);
var untrackedEntitiesBrush = new SolidColorBrush(
Color.FromArgb(
(byte)(Math.Max(0, Math.Min(100, this.InferredJointsOpacity)) * 2.55),
this.Color.R,
this.Color.G,
this.Color.B));
// update the joints
foreach (var jointType in this.CurrentData.Joints.Keys)
{
var jointState = this.CurrentData.Joints[jointType].Confidence;
var visualJoint = this.visualJoints[jointType];
visualJoint.BeginEdit();
var isTracked = jointState == JointConfidenceLevel.High || jointState == JointConfidenceLevel.Medium;
var visible = jointState != JointConfidenceLevel.None && (isTracked || this.InferredJointsOpacity > 0);
if (visible)
{
var jointPosition = this.CurrentData.Joints[jointType].Pose.Origin;
if (visualJoint.Radius != this.JointRadiusMm / 1000.0)
{
visualJoint.Radius = this.JointRadiusMm / 1000.0;
}
var fill = isTracked ? trackedEntitiesBrush : untrackedEntitiesBrush;
if (visualJoint.Fill != fill)
{
visualJoint.Fill = fill;
}
visualJoint.Transform = new Win3D.TranslateTransform3D(jointPosition.X, jointPosition.Y, jointPosition.Z);
visualJoint.PhiDiv = this.PolygonResolution;
visualJoint.ThetaDiv = this.PolygonResolution;
visualJoint.Visible = true;
}
else
{
visualJoint.Visible = false;
}
visualJoint.EndEdit();
}
// update the bones
foreach (var bone in AzureKinectBody.Bones)
{
var parentState = this.CurrentData.Joints[bone.ParentJoint].Confidence;
var childState = this.CurrentData.Joints[bone.ChildJoint].Confidence;
var parentIsTracked = parentState == JointConfidenceLevel.High || parentState == JointConfidenceLevel.Medium;
var childIsTracked = childState == JointConfidenceLevel.High || childState == JointConfidenceLevel.Medium;
var isTracked = parentIsTracked && childIsTracked;
var visible = parentState != JointConfidenceLevel.None && childState != JointConfidenceLevel.None && (isTracked || this.InferredJointsOpacity > 0);
var visualBone = this.visualBones[bone];
visualBone.BeginEdit();
if (visible)
{
if (visualBone.Diameter != this.BoneDiameterMm / 1000.0)
{
visualBone.Diameter = this.BoneDiameterMm / 1000.0;
}
var joint1Position = this.visualJoints[bone.ParentJoint].Transform.Value;
var joint2Position = this.visualJoints[bone.ChildJoint].Transform.Value;
visualBone.Point1 = new Win3D.Point3D(joint1Position.OffsetX, joint1Position.OffsetY, joint1Position.OffsetZ);
visualBone.Point2 = new Win3D.Point3D(joint2Position.OffsetX, joint2Position.OffsetY, joint2Position.OffsetZ);
var fill = isTracked ? trackedEntitiesBrush : untrackedEntitiesBrush;
if (visualBone.Fill != fill)
{
visualBone.Fill = fill;
}
visualBone.ThetaDiv = this.PolygonResolution;
visualBone.Visible = true;
}
else
{
visualBone.Visible = false;
}
visualBone.EndEdit();
}
// set billboard position
this.UpdateBillboard();
}
this.visualJoints.EndUpdate();
this.visualBones.EndUpdate();
}