感知模拟
想要为应用构建自动化测试吗? 希望测试范围超过组件级单元测试并真正地端到端地演练你的应用吗? 感知模拟可以解决你的需求。 感知模拟库会将人类和环境输入数据发送到应用,使你可以自动完成测试。 例如,可以模拟人类注视特定可重复位置的输入事件,然后使用手势或运动控制器。
感知模拟可将这种模拟输入发送到物理 HoloLens、HoloLens 仿真器(第一代)、HoloLens 2 仿真器或装有混合现实门户的电脑。 感知模拟绕过混合现实设备上的实时传感器,并将模拟输入发送到设备上运行的应用程序。 应用程序通过它们始终使用的相同 API 接收这些输入事件,并且无法辨别运行时使用的是真实传感器还是感知模拟。 感知模拟与 HoloLens 仿真器将模拟输入发送到 HoloLens 虚拟机所用的技术相同。
若要在代码中开始使用模拟,首先请创建一个 IPerceptionSimulationManager 对象。 可以从该对象发出命令来控制模拟“人类”的属性,包括头部位置、手部位置和手势。 还可以启用和操控运动控制器。
为感知模拟设置 Visual Studio 项目
在开发电脑上安装 HoloLens 仿真器。 该仿真器包含用于感知模拟的库。
创建一个新的 Visual Studio C# 桌面项目(控制台项目非常适合用于入门)。
将以下二进制文件作为引用添加到项目中(“项目”->“添加”->“引用...”)。可以在 %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 - 模拟的共享类型。将二进制 PerceptionSimulationManager.dll 实现添加到项目
a. 首先将其作为二进制文件添加到项目中(“项目”->“添加”->“现有项...”)。将其另存为链接,以免将其复制到项目源文件夹中。
b. 然后确保在生成时将其复制到输出文件夹。 它将保存在二进制文件的属性表中。
将活动解决方案平台设置为 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 的单个实例。
返回值
创建的接收器。