LightBuzz / Vitruvius

A set of easy-to-use Kinect utilities that will speed-up the development of your projects.
http://vitruviuskinect.com
Apache License 2.0
229 stars 82 forks source link

Axis Enumeration #27

Closed JeffBail closed 7 years ago

JeffBail commented 7 years ago

The documentation for Axis Enumeration says it "Represents an axis from the 3D space"; is this body coordinates, camera coordinates or perhaps gravity/floor aligned coordinates? I'm trying to understand what effect passing in an Axis should have on the Angle.

Vangos commented 7 years ago

Hello Jeff. The Axis enumeration represents an axis in the Camera Space (measured in meters).

If you pass it as a parameter in the Angle method, for example, the specified axis will be ignored for the angle calculation. Let me know if you need any further assistance.

JeffBail commented 7 years ago

What I'm trying to do is get body relative angles and it seems like what Angle is providing is screen/camera relative angles. For instance I'd like to measure the pitch/elevation of my arm which shouldn't change as I spin around in a chair if I'm holding my arm straight out in front of me.

Vangos commented 7 years ago

Could you please paste the code you are using for this?

JeffBail commented 7 years ago

I was trying to get body relative elbow yaw doing something like this:

     double elbowYaw = body.Joints[JointType.ShoulderRight].Angle(body.Joints[JointType.SpineShoulder], body.Joints[JointType.ElbowRight], Axis.Z);

I tried using the different axes but since they're relative to the camera (and not the body or gravity) I don't think think this is the right path.

Vangos commented 7 years ago

Thank you. Could you also send me a video of the movement and the proper position? On Tue, 13 Sep 2016 at 22:49, JeffBail notifications@github.com wrote:

I was trying to get body relative elbow yaw doing something like this:

 double elbowYaw = body.Joints[JointType.ShoulderRight].Angle(body.Joints[JointType.SpineShoulder], body.Joints[JointType.ElbowRight], Axis.Z);

I tried using the different axes but since they're relative to the camera (and not the body or gravity) I don't think think this is the right path.

— You are receiving this because you modified the open/close state.

Reply to this email directly, view it on GitHub https://github.com/LightBuzz/Vitruvius/issues/27#issuecomment-246801817, or mute the thread https://github.com/notifications/unsubscribe-auth/AAiV-OEoXozghishmw1sd6ueNGJm7Uz1ks5qpv5EgaJpZM4J75u8 .

Vangos Pterneas http://pterneas.com

JeffBail commented 7 years ago

Here's a quick video. What I'm looking for is the elevation of my arm which should change as I move them up and down but not as I rotate my body or my arms. I'm thinking I might need to do a rotation correction like this.

Vangos commented 7 years ago

Now it's clear to me. So, to read the angle regardless of the rotation of the body, you need to measure it by considering all of the axis. Would the following code work for you?

var start = body.Joints[JointType.SpineShoulder].Position;
var center = body.Joints[JointType.ShoulderRight].Position;
var end = body.Joints[JointType.ElbowRight].Position;

var angle = center.Angle(start, end);

You may also do this:

var angle = 180.0 - center.Angle(start, end);

JeffBail commented 7 years ago

I'm pretty sure that's still going to be measuring in screen/camera space and not body/floor/gravity space. So for instance if I stand with my body facing the camera and point my arm at the camera and then move it down by my side the angle doesn't change much. If I rotate my body 90 degrees and do the same motion the values sweep through a large range.

JeffBail commented 7 years ago

I have a pretty good solution in Unity based on the JoinOrientationBasics-Unity example. I'm simply looking up a child of the SkeletonModel, in this case "ElbowRight", that is already converted into Unity coordinates and extracting the yaw as: Vector3.Angle(elbowRight.transform.up, Vector3.right);