# HandPose

<Badge tone="type">class · sealed</Badge> <Badge>immutable</Badge> <Badge>thread-safe</Badge>

```csharp
namespace AR51.Net;

public sealed class HandPose
```

The joint positions of one hand, from a headset with hand tracking.

Positions are in meters, in the same AR 51 world as the body (left-handed, X right, Y up, Z forward). Instances are immutable and safe to share across threads.

:::note[Units]
Positions are in **meters**, in the AR 51 world: **left-handed, X right, Y up, Z forward** (the same axes as Unity). See [Data conventions](/docs/csharp-api/conventions/).
:::

:::tip[How-to]
This page is **reference** (facts only). For a walkthrough with a complete sample, see the [Skeletons guide](/docs/csharp-api/skeletons/).
:::

## Properties

<div className="apiPropTable apiTable">

| Property | Type | Access | Description |
|---|---|---|---|
| `Positions` | [`IReadOnlyList<Vector3>`](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlylist-1) | `get` | Joint positions in meters, indexed by [`HandJoint`](#handjoint). |

</div>

## Method summary

<div className="apiTable">

| Method | Returns | |
|---|---|---|
| [`GetPosition`](#getposition) | [`Vector3`](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.vector3) |  |

</div>

→ Full descriptions in [Method details](#method-details) below.

## Method details

### GetPosition

<ApiBody kind="method">

```csharp
public Vector3 GetPosition(HandJoint joint);
```

Gets the position of a hand joint, in meters.

<Params>
<Param name="joint" type="HandJoint" typeHref="#handjoint">The joint.</Param>
</Params>

<Returns type="Vector3" typeHref="https://learn.microsoft.com/en-us/dotnet/api/system.numerics.vector3">The position, or (0, 0, 0) when the headset did not report this joint.</Returns>

</ApiBody>

## Related types

Small types used by this class, documented here.

### HandJoint

<Badge tone="type">enum</Badge>

```csharp
public enum HandJoint
```

Hand joints reported in a `HandPose`. The value is the index into `HandPose.Positions`.

:::note
Joints run from the wrist to each fingertip. The thumb and little finger include the metacarpal joint near the wrist, so a hand has 23 joints.
:::

<div className="apiTable">

| Value | Meaning |
|---|---|
| `Wrist = 0` | Wrist. |
| `ThumbTrapezium = 1` | Thumb, trapezium joint at the base of the thumb. |
| `ThumbMetacarpal = 2` | Thumb, metacarpal joint. |
| `ThumbProximal = 3` | Thumb, proximal joint. |
| `ThumbDistal = 4` | Thumb, distal joint. |
| `ThumbTip = 5` | Thumb tip. |
| `IndexProximal = 6` | Index finger, proximal joint (knuckle). |
| `IndexIntermediate = 7` | Index finger, intermediate joint. |
| `IndexDistal = 8` | Index finger, distal joint. |
| `IndexTip = 9` | Index fingertip. |
| `MiddleProximal = 10` | Middle finger, proximal joint (knuckle). |
| `MiddleIntermediate = 11` | Middle finger, intermediate joint. |
| `MiddleDistal = 12` | Middle finger, distal joint. |
| `MiddleTip = 13` | Middle fingertip. |
| `RingProximal = 14` | Ring finger, proximal joint (knuckle). |
| `RingIntermediate = 15` | Ring finger, intermediate joint. |
| `RingDistal = 16` | Ring finger, distal joint. |
| `RingTip = 17` | Ring fingertip. |
| `LittleMetacarpal = 18` | Little finger, metacarpal joint. |
| `LittleProximal = 19` | Little finger, proximal joint (knuckle). |
| `LittleIntermediate = 20` | Little finger, intermediate joint. |
| `LittleDistal = 21` | Little finger, distal joint. |
| `LittleTip = 22` | Little fingertip. |

</div>

## See also

- [Skeletons guide](/docs/csharp-api/skeletons/) — walkthrough with a complete, compiled sample
- [Class index](/docs/sdk-api/csharp-api/classes/) — every AR51.Net type
- [Data conventions, threading and errors](/docs/csharp-api/conventions/)
