感知模拟

想要为应用构建自动化测试吗? 希望测试范围超过组件级单元测试并真正地端到端地演练你的应用吗? 感知模拟可以解决你的需求。 感知模拟库会将人类和环境输入数据发送到应用,使你可以自动完成测试。 例如,可以模拟人类注视特定可重复位置的输入事件,然后使用手势或运动控制器。

感知模拟可将这种模拟输入发送到物理 HoloLens、HoloLens 仿真器(第一代)、HoloLens 2 仿真器或装有混合现实门户的电脑。 感知模拟绕过混合现实设备上的实时传感器,并将模拟输入发送到设备上运行的应用程序。 应用程序通过它们始终使用的相同 API 接收这些输入事件,并且无法辨别运行时使用的是真实传感器还是感知模拟。 感知模拟与 HoloLens 仿真器将模拟输入发送到 HoloLens 虚拟机所用的技术相同。

若要在代码中开始使用模拟,首先请创建一个 IPerceptionSimulationManager 对象。 可以从该对象发出命令来控制模拟“人类”的属性,包括头部位置、手部位置和手势。 还可以启用和操控运动控制器。

为感知模拟设置 Visual Studio 项目

  1. 在开发电脑上安装 HoloLens 仿真器。 该仿真器包含用于感知模拟的库。

  2. 创建一个新的 Visual Studio C# 桌面项目(控制台项目非常适合用于入门)。

  3. 将以下二进制文件作为引用添加到项目中(“项目”->“添加”->“引用...”)。可以在 %ProgramFiles(x86)%\Microsoft XDE\(版本) 中找到这些文件,例如,在 HoloLens 2 仿真器的 %ProgramFiles(x86)%\Microsoft XDE\10.0.18362.0 中

    注意

    虽然二进制文件是 HoloLens 2 仿真器的一部分,但它们也适用于桌面端的 Windows Mixed Reality。

    a. PerceptionSimulationManager.Interop.dll - 用于感知模拟的托管 C# 包装器。
    b. PerceptionSimulationRest.dll - 用于与 HoloLens 或仿真器建立 websocket 信道的库。
    c. SimulationStream.Interop.dll - 模拟的共享类型。

  4. 将二进制 PerceptionSimulationManager.dll 实现添加到项目

    a. 首先将其作为二进制文件添加到项目中(“项目”->“添加”->“现有项...”)。将其另存为链接,以免将其复制到项目源文件夹中。
    将PerceptionSimulationManager.dll作为链接添加到项目

    b. 然后确保在生成时将其复制到输出文件夹。 它将保存在二进制文件的属性表中。
    标记 PerceptionSimulationManager.dll 以复制到输出目录

  5. 将活动解决方案平台设置为 x64。 (如果尚不存在 x64 的平台条目,请使用配置管理器创建一个。)

创建 IPerceptionSimulation 管理器对象

若要控制模拟,需要对从 IPerceptionSimulationManager 对象检索的对象发出更新。 第一步是获取该对象并将其连接到目标设备或仿真器。 可以通过单击工具栏中的“设备门户”按钮来获取仿真器的 IP 地址

打开设备门户图标打开设备门户:在模拟器中打开 HoloLens OS 的 Windows 设备门户。 对于 Windows Mixed Reality,可以在“更新和安全”下的“设置”应用中检索此项,然后在“启用设备门户”下的“连接方式:”部分中的“面向开发人员”中检索。请务必记下 IP 地址和端口。

首先调用 RestSimulationStreamSink.Create 以获取 RestSimulationStreamSink 对象。 这是要通过 http 连接控制的目标设备或仿真器。 命令将传递到设备或仿真器上运行的 Windows 设备门户并由其处理。 创建对象所需的四个参数是:

  • Uri - 目标设备的 IP 地址(例如,"https://123.123.123.123" 或 "https://123.123.123.123:50080")
  • System.Net.NetworkCredential 凭据 - 用于连接到目标设备或仿真器上的 Windows 设备门户的用户名/密码。 如果在同一台电脑上通过仿真器的本地地址(例如 168...*)连接到仿真器,则会接受任何凭据。
  • bool normal - True 表示正常优先级,False 表示低优先级。 对于测试方案,通常会将其设置为 true,使测试接管控制。 仿真器和 Windows Mixed Reality 模拟使用低优先级连接。 如果测试也使用低优先级连接,则最近建立的连接将受控制。
  • System.Threading.CancellationToken 令牌 - 用于取消异步操作的令牌。

接下来创建 IPerceptionSimulationManager。 这是用于控制模拟的对象。 此操作也必须在异步方法中完成。

控制模拟人类

IPerceptionSimulationManager 有一个返回 ISimulatedHuman 对象的 Human 属性。 若要控制模拟人类,请对此对象执行操作。 例如:

manager.Human.Move(new Vector3(0.1f, 0.0f, 0.0f))

基本示例 C# 控制台应用程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.PerceptionSimulation;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Task.Run(async () =>
            {
                RestSimulationStreamSink sink = null;
                CancellationToken token = new System.Threading.CancellationToken();

                try
                {
                    sink = await RestSimulationStreamSink.Create(
                        // use the IP address for your device/emulator
                        new Uri("https://169.254.227.115"),
                        // no credentials are needed for the emulator
                        new System.Net.NetworkCredential("", ""),
                        // normal priorty
                        true,
                        // cancel token
                        token);

                    IPerceptionSimulationManager manager = PerceptionSimulationManager.CreatePerceptionSimulationManager(sink);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }

                // Always close the sink to return control to the previous application.
                if (sink != null)
                {
                    await sink.Close(token);
                }
            });

            // If main exits, the process exits.  
            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }
    }
}

扩展示例 C# 控制台应用程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.PerceptionSimulation;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            RestSimulationStreamSink sink = null;
            CancellationToken token = new System.Threading.CancellationToken();

            Task.Run(async () =>
            {
                try
                {
                    sink = await RestSimulationStreamSink.Create(
                        // use the IP address for your device/emulator
                        new Uri("https://169.254.227.115"),
                        // no credentials are needed for the emulator
                        new System.Net.NetworkCredential("", ""),
                        // normal priorty
                        true,
                        // cancel token
                        token);

                    IPerceptionSimulationManager manager = PerceptionSimulationManager.CreatePerceptionSimulationManager(sink);

                    // Now, we'll simulate a sequence of actions.
                    // Sleeps in-between each action give time to the system
                    // to be able to properly react.
                    // This is just an example. A proper automated test should verify
                    // that the app has behaved correctly
                    // before proceeding to the next step, instead of using Sleeps.

                    // Activate the right hand
                    manager.Human.RightHand.Activated = true;

                    // Simulate Bloom gesture, which should cause Shell to disappear
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.Home);
                    Thread.Sleep(2000);

                    // Simulate Bloom gesture again... this time, Shell should reappear
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.Home);
                    Thread.Sleep(2000);

                    // Simulate a Head rotation down around the X axis
                    // This should cause gaze to aim about the center of the screen
                    manager.Human.Head.Rotate(new Rotation3(0.04f, 0.0f, 0.0f));
                    Thread.Sleep(300);

                    // Simulate a finger press & release
                    // Should cause a tap on the center tile, thus launching it
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.FingerPressed);
                    Thread.Sleep(300);
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.FingerReleased);
                    Thread.Sleep(2000);

                    // Simulate a second finger press & release
                    // Should activate the app that was launched when the center tile was clicked
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.FingerPressed);
                    Thread.Sleep(300);
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.FingerReleased);
                    Thread.Sleep(5000);

                    // Simulate a Head rotation towards the upper right corner
                    manager.Human.Head.Rotate(new Rotation3(-0.14f, 0.17f, 0.0f));
                    Thread.Sleep(300);

                    // Simulate a third finger press & release
                    // Should press the Remove button on the app
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.FingerPressed);
                    Thread.Sleep(300);
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.FingerReleased);
                    Thread.Sleep(2000);

                    // Simulate Bloom gesture again... bringing the Shell back once more
                    manager.Human.RightHand.PerformGesture(SimulatedGesture.Home);
                    Thread.Sleep(2000);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });

            // If main exits, the process exits.  
            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();

            // Always close the sink to return control to the previous application.
            if (sink != null)
            {
                sink.Close(token);
            }
        }
    }
}

有关 6-DOF 控制器的注意事项

在模拟的 6-DOF 控制器上调用方法的任何属性之前,必须激活该控制器。 否则会导致异常。 从 Windows 10 2019 年 5 月更新开始,可以通过将 ISimulatedSixDofController 对象上的 Status 属性设置为 SimulatedSixDofControllerStatus.Active,来安装和激活模拟的 6-DOF 控制器。 在 Windows 10 2018 年 10 月更新和更低版本中,必须首先通过调用 \Windows\System32 文件夹中的 PerceptionSimulationDevice 工具来单独安装模拟的 6-DOF 控制器。 此工具的用法如下:

    PerceptionSimulationDevice.exe <action> 6dof <instance>

例如

    PerceptionSimulationDevice.exe i 6dof 1

支持的操作:

  • i = 安装
  • q = 查询
  • r = 删除

支持的实例:

  • 1 = 左 6-DOF 控制器
  • 2 = 右 6-DOF 控制器

进程的退出代码将指示成功(零返回值)或失败(非零返回值)结果。 使用“q”操作查询是否安装了控制器时,如果控制器尚未安装,则返回值将为零 (0);如果控制器已安装,则返回值将为一 (1)。

在 Windows 10 2018 年 10 月更新或更低版本上删除控制器时,请先通过 API 将其状态设置为 Off,然后调用 PerceptionSimulationDevice 工具。

必须以管理员身份运行此工具。

API 参考

Microsoft.PerceptionSimulation.SimulatedDeviceType

描述模拟设备类型

public enum SimulatedDeviceType
{
    Reference = 0
}

Microsoft.PerceptionSimulation.SimulatedDeviceType.Reference

一个虚构的参考设备,PerceptionSimulationManager 的默认值

Microsoft.PerceptionSimulation.HeadTrackerMode

描述头部跟踪器模式

public enum HeadTrackerMode
{
    Default = 0,
    Orientation = 1,
    Position = 2
}

Microsoft.PerceptionSimulation.HeadTrackerMode.Default

默认头部跟踪。 这意味着系统可以根据运行时条件选择最佳头部跟踪模式。

Microsoft.PerceptionSimulation.HeadTrackerMode.Orientation

仅限方向的头部跟踪。 这意味着跟踪位置可能不可靠,并且某些依赖于头部位置的功能可能不可用。

Microsoft.PerceptionSimulation.HeadTrackerMode.Position

定位头部跟踪。 这意味着跟踪的头部位置和方向都可靠

Microsoft.PerceptionSimulation.SimulatedGesture

描述模拟手势

public enum SimulatedGesture
{
    None = 0,
    FingerPressed = 1,
    FingerReleased = 2,
    Home = 4,
    Max = Home
}

Microsoft.PerceptionSimulation.SimulatedGesture.None

用于表示无手势的 sentinel 值。

Microsoft.PerceptionSimulation.SimulatedGesture.FingerPressed

手指按下的手势。

Microsoft.PerceptionSimulation.SimulatedGesture.FingerReleased

手指松开的手势。

Microsoft.PerceptionSimulation.SimulatedGesture.Home

主页/系统手势。

Microsoft.PerceptionSimulation.SimulatedGesture.Max

最大有效手势。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerStatus

模拟的 6-DOF 控制器的可能状态。

public enum SimulatedSixDofControllerStatus
{
    Off = 0,
    Active = 1,
    TrackingLost = 2,
}

Microsoft.PerceptionSimulation.SimulatedSixDofControllerStatus.Off

6-DOF 控制器已关闭。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerStatus.Active

6-DOF 控制器已打开并受跟踪。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerStatus.TrackingLost

6-DOF 控制器已打开但不可跟踪。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton

模拟的 6 DOF 控制器上支持的按钮。

public enum SimulatedSixDofControllerButton
{
    None = 0,
    Home = 1,
    Menu = 2,
    Grip = 4,
    TouchpadPress = 8,
    Select = 16,
    TouchpadTouch = 32,
    Thumbstick = 64,
    Max = Thumbstick
}

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.None

用于表示无按钮的 sentinel 值。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.Home

已按下“主页”按钮。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.Menu

已按下“菜单”按钮。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.Grip

已按下“抓握”按钮。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.TouchpadPress

已按下触摸板。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.Select

已按下“选择”按钮。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.TouchpadTouch

已触摸触摸板。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.Thumbstick

已按下控制杆。

Microsoft.PerceptionSimulation.SimulatedSixDofControllerButton.Max

最大有效按钮。

Microsoft.PerceptionSimulation.SimulatedEyesCalibrationState

模拟的眼睛的校准状态

public enum SimulatedGesture
{
    Unavailable = 0,
    Ready = 1,
    Configuring = 2,
    UserCalibrationNeeded = 3
}

Microsoft.PerceptionSimulation.SimulatedEyesCalibrationState.Unavailable

眼睛校准不可用。

Microsoft.PerceptionSimulation.SimulatedEyesCalibrationState.Ready

眼睛已校准。 这是默认值。

Microsoft.PerceptionSimulation.SimulatedEyesCalibrationState.Configuring

正在校准眼睛。

Microsoft.PerceptionSimulation.SimulatedEyesCalibrationState.UserCalibrationNeeded

需要校准眼睛。

Microsoft.PerceptionSimulation.SimulatedHandJointTrackingAccuracy

手部关节的跟踪准确度。

public enum SimulatedHandJointTrackingAccuracy
{
    Unavailable = 0,
    Approximate = 1,
    Visible = 2
}

Microsoft.PerceptionSimulation.SimulatedHandJointTrackingAccuracy.Unavailable

不跟踪关节。

Microsoft.PerceptionSimulation.SimulatedHandJointTrackingAccuracy.Approximate

已推理关节位置。

Microsoft.PerceptionSimulation.SimulatedHandJointTrackingAccuracy.Visible

关节完全受跟踪。

Microsoft.PerceptionSimulation.SimulatedHandPose

手部关节的跟踪准确度。

public enum SimulatedHandPose
{
    Closed = 0,
    Open = 1,
    Point = 2,
    Pinch = 3,
    Max = Pinch
}

Microsoft.PerceptionSimulation.SimulatedHandPose.Closed

手指关节已配置为反映闭合姿势。

Microsoft.PerceptionSimulation.SimulatedHandPose.Open

手指关节已配置为反映打开姿势。

Microsoft.PerceptionSimulation.SimulatedHandPose.Point

手指关节已配置为反映指向姿势。

Microsoft.PerceptionSimulation.SimulatedHandPose.Pinch

手指关节已配置为反映捏合姿势。

Microsoft.PerceptionSimulation.SimulatedHandPose.Max

SimulatedHandPose 的最大有效值。

Microsoft.PerceptionSimulation.PlaybackState

描述播放状态。

public enum PlaybackState
{
    Stopped = 0,
    Playing = 1,
    Paused = 2,
    End = 3,
}

Microsoft.PerceptionSimulation.PlaybackState.Stopped

录制当前已停止,已准备好播放。

Microsoft.PerceptionSimulation.PlaybackState.Playing

当前正在播放录制内容。

Microsoft.PerceptionSimulation.PlaybackState.Paused

当前已暂停录制内容。

Microsoft.PerceptionSimulation.PlaybackState.End

录制内容已到末尾。

Microsoft.PerceptionSimulation.Vector3

描述一个三分量向量,该向量可能描述 3D 空间中的某个点或某个向量。

public struct Vector3
{
    public float X;
    public float Y;
    public float Z;
    public Vector3(float x, float y, float z);
}

Microsoft.PerceptionSimulation.Vector3.X

向量的 X 分量。

Microsoft.PerceptionSimulation.Vector3.Y

向量的 Y 分量。

Microsoft.PerceptionSimulation.Vector3.Z

向量的 Z 分量。

Microsoft.PerceptionSimulation.Vector3.#ctor(System.Single,System.Single,System.Single)

构造新的 Vector3。

参数

  • x - 向量的 x 分量。
  • y - 向量的 y 分量。
  • z - 向量的 z 分量。

Microsoft.PerceptionSimulation.Rotation3

描述一个三分量旋转。

public struct Rotation3
{
    public float Pitch;
    public float Yaw;
    public float Roll;
    public Rotation3(float pitch, float yaw, float roll);
}

Microsoft.PerceptionSimulation.Rotation3.Pitch

Rotation 的 Pitch 分量,沿 X 轴向下。

Microsoft.PerceptionSimulation.Rotation3.Yaw

Rotation 的 Yaw 分量,沿 Y 轴向右。

Microsoft.PerceptionSimulation.Rotation3.Roll

Rotation 的 Roll 分量,沿 Z 轴向右。

Microsoft.PerceptionSimulation.Rotation3.#ctor(System.Single,System.Single,System.Single)

构造新的 Rotation3。

参数

  • pitch - Rotation 的 pitch 分量。
  • yaw - Rotation 的 yaw 分量。
  • roll - Rotation 的 roll 分量。

Microsoft.PerceptionSimulation.SimulatedHandJointConfiguration

描述模拟手部关节的配置。

public struct SimulatedHandJointConfiguration
{
    public Vector3 Position;
    public Rotation3 Rotation;
    public SimulatedHandJointTrackingAccuracy TrackingAccuracy;
}

Microsoft.PerceptionSimulation.SimulatedHandJointConfiguration.Position

关节的位置。

Microsoft.PerceptionSimulation.SimulatedHandJointConfiguration.Rotation

关节的旋转。

Microsoft.PerceptionSimulation.SimulatedHandJointConfiguration.TrackingAccuracy

关节的跟踪准确度。

Microsoft.PerceptionSimulation.Frustum

描述视锥,通常由相机使用。

public struct Frustum
{
    float Near;
    float Far;
    float FieldOfView;
    float AspectRatio;
}

Microsoft.PerceptionSimulation.Frustum.Near

锥体中包含的最小距离。

Microsoft.PerceptionSimulation.Frustum.Far

锥体中包含的最大距离。

Microsoft.PerceptionSimulation.Frustum.FieldOfView

锥体的水平视场,以弧度为单位(小于 PI)。

Microsoft.PerceptionSimulation.Frustum.AspectRatio

水平视场与垂直视场之比。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration

描述模拟头戴显示设备的显示器配置。

public struct SimulatedDisplayConfiguration
{
    public Vector3 LeftEyePosition;
    public Rotation3 LeftEyeRotation;
    public Vector3 RightEyePosition;
    public Rotation3 RightEyeRotation;
    public float Ipd;
    public bool ApplyEyeTransforms;
    public bool ApplyIpd;
}

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.LeftEyePosition

出于立体渲染目的,从头部中心到左眼的变换。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.LeftEyeRotation

用于立体渲染的左眼旋转。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.RightEyePosition

出于立体渲染目的,从头部中心到右眼的变换。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.RightEyeRotation

用于立体渲染的右眼旋转。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.Ipd

系统报告的 Ipd 值,用于立体渲染。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.ApplyEyeTransforms

为左眼和右眼变换提供的值是否应被视为有效并应用于正在运行的系统。

Microsoft.PerceptionSimulation.SimulatedDisplayConfiguration.ApplyIpd

为 Ipd 提供的值是否应被视为有效并应用于正在运行的系统。

Microsoft.PerceptionSimulation.IPerceptionSimulationManager

生成用于控制设备的数据包所用的根。

public interface IPerceptionSimulationManager
{   
    ISimulatedDevice Device { get; }
    ISimulatedHuman Human { get; }
    void Reset();
}

Microsoft.PerceptionSimulation.IPerceptionSimulationManager.Device

检索用于解释模拟人类和模拟世界的模拟设备对象。

Microsoft.PerceptionSimulation.IPerceptionSimulationManager.Human

检索用于控制模拟人类的对象。

Microsoft.PerceptionSimulation.IPerceptionSimulationManager.Reset

将模拟重置为默认状态。

Microsoft.PerceptionSimulation.ISimulatedDevice

描述设备的接口,用于解释模拟世界和模拟人类

public interface ISimulatedDevice
{
    ISimulatedHeadTracker HeadTracker { get; }
    ISimulatedHandTracker HandTracker { get; }
    void SetSimulatedDeviceType(SimulatedDeviceType type);
}

Microsoft.PerceptionSimulation.ISimulatedDevice.HeadTracker

从模拟设备中检索头部跟踪器。

Microsoft.PerceptionSimulation.ISimulatedDevice.HandTracker

从模拟设备中检索手部跟踪器。

Microsoft.PerceptionSimulation.ISimulatedDevice.SetSimulatedDeviceType(Microsoft.PerceptionSimulation.SimulatedDeviceType)

设置模拟设备的属性以匹配提供的设备类型。

参数

  • type - 模拟设备的新类型

Microsoft.PerceptionSimulation.ISimulatedDevice2

将 ISimulatedDevice 强制转换为 ISimulatedDevice2 可获取其他属性

public interface ISimulatedDevice2
{
    bool IsUserPresent { [return: MarshalAs(UnmanagedType.Bool)] get; [param: MarshalAs(UnmanagedType.Bool)] set; }
    SimulatedDisplayConfiguration DisplayConfiguration { get; set; }

};

Microsoft.PerceptionSimulation.ISimulatedDevice2.IsUserPresent

检索或设置模拟人类是否正在主动佩戴头戴显示设备。

Microsoft.PerceptionSimulation.ISimulatedDevice2.DisplayConfiguration

检索或设置模拟显示器的属性。

Microsoft.PerceptionSimulation.ISimulatedHeadTracker

描述模拟设备的一部分的接口,用于跟踪模拟人类的头部。

public interface ISimulatedHeadTracker
{
    HeadTrackerMode HeadTrackerMode { get; set; }
};

Microsoft.PerceptionSimulation.ISimulatedHeadTracker.HeadTrackerMode

检索和设置当前头部跟踪器模式。

Microsoft.PerceptionSimulation.ISimulatedHandTracker

描述模拟设备的一部分的接口,用于跟踪模拟人类的手部

public interface ISimulatedHandTracker
{
    Vector3 WorldPosition { get; }
    Vector3 Position { get; set; }
    float Pitch { get; set; }
    bool FrustumIgnored { [return: MarshalAs(UnmanagedType.Bool)] get; [param: MarshalAs(UnmanagedType.Bool)] set; }
    Frustum Frustum { get; set; }
}

Microsoft.PerceptionSimulation.ISimulatedHandTracker.WorldPosition

检索节点相对于世界的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedHandTracker.Position

检索和设置模拟手部跟踪器相对于头部中心的位置。

Microsoft.PerceptionSimulation.ISimulatedHandTracker.Pitch

检索和设置模拟手部跟踪器的向下俯仰角。

Microsoft.PerceptionSimulation.ISimulatedHandTracker.FrustumIgnored

检索和设置是否忽略模拟手部跟踪器的锥体。 如果忽略,则双手始终可见。 如果未忽略(默认),则手部只有在手部跟踪器的锥体范围内时才可见。

Microsoft.PerceptionSimulation.ISimulatedHandTracker.Frustum

检索和设置用于确定手部是否对模拟手部跟踪器可见的锥体属性。

Microsoft.PerceptionSimulation.ISimulatedHuman

用于控制模拟人类的顶级接口。

public interface ISimulatedHuman 
{
    Vector3 WorldPosition { get; set; }
    float Direction { get; set; }
    float Height { get; set; }
    ISimulatedHand LeftHand { get; }
    ISimulatedHand RightHand { get; }
    ISimulatedHead Head { get; }s
    void Move(Vector3 translation);
    void Rotate(float radians);
}

Microsoft.PerceptionSimulation.ISimulatedHuman.WorldPosition

检索和设置节点相对于世界的位置,以米为单位。 该位置对应于人类脚部中心的某个点。

Microsoft.PerceptionSimulation.ISimulatedHuman.Direction

检索和设置模拟人类脸部在世界中的方向。 0 弧度沿负 Z 轴向下。 正弧度绕 Y 轴顺时针旋转。

Microsoft.PerceptionSimulation.ISimulatedHuman.Height

检索和设置模拟人类的高度,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedHuman.LeftHand

检索模拟人类的左手。

Microsoft.PerceptionSimulation.ISimulatedHuman.RightHand

检索模拟人类的右手。

Microsoft.PerceptionSimulation.ISimulatedHuman.Head

检索模拟人类的头部。

Microsoft.PerceptionSimulation.ISimulatedHuman.Move(Microsoft.PerceptionSimulation.Vector3)

相对于当前位置移动模拟人类,以米为单位。

参数

  • translation - 相对于当前位置平移。

Microsoft.PerceptionSimulation.ISimulatedHuman.Rotate(System.Single)

相对于当前方向旋转模拟人类,绕 Y 轴顺时针旋转

参数

  • radians - 绕 Y 轴旋转的量。

Microsoft.PerceptionSimulation.ISimulatedHuman2

将 ISimulatedHuman 强制转换为 ISimulatedHuman2 可获取其他属性

public interface ISimulatedHuman2
{
    /* New members in addition to those available on ISimulatedHuman */
    ISimulatedSixDofController LeftController { get; }
    ISimulatedSixDofController RightController { get; }
}

Microsoft.PerceptionSimulation.ISimulatedHuman2.LeftController

检索左 6-DOF 控制器。

Microsoft.PerceptionSimulation.ISimulatedHuman2.RightController

检索右 6-DOF 控制器。

Microsoft.PerceptionSimulation.ISimulatedHand

描述模拟人类手部的接口

public interface ISimulatedHand
{
    Vector3 WorldPosition { get; }
    Vector3 Position { get; set; }
    bool Activated { [return: MarshalAs(UnmanagedType.Bool)] get; [param: MarshalAs(UnmanagedType.Bool)] set; }
    bool Visible { [return: MarshalAs(UnmanagedType.Bool)] get; }
    void EnsureVisible();
    void Move(Vector3 translation);
    void PerformGesture(SimulatedGesture gesture);
}

Microsoft.PerceptionSimulation.ISimulatedHand.WorldPosition

检索节点相对于世界的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedHand.Position

检索和设置模拟手部相对于人类的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedHand.Activated

检索和设置当前是否激活了手部。

Microsoft.PerceptionSimulation.ISimulatedHand.Visible

检索手部当前是否对 SimulatedDevice 可见(即,是否处于 HandTracker 可检测的位置)。

Microsoft.PerceptionSimulation.ISimulatedHand.EnsureVisible

移动手部,使其对 SimulatedDevice 可见。

Microsoft.PerceptionSimulation.ISimulatedHand.Move(Microsoft.PerceptionSimulation.Vector3)

相对于当前位置移动模拟手部的位置,以米为单位。

参数

  • translation - 模拟手部的平移量。

Microsoft.PerceptionSimulation.ISimulatedHand.PerformGesture(Microsoft.PerceptionSimulation.SimulatedGesture)

使用模拟手部执行手势。 仅当启用了手部时,才能被系统检测到。

参数

  • gesture - 要执行的手势。

Microsoft.PerceptionSimulation.ISimulatedHand2

将 ISimulatedHand 强制转换为 ISimulatedHand2 可获取其他属性。

public interface ISimulatedHand2
{
    /* New members in addition to those available on ISimulatedHand */
    Rotation3 Orientation { get; set; }
}

Microsoft.PerceptionSimulation.ISimulatedHand2.Orientation

检索或设置模拟手部的旋转。 正弧度表示顺时针旋转(沿轴观看时)。

Microsoft.PerceptionSimulation.ISimulatedHand3

将 ISimulatedHand 强制转换为 ISimulatedHand3 可获取其他属性

public interface ISimulatedHand3
{
    /* New members in addition to those available on ISimulatedHand and ISimulatedHand2 */
    GetJointConfiguration(SimulatedHandJoint joint, out SimulatedHandJointConfiguration jointConfiguration);
    SetJointConfiguration(SimulatedHandJoint joint, SimulatedHandJointConfiguration jointConfiguration);
    SetHandPose(SimulatedHandPose pose, bool animate);
}

Microsoft.PerceptionSimulation.ISimulatedHand3.GetJointConfiguration

获取指定关节的关节配置。

Microsoft.PerceptionSimulation.ISimulatedHand3.SetJointConfiguration

设置指定关节的关节配置。

Microsoft.PerceptionSimulation.ISimulatedHand3.SetHandPose

使用可选标志将手部设置为已知姿势,以显示动画。 注意:动画不会导致关节立即反映其最终关节配置。

Microsoft.PerceptionSimulation.ISimulatedHead

描述模拟人类头部的接口。

public interface ISimulatedHead
{
    Vector3 WorldPosition { get; }
    Rotation3 Rotation { get; set; }
    float Diameter { get; set; }
    void Rotate(Rotation3 rotation);
}

Microsoft.PerceptionSimulation.ISimulatedHead.WorldPosition

检索节点相对于世界的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedHead.Rotation

检索模拟头部的旋转。 正弧度表示顺时针旋转(沿轴观看时)。

Microsoft.PerceptionSimulation.ISimulatedHead.Diameter

检索模拟头部的直径。 此值用于确定头部的中心(旋转点)。

Microsoft.PerceptionSimulation.ISimulatedHead.Rotate(Microsoft.PerceptionSimulation.Rotation3)

相对于当前旋转方向旋转模拟头部。 正弧度表示顺时针旋转(沿轴观看时)。

参数

  • rotation - 旋转量。

Microsoft.PerceptionSimulation.ISimulatedHead2

将 ISimulatedHead 强制转换为 ISimulatedHead2 可获取其他属性

public interface ISimulatedHead2
{
    /* New members in addition to those available on ISimulatedHead */
    ISimulatedEyes Eyes { get; }
}

Microsoft.PerceptionSimulation.ISimulatedHead2.Eyes

检索模拟人类的眼睛。

Microsoft.PerceptionSimulation.ISimulatedSixDofController

描述与模拟人类关联的 6-DOF 控制器的接口。

public interface ISimulatedSixDofController
{
    Vector3 WorldPosition { get; }
    SimulatedSixDofControllerStatus Status { get; set; }
    Vector3 Position { get; }
    Rotation3 Orientation { get; set; }
    void Move(Vector3 translation);
    void PressButton(SimulatedSixDofControllerButton button);
    void ReleaseButton(SimulatedSixDofControllerButton button);
    void GetTouchpadPosition(out float x, out float y);
    void SetTouchpadPosition(float x, float y);
}

Microsoft.PerceptionSimulation.ISimulatedSixDofController.WorldPosition

检索节点相对于世界的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.Status

检索或设置控制器的当前状态。 控制器状态必须设置为除 Off 以外的值,才能成功完成任何用于执行移动、旋转或按钮操作的调用。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.Position

检索或设置模拟控制器相对于人类的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.Orientation

检索或设置模拟控制器的方向。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.Move(Microsoft.PerceptionSimulation.Vector3)

相对于当前位置移动模拟控制器的位置,以米为单位。

参数

  • translation - 模拟控制器的平移量。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.PressButton(SimulatedSixDofControllerButton)

按下模拟控制器上的按钮。 仅当启用了控制器时,才能被系统检测到。

参数

  • button - 要按下的按钮。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.ReleaseButton(SimulatedSixDofControllerButton)

松开模拟控制器上的按钮。 仅当启用了控制器时,才能被系统检测到。

参数

  • button - 要松开的按钮。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.GetTouchpadPosition(out float, out float)

获取模拟手指在模拟控制器的触摸板上的位置。

参数

  • x - 手指的水平位置。
  • y - 手指的垂直位置。

Microsoft.PerceptionSimulation.ISimulatedSixDofController.SetTouchpadPosition(float, float)

设置模拟手指在模拟控制器的触摸板上的位置。

参数

  • x - 手指的水平位置。
  • y - 手指的垂直位置。

Microsoft.PerceptionSimulation.ISimulatedSixDofController2

将 ISimulatedSixDofController 强制转换为 ISimulatedSixDofController2 可获取其他属性和方法

public interface ISimulatedSixDofController2
{
    /* New members in addition to those available on ISimulatedSixDofController */
    void GetThumbstickPosition(out float x, out float y);
    void SetThumbstickPosition(float x, float y);
    float BatteryLevel { get; set; }
}

Microsoft.PerceptionSimulation.ISimulatedSixDofController2.GetThumbstickPosition(out float, out float)

获取模拟控制杆在模拟控制器上的位置。

参数

  • x - 控制杆的水平位置。
  • y - 控制杆的垂直位置。

Microsoft.PerceptionSimulation.ISimulatedSixDofController2.SetThumbstickPosition(float, float)

设置模拟控制杆在模拟控制器上的位置。

参数

  • x - 控制杆的水平位置。
  • y - 控制杆的垂直位置。

Microsoft.PerceptionSimulation.ISimulatedSixDofController2.BatteryLevel

检索或设置模拟控制器的电池剩余电量。 该值必须大于 0.0 且小于或等于 100.0。

Microsoft.PerceptionSimulation.ISimulatedEyes

描述模拟人类眼睛的接口。

public interface ISimulatedEyes
{
    Rotation3 Rotation { get; set; }
    void Rotate(Rotation3 rotation);
    SimulatedEyesCalibrationState CalibrationState { get; set; }
    Vector3 WorldPosition { get; }
}

Microsoft.PerceptionSimulation.ISimulatedEyes.Rotation

检索模拟眼睛的旋转。 正弧度表示顺时针旋转(沿轴观看时)。

Microsoft.PerceptionSimulation.ISimulatedEyes.Rotate(Microsoft.PerceptionSimulation.Rotation3)

相对于当前旋转方向旋转模拟眼睛。 正弧度表示顺时针旋转(沿轴观看时)。

参数

  • rotation - 旋转量。

Microsoft.PerceptionSimulation.ISimulatedEyes.CalibrationState

检索或设置模拟眼睛的校准状态。

Microsoft.PerceptionSimulation.ISimulatedEyes.WorldPosition

检索节点相对于世界的位置,以米为单位。

Microsoft.PerceptionSimulation.ISimulationRecording

用来与加载播放的单个录制内容交互的接口。

public interface ISimulationRecording
{
    StreamDataTypes DataTypes { get; }
    PlaybackState State { get; }
    void Play();
    void Pause();
    void Seek(UInt64 ticks);
    void Stop();
};

Microsoft.PerceptionSimulation.ISimulationRecording.DataTypes

检索录制内容中的数据类型列表。

Microsoft.PerceptionSimulation.ISimulationRecording.State

检索录制内容的当前状态。

Microsoft.PerceptionSimulation.ISimulationRecording.Play

开始播放。 如果已暂停播放录制内容,则从暂停位置继续播放;如果已停止,则从头开始播放。 如果已在播放,则忽略此调用。

Microsoft.PerceptionSimulation.ISimulationRecording.Pause

在当前位置暂停播放。 如果已停止播放录制内容,则忽略该调用。

Microsoft.PerceptionSimulation.ISimulationRecording.Seek(System.UInt64)

在录制内容中寻轨到指定的时间(从开头位置开始以 100 纳秒为间隔)并在该位置暂停。 如果该时间超出了录制内容的结束时间,则在最后一帧处暂停。

参数

  • ticks - 要寻轨到的时间。

Microsoft.PerceptionSimulation.ISimulationRecording.Stop

停止播放并将位置重置到开头。

Microsoft.PerceptionSimulation.ISimulationRecordingCallback

用于在播放期间接收状态更改的接口。

public interface ISimulationRecordingCallback
{
    void PlaybackStateChanged(PlaybackState newState);
};

Microsoft.PerceptionSimulation.ISimulationRecordingCallback.PlaybackStateChanged(Microsoft.PerceptionSimulation.PlaybackState)

当 ISimulationRecording 的播放状态更改时调用。

参数

  • newState - 录制内容的新状态。

Microsoft.PerceptionSimulation.PerceptionSimulationManager

用于创建感知模拟对象的根对象。

public static class PerceptionSimulationManager
{
    public static IPerceptionSimulationManager CreatePerceptionSimulationManager(ISimulationStreamSink sink);
    public static ISimulationStreamSink CreatePerceptionSimulationRecording(string path);
    public static ISimulationRecording LoadPerceptionSimulationRecording(string path, ISimulationStreamSinkFactory factory);
    public static ISimulationRecording LoadPerceptionSimulationRecording(string path, ISimulationStreamSinkFactory factory, ISimulationRecordingCallback callback);

Microsoft.PerceptionSimulation.PerceptionSimulationManager.CreatePerceptionSimulationManager(Microsoft.PerceptionSimulation.ISimulationStreamSink)

创建用于生成模拟数据包并将其传送到提供的接收器的对象。

参数

  • sink - 接收所有生成的数据包的接收器。

返回值

创建的管理器。

Microsoft.PerceptionSimulation.PerceptionSimulationManager.CreatePerceptionSimulationRecording(System.String)

创建一个接收器,它将所有收到的数据包存储在指定路径下的文件中。

参数

  • path - 要创建的文件的路径。

返回值

创建的接收器。

Microsoft.PerceptionSimulation.PerceptionSimulationManager.LoadPerceptionSimulationRecording(System.String,Microsoft.PerceptionSimulation.ISimulationStreamSinkFactory)

从指定的文件加载录制内容。

参数

  • path - 要加载的文件的路径。
  • factory - 录制内容使用的工厂,用于按需创建 ISimulationStreamSink。

返回值

加载的录制内容。

Microsoft.PerceptionSimulation.PerceptionSimulationManager.LoadPerceptionSimulationRecording(System.String,Microsoft.PerceptionSimulation.ISimulationStreamSinkFactory,Microsoft.PerceptionSimulation.ISimulationRecordingCallback)

从指定的文件加载录制内容。

参数

  • path - 要加载的文件的路径。
  • factory - 录制内容使用的工厂,用于按需创建 ISimulationStreamSink。
  • callback - 一个回调,用于接收有关录制内容状态的更新。

返回值

加载的录制内容。

Microsoft.PerceptionSimulation.StreamDataTypes

描述不同类型的流数据。

public enum StreamDataTypes
{
    None = 0x00,
    Head = 0x01,
    Hands = 0x02,
    SpatialMapping = 0x08,
    Calibration = 0x10,
    Environment = 0x20,
    SixDofControllers = 0x40,
    Eyes = 0x80,
    DisplayConfiguration = 0x100
    All = None | Head | Hands | SpatialMapping | Calibration | Environment | SixDofControllers | Eyes | DisplayConfiguration
}

Microsoft.PerceptionSimulation.StreamDataTypes.None

用于表示没有流数据类型的 sentinel 值。

Microsoft.PerceptionSimulation.StreamDataTypes.Head

头部位置和方向的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.Hands

手部位置和手势的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.SpatialMapping

环境空间映射的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.Calibration

用于校准设备的数据流。 校准数据包仅由处于远程模式的系统接受。

Microsoft.PerceptionSimulation.StreamDataTypes.Environment

设备环境的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.SixDofControllers

运动控制器的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.Eyes

模拟人类眼睛的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.DisplayConfiguration

设备显示器配置的数据流。

Microsoft.PerceptionSimulation.StreamDataTypes.All

用于表示记录的所有数据类型的 sentinel 值。

Microsoft.PerceptionSimulation.ISimulationStreamSink

用于从模拟流接收数据包的对象。

public interface ISimulationStreamSink
{
    void OnPacketReceived(uint length, byte[] packet);
}

Microsoft.PerceptionSimulation.ISimulationStreamSink.OnPacketReceived(uint length, byte[] packet)

接收单个数据包,该数据包在内部已类型化且版本受控。

参数

  • length - 数据包的长度。
  • packet - 数据包的数据。

Microsoft.PerceptionSimulation.ISimulationStreamSinkFactory

用于创建 ISimulationStreamSink 的对象。

public interface ISimulationStreamSinkFactory
{
    ISimulationStreamSink CreateSimulationStreamSink();
}

Microsoft.PerceptionSimulation.ISimulationStreamSinkFactory.CreateSimulationStreamSink()

创建 ISimulationStreamSink 的单个实例。

返回值

创建的接收器。