stARkit for DaystAR
设备版本说明
G2设备系统版本必须是OTA4或以上版本,支持stARkit3.0.
NG2设备支持的版本具体信息如下图:

PhoneAR设备系统版本1.5支持stARkit3.5及以上版本, 在1.5版PhoneAR设备中不能运行stARkit3.5以前SDK的应用,但是新应用的基础功能(slam和display)可以运行在旧的PhoneAR版本中,在NG2上旧的功能还是支持的。
开发准备
开发环境
基于stARkit Unity SDK开发应用,需要在本机安装Unity(SDK开发版本是Unity2020.3.16,在使用此SDK开发时建议使用2020.3.16或以上版本)。
安装unity过程中,可以根据需要选择相应的组件,若需要编译Android和iOS应用,请参考下图勾选。
建议:请确保勾选Microsoft Visual Studio模块,或自行在本机安装其他版本Visual Studio。

SDK下载
请登录晨星开发者平台后,在顶部菜单“下载”—“SDK下载”页面中,下载stARkit SDK。建议下载最新版本。

开发账号注册
stARkit开发者门户网站——晨星视觉平台提供项目管理、许可证管理等功能。登录晨星视觉平台,通过右上方按钮进行账户注册或登录。登录后在开发者中心—我的项目中新建项目或管理已有项目。
- 注册新账号,然后登录使用自己的账号登录

- 账号登录成功后选择 开发者中心 我的项目

- 进入我的项目后选择右上角的新建项目,根据提示完成操作

- 新建完成后点击项目进入完成许可证的配置。

- 将许可证的key和secret复制记录下来,在开发时填入场景中的SRApplication中


基于Unity SDK进行应用开发
在stARkit SDK中,提供了一些示例场景,其中Assets/stARkit/Lenovo.stARkit.SDK/Demo/MixtureSeeThrough/Scene为最基础的AR场景,可将此场景build出apk安装包,在晨星AR设备上面体验;若需要自己制作场景,请参考以下步骤:
创建工程
运行已安装的Unity软件,选择创建一个新工程。

在①处设置你的工程名,在②处选择工程的存储路径,最好是一个空的文件夹,设置好后点击“创建”按钮,等待工程创建成功后打开。

导入SDK
从菜单栏“Asserts->Import Package->Custom Package..”导入stARkit for daystAR SDK Unity Package为自定义包; 默认导入全部资源。

WARNING
Unity2020以上版本(验证过2020.3.11及以上的一些版本),由于Unity自带,不需要勾选 Common文件夹下的Newtonsoft.Json.dll文件,否则会出现编译错误。


注意: 当出现此错误信息时,需手动删除Common路径下的Newtonsoft.Json.dll文件。
而后在Unity场景层级窗口中,删除Main Camera。

场景配置
在Unity下方的项目窗口中,找到预制体Assets/stARkit/Lenovo.stARkit.ADK/StARkitMixtureGlassSeeThrough.Prefab。

将预制体StARkitMixtureGlassSeeThrough拖入scene(Hierarchy)。或者选择StARkit Tool -> Add to scene with StARkitMixtureGlassSeeThrough快捷按钮。

将许可证预制体SRApplication放入场景(通过StARkit Tool -> Add to scene with StARkitMixtureGlassSeeThrough 快捷键添加的会自动创建预制体,不需要再拖一遍),然后将开发者账号配置的项目许可证填写到预制体的对应参数上,SRApplication必须填写正确,3.5及以后的sdk进入应用必须联网验证。


将预制体SRFrameManager拖入scene (Hierarchy), 要打包PhoneAR必须选择设备类型为D_Starkit。

在scene中创建一个方块。

将方块放到初始显示的正前方1米处,并将方块的长宽高都设置为0.2米。

按快捷键Ctr+S 保存场景,选择保存的路径和场景名。

基于Unity打包和部署安卓应用
在按照教程构建好应用场景后,可以将其打包为apk应用。首先需要保证已安装好编译安卓应用必需的工具和组件,可以参考开发环境部分的内容。 编译安卓应用的具体步骤如下:
切换平台
在Unity窗口点击 "File->Build settings"中选择安卓平台,先点击switch platform, 待完成后点击player settings,如下图所示:

填写应用名称


设置Player setting -> Resolution and Presentation ->Default Orientation ->Landscape Left。

编译配置
勾选Player setting -> Other Setting -> Auto Graphics API。

设置Player setting -> Other Setting -> Multithreaded Rendering -> false。关闭多线程渲染。

Target API Level不做强制限制,已经验证的有(25,27,29),打包APILevel低于29的时候需要删除AndroidManifest.xml中的 android:requestLegacyExternalStorage="true"。
Scripting Backend可选IL2CPP也可选Mono,Target Architectures建议选择 ARM64,算法运行速度在ARMv7模式下会比ARM64更慢,请根据实际情况选择。

设置Player setting -> Configuration -> Write Permission : External(SDCard)。

在Porject Settings面板选择Quality找到Rendering模块:设置Anisortropic Texture -> Per Texture,设置Anti Aliasing -> Disabled 。Other模块:设置V Sync Count -> Don‘t Sync。

编译应用
退出"Player Settings“窗口,回到”Build Setting“窗口,依次点击 "Add Open Scenes" 和"Build",获取安卓平台应用。

基于Unity打包和部署Windows应用
- 打开Build设置窗口。

- 将刚刚保存的scene添加到 scene in build。

- 如果当前Build的目标平台不是PC,你需要先切换目标平台为PC。

- 打开Player Setting窗口。

- 设置应用的名字。


- 设置Resolution and Presentation: Run in Background 和 Allow Fullscreen Switch为True。

- 设置Architecture : x86_64 ,然后开始build, 最终生成可执行文件。

stARkit for daystAR SDK目录结构
- Assets/StARkit在开发AR应用时使用,其中包含:
- Assets/stARkit/Lenovo.stARkit.SDK
开发者所要使用和了解的东西都在这个文件夹下,需要开发者认真看看里面的内容。里面包含了Demo,开发需要的接口以及预制体。

Assets/stARkit/Lenovo.stARkit.Toolkit
这里面是整个SDK的核心部分,里面按照功能模块分了文件夹,如果对内部代码感兴趣或者需要深入了解SDK可以去对应的模块查看详细代码。

Assets/stARkit/Plugins
这里面放了SDK在Android上需要的库,这个是不需要开发者管的,如果出现在平台运行时出现找不到库时检查一下对应目录下的库的平台设置是不是正确即可。

Assets/stARkit_Service和StreamingAssets/stARkit
这两个目录,主要是为了支持PhoneAR设备,开发launcher的时候必须在场景中增加StARkitService的预制体,集成此service的应用必须能在后台运行而不被杀死。

Assets/srARFrame
这里是关于控制camera及获取RGB相机图像和位姿的部分,预制体为SRFrameManager
控制接口:
csharp//======================================================== //开启相机 //======================================================== public void OpenCamera(Action<string> cb); //======================================================== //关闭相机 //======================================================== public bool CloseCameraDevice(); 数据获取回调:public event Action<SRCameraFrame> FrameReceived; 主动获取数据:public bool TryGetLatestFrame(out SRCameraFrame cameraFrame)
Assets/Recognition

这里是关于物体识别功能的核心部分,该功能可基于单目相机视频流,提供实时三维感知能力,快速精准的识别目标,并估计相机与目标在三维空间中的位姿关系。
位姿获取
HeadTracking 相关的API
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:这是slam的控制类,这里面的函数可以开关slam并获取slam的数据。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseHeadTrackingAPI | 这是调用Slam功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StartHeadTracking | EStARkitCode | int | mode:0表示6dof,1表示3dof。 | 打开6dof/3dof功能。 |
StopHeadTracking | EStARkitCode | int | mode:0表示6dof,1表示3dof。 | 关闭 6dof/3dof功能。 |
GetHeadPose | EStARkitCode | STrackingData | pose :用来接收slam数据的结构体 | 根据传入的参数获取对应的SLam数据。 |
double | timeStamp:slam的时间戳,应设置为绝对时间或增量时间(单位-毫秒)。option = 1时,时间戳是绝对时间,并返回其附近的姿势;option = 0时,时间戳是增量时间,并获取最新姿势,如果时间戳> 0,则应用运动预测,如果时间戳= 0,则直接返回最新姿势, 如果时间<0, 则返回历史时刻位姿。 | |||
Int | option:指示时间戳记是绝对时间还是相对时间,详情见参数timeStamp的介绍。 | |||
string | node:指示目标坐标选择,"camera:rgb":slam坐标转到RGB相机;"camera:tof":slam坐标转到TOF相机;"head":slam坐标转到用户两眼中间;"imu" :slam坐标转到IMU。 | |||
Int | coordinate_left:指定数据的左右手系。0为右手系,1为左手系。 | |||
GetSlamDataNote | string | string | note:获取数据的节点名。 | 获取slam数据的节点名转换,按照关键字匹配,关键字分别是: "rgb","tof","head","imu",如果都不匹配则默认为"head"。 |
TransfromPose | EStARkitCode | STrackingData | fromPose:需要转换的Unity坐标系的位姿 | 将fromNote节点下的Unity位姿转换到显示的Head节点。 |
STrackingData | toPose:转化为Unity世界坐标系的位姿 | |||
string | fromNode:需要转换的节点("rgb"和"tof"选一个) | |||
double | predictTime:当前显示模式下的预测时间。(GlassSeeThrough 下是"BaseDisplayAPI.Instance.DisplayGetPredoctedTime" 这个接口获取的预测时间) |
BaseCommonAPI
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:这是一下通用功能的函数集合。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseCommonAPI | 这是调用通用功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StARkitGetModuleStatus | EStARkitCode | EStARkitModule | module:需要获得哪个模式的状态。 | 获取各模块的当前状态。 |
EStARkitStatus | status:查询的模式当前状态。 | |||
RegisterModuleStatusCB | EStARkitCode | Action<int, int, int, IntPtr> | statusCB:注册状态回调函数,当状态发生改变时会主动回调。回调是另外的线程回调的,使用必须注意不能直接在回调中处理Unity组件。回调的参数:见此表后面的一张表格。 | 注册状态变化的回调函数。主要是slam的状态,但是也包括其他模块。建议使用CommonStatusCallBack中的封装模块, |
UnRegisterModuleStatusCB | EStARkitCode | Action<int, int, int, IntPtr> | statusCB:取消注册回调接口,这个一定要是注册时传入的那个。 | 取消状态回调注册,需和注册成对调用。 |
Action <int,int,int,IntPtr>状态回调函数:
Modlue | Event | Description_length | Description |
---|---|---|---|
(1)st_MODULE_6DOF | 0 (PLEASE_MOVE_SLIGHTLY) | Description 的字节长度,用来读取IntPtr中的数据的。 | 说明字符串 |
1 (TEXTURE_NOT_ENOUGH) | 说明字符串 | ||
2 (MOVE_TOO_FAST) | 说明字符串 | ||
3 (INITIAL_SUCCESS) | 说明字符串 | ||
4 (TRACK_LOST) | 说明字符串 | ||
5 (KEYFRAME_COUNTER) | 关键帧编号计数器(int) | ||
6 (RELOCALIZED) | 字符串:"lost:relocalized(丢失:重新定位成功)","map:relocalized(地图:重新定位成功)" | ||
7 (TRACKING_QOS) | 浮点数的跟踪质量值[0-100] | ||
8(MAP_EXPORT) | 字符串:"success"表示保存map文件成功;"fail:bad path"表示文件路径有问题;"fail:unknow"表示未知错误导致失败。 | ||
9(MAP_LOAD) | 字符串"success"表示保存map文件成功;"fail:bad path"表示文件路径有问题;"fail:bad file"表示文件错误;"fail:unknow"表示未知错误导致失败。 | ||
10(ANCHOR_FRAMES) | 保存的锚点环境框架的数量。 | ||
(2)st_MODULE_3DOF | 11(3DOF_INITIAL_SUCCESS) | 说明字符串 |
CommonStatusCallBack
1)命名空间:Lenovo.stARkit.Toolkit.Common。
2)简介:这是一个通用的公共状态回调模块,会在程序运行时去注册底层回调,停止时取消注册回调。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Current | CommonStatusCallBack | 这是一个静态访问单例 |
StatusCB | Action<EStARkitModule, EStARkitEventID, string>; | 这是一个委托事件变量,通过+=(注册)和-=(取消注册),会在收到底层回调后的下一帧调用注册的委托事件。 |
EStARkitCode
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这里定义列举了所有函数返回值的枚举型。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
SUCCESS | 0 | 操作成功 |
FAIL | 1 | 操作失败 |
EFINIT | 2 | 初始化失败 |
EFDEINIT | 3 | 取消初始化失败 |
EPERM | 4 | 不允许操作 |
ENOENT | 5 | 无此文件或目录 |
ESRCH | 6 | 没有这样的过程 |
EIO | 7 | I/O 错误 |
E2BIG | 8 | 参数列表过长 |
ENOMEM | 9 | 超过内存 |
EBADF | 10 | 档案编号错误 |
EACCES | 11 | 没有权限 |
EFAILT | 12 | 地址错误 |
ENOTBLK | 13 | 需要阻止设备 |
EBUSY | 14 | 设备或资源繁忙 |
ENODEV | 15 | 无此设备 |
EINVAL | 16 | 无效的参数 |
EFBIG | 17 | 文件过大 |
ENODATA | 18 | 无可用数据 |
ETIME | 19 | 计时器到期 |
ECOMM | 20 | 发送通信错误 |
ELIBACC | 21 | 无法访问共享库 |
ELIBBAD | 22 | 访问损坏的共享库 |
EUSERS | 23 | 同时访问者太多 |
ESOCK | 24 | socket通信中断 |
ENOIMP | 25 | 没有这样的实现 |
ELAST | 26 | 待续(无用) |
EStARkitEventID
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是查询模块当前状态中列举的有效模块,目前只支持Android设备(NG2/G2)。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
EVENT_6DOF_MOVE_SLIGHTLY | 0 | 6自由度头部跟踪时移动太慢 |
EVENT_6DOF_TEXTURE_NOT_ENOUGH | 1 | 6自由度头部跟踪初始化面前画面纹理不够 |
EVENT_6DOF_MOVE_TOO_FAST | 2 | 6自由度头部跟踪移动太快 |
EVENT_6DOF_INITIAL_SUCCESS | 3 | 6自由度头部跟踪功能初始化成功 |
EVENT_6DOF_TRACK_LOST | 4 | 6自由度头部跟踪数据锚定丢失 |
EVENT_6DOF_KEYFRAME_COUNTER | 5 | 6自由度头部跟踪数据关键帧计数器关键帧计数器 |
EVENT_6DOF_RELOCALIZED | 6 | 6自由度头部跟踪数据重定位 |
EVENT_6DOF_TRACKING_QOS | 7 | 6自由度头部跟踪数据质量 |
EVENT_6DOF_MAP_EXPORT | 8 | 6自由度头部跟踪数据导出结果 |
EVENT_6DOF_MAP_LOAD | 9 | 6自由度头部跟踪数据导入结果 |
EVENT_6DOF_ANCHOR_FRAMES | 10 | 6自由度头部环境画面存储结果 |
EVENT_STARKIT_DISABLED | 20 | StARkit 服务停止 |
EVENT_STARKIT_ENABLED | 21 | StARkit 服务启动 |
EVENT_3DOF_INITIAL_SUCCESS | 22 | 3自由度头部跟踪数据初始化成功 |
EVENT_CAMERA_DATA_READY | 23 | 相机数据准备就绪 |
EVENT_POINTCLOUD_DATA_READY | 24 | 点云数据准备就绪 |
EStARkitModule
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是查询模块当前状态中列举的有效模块,目前只支持Android设备(NG2/G2)。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
MODULE_STARKIT | 0 | 整个设备 |
MODULE_6DOF | 1 | 6dof模块 |
MODULE_3DOF | 2 | 3dof模块 |
MODULE_MESH | 3 | SpatialMesh模块 |
MODULE_PLANE | 4 | FindPlane模块 |
EStARkitStatus
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:表示各个模块当前状态。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
STATUS_UNINIT | 0 | 模块没有初始化 |
STATUS_INITED | 1 | 模块已经初始化 |
STATUS_RUNNING | 2 | 模块正在正常工作 |
STATUS_STOPPED | 3 | 模块已经停止 |
ETrackingMode
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这个是Slam的两个模块6dof和3dof的枚举。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
TRACKING_POSITION | 0 | 表示6dof。 |
TRACKING_ORIENTATION | 1 | 表示3dof。 |
ETrackingNote
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这个是Slam的节点坐标系的枚举。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
None | 0 | 未定义 |
HEAD | 1 | 人的两眼中间 |
RGB | 2 | RGB相机 |
TOF | 3 | TOF相机 |
IMU | 4 | IMU坐标系 |
IStARkitHeadTrackingService
1)命名空间:Lenovo.stARkit.Tookit.HeadTracking。
2)简介:这是SDK提供的所有预制体中控制Slam的接口,如果使用了提供的预制体,可以用CoreServices.HeadTrackingService的方式调用Slam相关的控制。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
TrackingMode | ETrackingMode | 表示当前是6dof还是3dof。 |
TrackingNote | ETrackingNote | 当前是处于哪个节点坐标下。 |
Note | GameObject | 获得的slam数据应用的节点。 |
IsHeadTrackingRunning | Bool | Slam是否正常启动运行,仅代表Start和stop的调用。 |
DisableUpdateData | Bool | True,不将数据应用给节点,false将数据应用给节点。 |
4) 函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
EnableHeadTracking | 无 | 无 | 无 | 开启Slam功能 |
DisableHeadTracking | 无 | 无 | 无 | 关闭Slam功能 |
ChangeHeadTrackingMode | 无 | ETrackingMode | trackingMode:表示是6dof还是3dof。 | 在6dof和3dof之间切换。切换流程是先关闭slam,然后以新模式重新启动。 |
STrackingData
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.DefinitionsI。
2)简介:这是Slam 跟踪的数据信息,包括时间戳,旋转和平移。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
dTime | double | 时间戳,单位是秒。 |
dVector | double[] | slam的平移数据,,是x,y,z三个轴坐标的数组,所以长度为3。 |
dQuaternion | double[] | slam的旋转四元素数据,分别是x,y,z,w,长度为4。 |
tag | char[] | 数据标签信息,长度为10。 |
MixtureSeeThrough
这个Demo是只支持Android设备(NG2 pro/NG2/G2)的,设备必须具备DisplayEngine 和Slam两个功能,主要展示双目合像显示和Slam的3dof/6dof锚定效果。支持投屏功能,详情咨询售后。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/MixtureSeeThrough/ MixtureSeeThrough_6dof,按照Android Build的步骤出一个APK。

- 默认的是打开了ATW(异步时间补偿)功能的,启动6dof,可以在Scene中的StARkitGlassSeeThrough上挂的脚本修改,如下图:

- 将Build好的apk在设备中安装好后进入。
- 进入应用后,会看到有一个星宝在正前方,3dof模式下,你只能转动头,无法走进或者走远观察,方块可以随着转动固定在头的相对位置,并且没有明显的形变表示功能正常。6dof模式下,不仅可以转头,还能前后上下左右的移动,从各个角度观察方块的位置,方块在真实世界的位置没有明显的移动变化表示功能正常。
StARkitMixtureGlassSeeThrough类
1)命名空间:无
2)简介:这是通过DisplayEngine看3D物体的管理类,这个类会去控制显示和头部跟踪的流程。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
TrackingHead | GameObject | 获取和设置Slam数据的使用对象。 |
- 函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
CloseBeforeLoadScene | 无 | 无 | 无 | 场景跳转之前调用,关闭显示和头部跟踪。 |
SetATWActive | 无 | bool | active:为true时激活ATW功能,为false时关闭ATW功能 | 动态开关ATW的功能。 |
空间重建
SpatialMesh 相关的API
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:这个是控制SpatialMesh功能的控制类,可以通过里面的函数开关SpatialMesh功能,获取空间Mesh数据。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseSpatialMeshAPI | 这是调用SpatialMesh功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StARkitStartSpatialMesh | EStARkitCode | 无 | 无 | 开启扫描空间Mesh功能。 |
StARkitStopSpatialMesh | EStARkitCode | 无 | 无 | 关闭扫描空间Mesh功能。 |
StARkitClearSpatialMesh | EStARkitCode | 无 | 无 | 清除扫描缓存的数据。 |
StARkitSaveFinalSpatialMesh | EStARKitCode | string | meshPath:保存文件路径。 | 根据传入的文件路径将扫描缓存的数据保存为完整版,传入的文件必须是.raw。此函数已被弃用,请使用StARkitSaveFinalSpatialMeshWithSimplify(string meshPath,string simplifyMeshPath) |
StARkitSaveFinalSpatialMesh | EStARKitCode | string | meshPath:保存文件路径。 | 根据传入的文件路径将扫描缓存的数据保存为完整版和精简版,传入的文件必须是.raw。 |
string | simplifyMeshPath:精简版mesh数据保存路径,主要用于生成碰撞体的mesh | |||
StARkitGetFinalSpatialMesh | EStARkitCode | string | meshPath:存储的数据文件路径。 | 这是把StARkitSaveFinalSpatialMesh存储的数据读取出来。 |
SStARkitMeshData | meshData:读取的文件数据。 | |||
StARkitGetBlockMeshInfo | EStARkitCode | uint | blockBufferSizeOut:更新mesh碎片的信息结构体的个数。 | 获取当前需要更新的mesh的基本数据,然后分配空间取获取数据。这个是和StARkitGetBlockMesh配合使用的。 |
uint | vertexBufferSizeOut:更新mesh数据的顶点结构体的个数。 | |||
uint | faceBufferSizeOut:更新mesh的三角面片信息结构体的个数。 | |||
StARkitGetBlockMesh | EStARkitCode | uint | blockBufferSizeOut:更新mesh碎片的信息结构体的个数。 | 根据StARkitGetBlockMeshInfo拿到的数据信息,分配内存然后取拿去数据,将对应的数据以数据列表的形式返回。不建议使用这种方式。 |
uint | vertexBufferSizeOut:更新mesh数据的顶点结构体的个数。 | |||
uint | faceBufferSizeOut:更新mesh的三角面片信息结构体的个数。 | |||
List<SBlockMeshInfo> | blockMeshInfos:拿到的mesh碎片的信息列表。 | |||
List<SMeshVertex> | Vertexs:拿到的mesh顶点信息列表。 | |||
List<SMeshFaceTriangleIndex> | faceTriangles:拿到的mesh三角面信息列表。 | |||
StARkitGetBlockMesh | EStARkitCode | SStARkitMeshData[] | meshData:拿到的可以直接用于画mesh的数据。 | 获取mesh数据的重载,这个函数包含了StARkitGetBlockMeshInfo和StARkitGetBlockMesh的组合使用,简化了调用。建议使用这种方式获取数据。 |
StARkitReadMeshRaw | EStARkitCode | string | path:读取的数据文件路径 | 读取文件中的mesh数据。这是protected函数,只是在内部几次中调用。 |
SStARkitMeshData | meshData:读取的mesh数据。 |
SStARkitMeshData
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是用来画Mesh的数据的集合,FindPlane和SpatialMesh的数据最后会整合后为SStARkitMeshData,这里面的顶点数组和三角数组可以用来直接画Mesh。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
MeshID | uint | 空间Mesh的编号,根据这个ID来判断哪个部分的Mesh数据更新了。 |
MeshVerSion | uint | Mesh数据的更新号。 |
Vertices | Vector3[] | Mesh的顶点数组。 |
Triangles | int[] | Mesh的三角面排列数组。 |
plane | SStARkitPlaneData | 当Mesh是FindPlane的数据时包含一个中心点和法线信息。 |
SBlockMeshInfo
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是SpatialMesh的mesh的数据信息的结构体,这个结构体包含了顶点个数和三角面个数,和SMeshFaceTriangleIndex,SMeshVertex配合一起使用。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
MeshID | uint | 空间Mesh的编号,根据这个ID来边帮那个部分的Mesh数据更新了。 |
MeshVersion | uint | Mesh数据的更新号,当此编号发生变化,表示数据发生了变化。 |
MeshVertexCount | uint | 此次mesh数据的顶点个数。 |
MeshFaceCount | uint | 此次mesh数据的三角面个数。 |
SMeshFaceTriangleIndex
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是SpatialMesh的三角面信息的结构体,表示哪3个顶点组成一个三角面,和SBlockMeshInfo,SMeshVertex配合使用。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
v0 | uint | 三角面的第一个顶点。 |
v1 | uint | 三角面的第二个顶点。 |
v2 | uint | 三角面的第三个顶点。 |
SMeshVertex
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是SpatialMesh的顶点信息结构体,表示一个顶点在世界坐标系下的位置,和SBlockMeshInfo,SMeshFaceTriangleIndex配合使用。
3) 属性:
属性名 | 类型 | 说明 |
---|---|---|
x | float | 顶点X轴的坐标 |
y | float | 顶点Y轴的坐标 |
z | float | 顶点Z轴的坐标 |
3D重建 Demo
这个Demo是只支持Android设备(NG2/G2)的,设备必须具备DisplayEngine,Slam,TOF相机。其核心的算法是基于TOF相机的。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/SpatialMesh/Scene/SpatialBlockMeshExample,依照上面的Android Build的步骤出一个APK。

- 将Build好的apk在设备中安装好后运行应用。
- 运行起来后将看到有4个选项按钮在视野前方并会跟随头动,使用gaze对这些按钮进行操作。
Start Scan Mesh : 开启空间扫描功能,函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。如果函数调用成功了,那么每帧都会去获取数据,但不是每次都有数据更新的,数据函数的结果会在最下方的信息栏显示,最后的数字表示拿到Mesh碎片的个数。
Stop Scan Mesh : 关闭扫描功能,函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。
Save Final Mesh : 将扫描到的结果全部保存下来,现在保存的文件格式raw,当需要时可以调用加载FinalMesh的函数读取显示。函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。
Clear Mesh : 清除当前缓存的数据,重新开始扫描,相当于停止后重新开始。函数的调用结果会在4个按钮下方的第一个显示栏显示,根据显示内容查看函数调用情况。

FindPlane 相关的API
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:这个是控制FindPlane功能的控制类,可以通过里面的函数开关FindPlane功能,获取平面数据。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseFindPlaneAPI | 这是调用FindPlane功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StARkitStartFindPlane | EStARkitCode | 无 | 无 | 开启FindPlane功能。 |
StARkitStopFindPlane | EStARkitCode | 无 | 无 | 关闭FindPlane功能。 |
StARkitGetPlaneData | EStARkitCode | EPlaneType | planeType:平面的方向。 | 获取平面数据,根据获取的平面的顶点数据渲染平面。 |
SStARkitMeshData[] | planeData:平面数据数组,一个代表一个平面。 | |||
ReadData | EStARkitCode | EPlaneType | planeType:平面的方向。 | 根据平面内存地址读取平面数据,最后以数组的形式返回。这是protected函数,用于内部调用。 |
IntPtr | data:平面数据的内存地址 | |||
SStARkitMeshData[] | planeData:平面数据数组,一个代表一个平面。 |
EPlaneType
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是定义了平面方向的枚举型。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
HORIZONTAL_DOWNWARD | 0 | 平面水平向下 |
HORIZONTAL_UPWARD | 1 | 平面水平向上 |
VERTICAL | 2 | 平面垂直 |
SStARkitPlaneData
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是FIndPlane特有的一些平面信息。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
center | float[] | 平面的中心点,是x,y,z三个轴坐标的数组,所以长度为3。 |
normal | float[] | 平面的法线方向,是x,y,z三个轴坐标的数组,所以长度为3。 |
width | float | Fish相机的FindPlane特有的,表示平面的宽,单位是米。 |
height | float | Fish相机的FindPlane特有的,表示平面的长,单位是米。 |
找平面Demo
这个Demo是只支持Android设备(NG2/G2)的,设备必须具备DisplayEngine 和Slam两个功能,和fish相机或者TOF相机。功能是主要是用fish相机或者TOF相机扫描筛选出空间中的平面数据。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/FindPlane/Scene/FindPlaneExample,依照上面的Android Build的步骤一个APK。

- 将Build好的apk在设备中安装好后运行应用。
- 运行起来后,你将看到有3个按钮跟随头部。使用gaze对这些按钮进行操作。
Start Find plane : 开始扫描空间中的平面,这个函数的调用结果会在3个按钮下方的第一个显示栏显示,可以查看函数的调用情况。如果接口调用成功,会间隔0.5秒去取一次最新的平面数据,并将平面渲染出来。拿数据的函数调用结果会在最下方的一栏显示。
Stop Find Plane : 关闭扫描空间平面的功能,函数调用的结果会显示在3个按钮下方的第一个显示栏。
HORIZONTAL_DOWNWARD : 这是一个下拉选项,有三个可选项,HORIZONTAL_DOWNWARD
(平面水平向下),HORIZONTAL_UPWARD
(平面水平向上),VERTICAL
(平面垂直水平面)。这个下拉框的值会限定fisn相机的算法过滤掉不符合的平面数据(目前算法默认只找水平的平面),在TOF相机下不起作用。

云环境识别(3.2版本)
Anchor 相关API
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:云环境识别和本地重定位的功能接口。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseCloudEnvironmentMapAnchor | 这是调用通用功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StARkitStartEnvironmentScan | EStARkitCode | bool | cloud:是否使用云识别,暂时只支持本地,所以先填flase | 开启记录环境的功能,Cloud=ture时会保存环境图片到传入的路径地址,Cloud=false时无特殊操作。该函数已被弃用,请使用StARkitStartScan(bool,int, Action<EStARkitCloudCode, string>)代替 |
string | savePath(必填):文件保存路径,确保路径存在且有访问权限 | |||
int | maxCount=100:环境记录时保存的图片数量,仅云识别使用,本地识别时无需填写。 | |||
Action<EStARkitCloudCode, string> | saveCB:记录环境过程中的一些信息状态的回调,只在云环境识别过程中使用。 | |||
StARkitStopEnvironmentScan | EStARkitCode | bool | cloud:是否使用云识别,暂时只支持本地,所以先填flase | 停止记录环境,保存map数据,如果cloud=true,则会将数据和记录的图片数据上传服务器,服务器会返回一个表示Id。该函数已被弃用,请使用StARkitStopScan(string Action<EStARkitCloudCode,string>,string,string)代替 |
string | datName(必填):保存的map数据文件名,必须是.dat格式 | |||
Action<EStARkitCloudCode, string> | uploadCB(必填):本地保存文件结果和上传云端的状态回调 | |||
string | serverURL(使用云必填):云服务器的地址 | |||
string | token(使用云必填):服务器访问的授权 | |||
StARkitStartEnvironmentRecon | EStARkitCode | bool | cloud:是否使用云识别,暂时只支持本地,所以先填flase | 开启环境识别功能,开始扫描周围环境,cloud=false,之间读取传入的本地map文件,开启重定位;cloud=ture,记录扫描的环境图像上传云端匹配,会反复保存上传,直至匹配成功后下载云端map数据自动加载进行重定位。该函数已被弃用,请使用StARkitStartRecon(bool,string,Action<EStARkitCloudCode,string>,string,string)代替 |
string | savePath(必填):文件保存路径,确保路径存在且有访问权限,如果是本地map,则是本地map保存的路径 | |||
string | dataName(本地必填):如果是本地必须填写之前保存的文件名 | |||
Action<EStARkitCloudCode, string> | reconCB:环境扫描的结果回调,本地仅返回加载map文件的结果。 | |||
string | serverURL(使用云必填):云服务器的地址 | |||
string | token(使用云必填):服务器访问的授权 | |||
StARkitStopEnvironmentRecon | EStARkitCode | bool | cloud:是否使用云识别,暂时只支持本地,所以先填flase | 如果cloud=ture会去中断扫描环境识别的过程。如果cloud=flase不会进行任何特殊操作。LoadMap之后的重定位过程是无法中断的。该函数已被弃用 |
StARkitDeleteCloudMap | EStARkitCode | string | serverURL(云必填):云服务器的地址 | 根据targetId删除服务器上对应的环境数据。 |
string | token(必填):服务器访问的授权 | |||
int | targetId(必填):云端保存环境数据的标识Id | |||
Action<EStARkitCloudCode, string> | deleteCB:删除数据的结果回调 | |||
StARkitSetLocalAnchor | EStARkitCode | SStARkitAnchor | anchor:记录的anchor数据 | 将Anchor保存本地并上传云端,暂时不支持。**该函数已被弃用,StARkitSetInterestArea(SStARkitAnchor) ** |
string | serverURL:云服务器的地址 | |||
string | token:服务器访问的授权 | |||
string | targetId:需要保存到云端的环境标识Id | |||
Action<EStARkitCloudCode,string> | anchorCB:云端保存的结果回调。 | |||
StARkitResetLocalMap | EStARkitCode | 无 | 无 | 本地Load的数据清除,恢复到之前的slam状态。该函数已被弃用,请使用StARkitResetMapData()代替 |
StARkitStartScan | EStARkitCode | bool | cloud:是否使用云服务器 | 开始建图环境扫描 |
int | selfDefineCloudSavePicNum:环境扫描保存最大图片数量 | |||
Action<EStARkitCloudCode, string> | scanCB:扫描结果回调(本地扫描时可以为Null) | |||
StARkitStartScan | EStARkitCode | bool | cloud:是否使用云服务器 | 开始建图环境扫描 |
EStARkitCloudSavePicNumLevel | pictureCode:环境扫描保存最大图片数量 | |||
Action<EStARkitCloudCode, string> | scanCB:扫描结果回调(本地扫描时可以为Null) | |||
StARkitStopScan | EStARkitCode | string | mapSlamDatFile:环境扫描保存的数据文件地址(必须为完整的文件路径,文件格式为.dat) | 停止扫描环境并保存扫描数据 |
Action<EStARkitCloudCode, string> | scanCB:保存扫描数据的结果回调 | |||
StARkitBuildEnvironment | EStARkitCode | string | mapSlamDatFile:扫描保存的数据文件(必须为完整的文件路径) | 创建云环境 |
string | iconFile:缩略图的文件地址(必须为完整的文件路径 .png格式) | |||
string | serverURL:云服务器地址 | |||
string | token:权限码 | |||
Action<EStARkitCloudCode, string> | buildCB:云环境创建结果回调 | |||
StARkitConfirmEnvironment | EStARkitCode | EStARkitCloudConfirm | cloudConfirm:选择(确认创建(id 为新环境的id),替换旧库(id 为需要删除的旧id),放弃创建(id 为新建的id)) | 对创建的云环境做一个选择(确认创建,替换旧库,放弃创建) |
int | id:需要操作的id | |||
string | serverURL:云服务器地址 | |||
string | token:权限码 | |||
Action<EStARkitCloudCode, string> | confirmCB:选择结果回调 | |||
StARkitRecon | EStARkitCode | bool | cloud:是否使用云识别 | 开启环境识别 |
string | mapSlamDatFile: 本地识别加载的数据文件(必须为完整的文件路径 格式为.dat) | |||
Action<EStARkitCloudCode, string> | reconCB:识别结果回调 | |||
string | serverURL=Null:服务器地址(本地识别可以不填) | |||
string | token=Null:权限码(本地识别可以不填) | |||
StARkitLoadMapData | EStARkitCode | int | id:指定云环境id | 选择指定id的数据下载并使用 |
string | serverURL:服务器地址 | |||
string | token:权限码 | |||
Action<EStARkitCloudCode, string> | loadCB:下载数据和本地加载重定位的回调 | |||
StARkitResetMapData | EStARkitCode | 无 | 无 | 清除加载的环境数据,取消重定位 |
StARkitGetCloudInfoList | EStARkitCode | int | pageIndex:获取页数(每次获取成功都会返回存储的总数量) | 获取当前权限下所有的云环境列表 |
int | pageSize:每页的个数 | |||
string | serverURL:服务器地址 | |||
string | token:权限码 | |||
Action<EStARkitCloudCode, string> | getCB:获取结果回调,数据将以json的格式返回 | |||
StARkitSetInterestArea | EStARkitCode | SStARkitAnchor | area:感兴趣的区域中心位置 | 设置感兴趣的区域中心(在扫描环境的过程中调用) |
EStARkitCloudCode
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:云端接口的状态。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
SUCCESS | 0 | 成功 |
PROGRESS | 1 | 中间过程 |
SAVE_PICTURE | 2 | 扫描图片进度 |
SAVE_MAP_DATA | 3 | 保存环境数据 |
LOAD_MAP_DATA | 4 | 加载环境数据进行重定位 |
GET_ID | 5 | 新环境或者识别环境的ID |
CONFIRM_DATA | 6 | 需要选择确认的数据是Json格式 |
INFO | 7 | 数据数量信息 |
RELOCALIZED | 8 | 重定位成功 |
UP_LOAD_PROGRESS | 9 | 上传进度条 |
DOWN_LOAD_PROGRESS | 10 | 下载进度条 |
FAIL | 11 | 失败 |
EToken | 12 | Token错误 |
EFILEPATH | 13 | 文件路径错误 |
ENODATA | 14 | 无数据 |
ENET | 15 | 网络错误 |
EHTTP | 16 | HTTP通信异常 |
EEXC | 17 | 系统捕获异常 |
EStARkitCloudConfirm
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:云环境建图和识别有相似场景时的确认选项。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
Replace | 0 | 舍弃旧的 |
Build | 1 | 保留新建 |
Give_Up | 2 | 删除新建的 |
EStARkitCloudSavePicNumLevel
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:云环境建图和识别时扫描环境保存的最大图片数量。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
PIC_SAVE_LOW | 0 | 设定图片数量为20 |
PIC_SAVE_MEDIUM_LOW | 1 | 设定图片数量为50 |
PIC_SAVE_MEDIUM_HIGH | 2 | 设定图片数量为80 |
PIC_SAVE_HIGH | 3 | 设定图片数量为100 |
SStARkitAnchor
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是本地map设置锚定信息时的数据封装。
3) 属性:
属性名 | 类型 | 说明 |
---|---|---|
timestamp | doublue | 锚点的创建时间戳 |
anchor_id | int | 锚点的编号id |
anc_pos_x | float | 锚点位置的X轴坐标 |
anc_pos_y | float | 锚点位置的Y轴坐标 |
anc_pos_z | float | 锚点位置的Z轴坐标 |
anc_rot_x | float | 锚点四元素的X |
anc_rot_y | float | 锚点四元素的Y |
anc_rot_z | float | 锚点四元素的Z |
anc_rot_w | float | 锚点四元素的W |
cam_pos_x | float | 观察点的X轴坐标 |
cam_pos_y | float | 观察点的Y轴坐标 |
cam_pos_z | float | 观察点的Z轴坐标 |
cam_rot_x | float | 观察点四元素的X |
cam_rot_y | float | 观察点四元素的Y |
cam_rot_z | float | 观察点四元素的Z |
cam_rot_w | float | 观察点四元素的W |
Anchor Demo
这个Demo主要是展示Slam本地重定位以及云环境识别的流程以及效果,支持Android设备(NG2)。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/MapDemo/Scenes/TestAnchor 依照上面的Android Build的步骤出一个应用。

- 将Build好的apk在设备中安装好后运行应用。
- 运行起来后会看到2个按钮和1个勾选项,其中勾选项表示是否使用云环境识别,只有在成功获取Token后才可勾选。


- 如果不勾选使用云环境识别,则为本地数据保存和识别,点击开始扫描环境开始扫描,界面如下图:

- 扫描环境结束后点击停止扫描环境保存数据,之后可以点击重新开始回到刚开始的界面。

- 如果不勾选使用云环境识别,点击开启识别 加载最近一次保存的环境数据开始重定位,过程中点击清除数据加载 可以停止本次重定位回到一开始的界面,界面如下图:

- 如果重定位成功,场景中的方块将回到保存数据时的方位,界面也会出现文字提示和重新开始的选项。

- 如果选择了UseCloud使用云环境识别,界面会多出一个获取获取云环境列表的按钮。

- 勾选UseCloud后,选择开始扫描环境将开始扫描环境并保存环境数据和图片,扫描的过程中需要有移动,尽量扫纹理丰富有明显特征的区域,当上面进度达到50%后会出现停止扫描环境的选项可以提前停止,如下图:

- 点击停止扫描环境之后,如果认为扫描的没有问题就选择上传数据创建云环境,如果不想保留这组数据可以选择重新开始。

- 选择上传数据创建云环境 后,需要拍摄一张能够代表环境的缩略图。

- 拍摄好缩略图之后,会自动上传缩略图和之前保持的环境数据及照片,在服务器进行匹配创建。

- 数据上传之后会返回场景的id,如果没有则流程结束;如果服务器有相似场景需要进行确认操作,选择舍弃旧的之后需要再选择一下舍弃环境的图标按钮进行删除;选择保留新建,则所有场景都会保存在服务器;选择删除新建,则会将新建的数据删除。

- 勾选UseCloud后,选择开启识别将会自动开始扫描环境,当进度达到100%后自动上传服务器进行匹配。

- 服务器匹配成功之后,如果没有符合的场景则回到一开始的选择界面,如果有相似场景,需要根据匹配度score 和缩略图进行确认选择一个下载数据进行本地重定位。




物体识别定位与环境识别定位
目标制作
物体目标
用户想识别一个物体,但没有其对应的3D模型,可以基于扫描的方式来制作识别目标。 该类型目标需要首先使用晨星扫描仪扫描采集待识别目标的数据后,上传到云端进行训练处理,进而生成目标识别信息,然后即可在平台网页端进行管理操作。 目标管理操作见这里。晨星扫描仪的使用方法参考此处。

环境目标
若需要识别的对象为一个空间环境区域,其制作目标的方式和物体目标类似,仅需在扫描仪中右上角切换为环境模式即可。需要注意的是环境扫描时,扫图的人扫描的范围(包含垂直高度,远近)要涵盖住识别的人使用的范围, 同一个面尽量避免不同角度反复扫描,这样重定位的位姿精度会高些。

模型目标
模型目标通过在平台网页端上传目标对应的3D模型。在项目中点击“物体识别目标物”进入上传资源页面,再点击右上方"上传"-"模型"按钮,在弹出的对话框内填写目标名称后,选择本地模型文件和模型文件的单位,点击上传模型,即可将模型和相关信息上传到云端,从而进行自动处理,生成识别目标。

注意:模型文件格式目前支持obj、fbx和dae。若该识别应用是运行在AR眼镜,请务必选择正确的模型单位
图片目标
图片目标是指用户在平台上传一张图片,经云端自动处理后生成可用于stARkit for Cross-platform SDK识别的目标。然后用户将该图片打印出来后,SDK可直接识别打印的图片,进行叠加各种虚拟的信息。图片目标的制作流程与模型目标基本一样,仅在于上传时选择图片即可。
注意:若该识别应用是运行在AR眼镜,请务必填写正确的打印图片宽度

目标管理和下载
在项目页面点击“物体识别目标物”,进入目标管理页面后,可以看到当前项目中的所有目标及其信息。上述各类目标在经过平台处理后,显示为可用状态时,可以通过目标列表右侧的“下载”按钮,将制作好的目标下载到本地电脑中,用于后续的应用开发。
下载的目标为tag[id]_[rand_string].zip的形式,请不要更改文件名和内容。

基于Unity SDK进行物体识别应用开发
在Assets/Recognition/TargetReco中,提供了4个目标识别与跟踪的示例场景(见Assets/Recognition/TargetReco/Tutorial/Scenes),双击打开后既可在unity editor中修改配置运行或编译。

RecognitionTutorial For Smart Core:支持通用Android和iOS设备的示例场景。
RecognitionTutorial:支持PC端及unity editor的示例场景。
RecognitionTutorialForDaystar:支持晨星眼镜设备的示例场景。
RecognitionTutorialForHololens:支持HoloLens设备的示例场景。
若需要自己制作场景,请参考以下步骤,下列步骤以Unity2020.3.8f1c1为示例,不同版本unity的界面或选项存在一定差异。
开发场景配置
在Unity下方的项目窗口中,找到相关的预制件,将其拖拽添加到Unity场景中,注意各个预制件的层级,添加后状态见下图红框。需要添加的预制件包含:
/Assets/Common/Prefabs/SRApplication.prefab
/Assets/stARFrame/Prefabs/SRFrameManager.prefab
/Assets/stARFrame/Prefabs/SRBackground.prefab(D_ARFoundation和无SLAM的D_WebCamera设备必选)
/Assets/Recognition/TargetReco/Prefabs/SRTargetReco.prefab
/Assets/Recognition/TargetReco/Prefabs/SRTargetManager.prefab
/Assets/Recognition/TargetReco/Prefabs/SRNotification.prefab (可选)

具体配置:
点击场景中的SRApplication,并在右侧属性列表输入服务器网址以及应用的APP Key和Secret,请务必填入自己APP对应的Key和Secret,获取途径参考此处。
点击SRFrameManager,选择相应的设备类型。SRTargetReco建议使用如图配置。

添加目标到场景中
点击场景中的SRTargetManager,右侧属性面板点击"添加目标"按钮,在弹出的对话框中,找到从开发者网站下载的目标文件zip包,点击"打开"即可将该目标添加到场景中,加载一个SRTargetModel_tag[xxx]预制件。同时在SRTargetManager面板的目标列表会显示当前场景中的目标,通过点击“删除”按钮可将对应目标移除。

叠加虚拟模型
如上述操作添加目标后,相应SRTargetModel预制件中会附着一个目标3D模型作为子物体,此处可以根据具体业务需求,在该3D模型下挂着各种虚拟资源(模型、视频、图片等),这样在识别到该物体时便会自动显示加入的虚拟资源。

运行程序
在PC上插入一台摄像机,点击Unity顶部开始按钮,即可进行识别。或者将其打包为Windows应用运行,需要注意的是编译Windows物体识别应用前需在Project Settings->Graphics->Always Included Shaders中添加Unlit/Texture。

编译方法参考打包PC应用。编译完成后直接运行exe默认开启设备上第一个相机,若需要开启其他外接相机可在\“Product Name”_Data\StreamingAssets\CameraName路径下的CameraDeviceName.txt文件中指定RGB相机名字,再运行exe进行识别。

晨星AR眼镜
物体识别功能不仅支持PC、手机、平板等基于视频透视的设备,也支持光学透视的AR眼镜。目前支持联想晨星AR眼镜的G2、New G2和New G2 Pro设备。 对于AR眼镜设备应用的创建,首先需要参考前面的[场景配置](#基于Unity SDK进行物体识别应用开发),然后更改对应的选项和预制体。在AR眼镜上使用物体识别分为眼镜配联想拯救者手机和眼镜配Windows电脑两种情况:
眼镜配联想拯救者手机
在"Assets\stARkit\Lenovo.stARkit.SDK"下找到"StARkitMixtureGlassSeeThrough.prefab" 预制件,将其拖拽添加到场景层级窗口。

更改SRFrameManager与SRTargetReco的配置,设备类型一定要与实际设备对应,否则可能会导致虚实叠加不准,详细场景配置可参照RecognitionTutorialForDaystar场景。

以上配置完成将其打包为安卓应用,即可安装到联想晨星设备上运行,方法同打包和部署安卓应用。
眼镜配Windows电脑
在"Assets\stARkit\Lenovo.stARkit.SDK"下找到"StARkitTrackingWin.prefab" 预制件,将其拖拽添加到场景层级窗口。

更改SRTargetReco的配置。在Project Performance->Graphics->Always Included Shaders中添加Unlit/Texture。

以上配置完成将其打包为Windows应用,方法参考打包PC应用。编译完成后在\“Product Name”_Data\StreamingAssets\CameraName路径下的CameraDeviceName.txt文件中指定AR眼镜RGB相机的名字,最后运行exe在眼镜端进行识别。

Unity SDK的环境识别应用
在Assets/Recognition/SceneReco中,提供了2个环境识别与跟踪的示例场景(见Assets/Recognition/SceneReco/Tutorial),双击打开后既可在unity editor中修改配置 运行或编译。

ARFoundationExample:支持通用Android和iOS设备的环境识别示例场景。
StARkitMapExample:支持晨星眼镜设备的环境识别示例场景。
若需要做虚实叠加,可以通过晨星视觉智能平台网页下载所需的环境识别3D模型,将其置于unity场景中用于参考,确保3D模型的position和rotation在(0,0,0),再将此model拖至[StARkitMapSession]下SR Scene Session中的场景模型。

将下载的xxxx_ld.dat文件放到\Assets\StreamingAssets\MapConfig路径下一起编译。

运行示例场景apk可看到如下界面,选择“Loc”,取消勾选“UseCloud”,在“请输入map id”输入框中输入id;

点击”开始识别“界面会有提示->(id)重定位中;

移动camera进行环境重定位,成功后界面会有提示->(id)重定位成功,同时放在上述unity开发场景中的对应model会贴附到真实环境中,也可观察屏幕右下方重定位前后的坐标信息。

高级开发帮助
对于初级开发者,只需通过配置示例场景或放入并配置预制件即可完成基本的3D目标识别定位应用。但当需要在一个解决方案中使用识别定位功能时,应用开发者需要自行控制识别算法的启动结束时机,或者根据识别结果激活一些自定义的行为。这样的应用场景下,需要开发者主动调用SDK的接口和重新注册事件回调来实现。
unity预制件配置说明
SRApplication | SDK 通用预制件 |
---|---|
Domain Host | 设置平台网站域名,通常为https://daystar.lenovo.com, 私有云用户的具体修改值需联系服务器管理员 |
App Key | 需要识别的APP对应的Key |
App Secret | 需要识别的APP对应的Secret |
SRFrameManager | SDK 通用预制件 |
---|---|
Device Type | 设备类型 |
Display Mode | M_Video_See: 视频透视模式,通常PC、手机平板等需要选择该模式 |
Camera ID | 相机设备ID。通常为从0开始的整数 |
Resolution | 相机分辨率 |
Auto Open Camera | 是否自动开关相机 |
SRTargetReco | TargetReco预制件 |
---|---|
AutoGetFrame | True:自动获取图像,无需用户传图像 False:用户需自主传入图像帧 |
AutoStartReco | True:应用启动时自动开始识别 False:用户手动调用接口开启识别 |
SRTrackingMode | TARGET_TRACKING:物体跟踪,建议在手机、PC等设备上使用 |
Roi Width Ratio | 识别感兴趣区的宽度与图像宽度比例 |
Roi Height Ratio | 识别感兴趣区的高度与图像高度比例 |
SRTargetModel | TargetReco预制件 |
---|---|
Tag | 目标唯一标识,由云端系统生成 |
Auto Add Target | 自动加载目标,取消勾选后需用户自行调用接口加载,适合高级开发者使用 |
Auto Enable Target | 自动激活目标,取消候选后需用户自行调用接口激活 |
[StARkitMapSession] | SceneReco预制件 |
---|---|
场景模型(Scene Model) | 环境识别id对应的模型 |
云服务功能(Cloud service function) | Enabled:启用云服务 Disable:禁用云服务 |
Map云端域名(Map cloud domain name) | 同SRApplication平台网站域名 |
TargetReco接口调用
stARkit SDK中TargetReco提供的接口类为SRTargetRecoBehaviour,该类提供了实例获取方法public static SRTargetRecoBehaviour Instance(),通过该方法获取类实例后即可调用其中的接口控制算法行为。其中控制识别算法的接口主要有:
目标操作接口
//========================================================
//action有4种类型:
// TARGET_ACTION_ADD —— 加载目标
// TARGET_ACTION_REMOVE —— 删除目标
// TARGET_ACTION_ENABLE —— 激活目标
// TARGET_ACTION_DISABLE —— 冻结目标
//========================================================
public void TargetDoAction(string tag, SRTargetAction action);
一个目标需要先被加载,然后激活后才可以被识别和跟踪。
但一个目标暂时不需要识别时,可以将其冻结,若后续都不再需要使用,则建议将其删除以节约系统资源。一个目标被加载后默认处于冻结状态。
在RecognitionTutorial的SRTargetBehaviour.cs脚本文件中有调用示例。
识别流程控制接口
//========================================================
//暂停识别,调用接口后,识别回调事件将不会被触发
//========================================================
public void TargetRecoPause();
//========================================================
//恢复识别
//========================================================
public void TargetRecoResume();
TargetReco自定义回调事件
stARkit识别在每个主要接口调用完成后,会触发相应的回调事件。用户可以通过注册回调的方式触发自定义行为。
SDK初始化完成
在SDK初始化完成后会触发,通常仅在应用启动后触发一次。该事件在SRTargetBehaviour.cs脚本有调用示例,用于在初始化完成后自动加载目标。
回调事件:SRTargetRecoBehaviour.InitializeEvent
回调函数:void SRInitializeFinishedCallback(int errCode);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败
目标操作完成
每次目标操作完成后触发。该事件在SRTargetBehaviour.cs脚本有调用示例,用于加载目标后自动激活目标。
回调事件:SRTargetRecoBehaviour.DoActionEvent
回调函数:void SRDoActionFinishedCallback(int errCode, string tag, SRTargetAction action);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败
tag —— 操作目标的tag
action —— 操作类型
SDK销毁完成
在SDK销毁完成后会触发,通常仅在应用退出前触发一次
回调事件:SRTargetRecoBehaviour.DestroyEvent
回调函数:void SRDestroyFinishedCallback(int errCode);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败
单帧识别完成
每帧识别完成后都会触发一次,可根据回调的识别目标信息来判断该帧图像的识别情况。该事件在SRTargetBehaviour.cs脚本有调用示例,在每帧识别完后,实时更新虚拟模型的在场景中的位姿信息。
回调事件:SRTargetRecoBehaviour.TargetPoseChangedEvent
回调函数:void SRTargetPoseChangedCallback(int errCode, SRAugTargets augTargets, IntPtr usrData);
参数说明:errCode —— 初始化错误码,0:成功, 非0:失败
augTargets —— 识别出的目标以及其位姿信息
usrData —— 用户自定义信息,默认情况为识别图像帧的一些附加信息
TargetReco自定义相机数据
默认情况下,stARkit SDK会自动打开相机获取画面进行识别,在某些情况下,开发者需要多个模块共用一个相机,因此需要其自行控制相机的开关,并将图像数据传到SDK中。 SDK中提供了一个接口供外部传入图像数据:
void SubmitFrame(ref SRRecoFrame frame);
frame —— 图像帧数据
同时,若要主动调用该接口,需要在SRTargetReco prefab中把“自动获取图像”的复选框去除勾选。
TargetReco其他接口说明
TargetReco接口中还提供了2个接口,用于获取SDK相关的状态:
SDK版本获取接口
//用于获取算法SDK的版本信息
public string GetVersion();
错误描述信息获取接口: 每个回调事件中都会附带一个错误码,用于标识本次接口调用是否成功,当错误码非0时,可以调用GetErrorDescription函数获取错误信息,辅助定位失败原因。
//获取错误码对应的描述
public string GetErrorDescription(int errCode);
SceneReco接口调用
stARkit SDK中SceneReco提供的接口类为SRSceneRecoBehaviour,该类提供了实例获取方法public static SRTargetRecoBehaviour Instance(bool cloud),参数为是否使用云服务,通过该方法获取类实例后即可调用其中的接口控制算法行为。其中控制识别算法的接口主要有:
识别流程控制接口
//========================================================
//开启识别或重定位
//"relocTimeoutMS":识别或重定位的时长
//"mapid":-2 识别加重定位,-1 仅识别;>=0 仅重定位
//"localMapPathDirectory":本地存放id特征文件的路径
//========================================================
public virtual SRRestultCode SceneRecoStart(float relocTimeoutMS,int mapid=-2,string localMapPathDirectory = null)
//========================================================
//停止识别或重定位
//========================================================
public virtual SRRestultCode SceneRecoStop()
//========================================================
//获取环境id列表
//========================================================
public virtual SRRestultCode GetSceneList(int pageNo, int pageSize)
//========================================================
//根据环境id删除对应特征文件
//========================================================
public virtual SRRestultCode DeleteSceneData(int mapId)
//========================================================
//传数据
//========================================================
public virtual SRRestultCode SubmitFrame(SRFrameData[] frameDatas,List<byte[]> datas)
SceneReco自定义回调事件
stARkit环境识别提供了一组注册接收回调和取消回调注册。用户可以通过注册回调的方式触发自定义行为。
//========================================================
//注册接收回调
//"SRBaseSceneRecivedData":识别或重定位过程中的状态信息
//========================================================
public void RegisterRecived (Action<SRBaseSceneRecivedData> recived)
//========================================================
//取消回调注册
//========================================================
public void UnRegisterRecived(Action<SRBaseSceneRecivedData> recived)
其他
Display 相关的API
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:GlassSeeThrough使用的DisplayEngine的对外API集合。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseDisplayAPI | 这是调用显示相关功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
DisplayGetPredictedTime | EStARkitCode | float | predoctedTime:显示动态预测时间 | 获取显示预测时间 |
DisplaySetWarpMode | EStARkitCode | bool | status : ture 打开ATW(动态预测);false 关闭ATW(动态预测) | 控制ATW功能的开关 |
SStARkitEyeData
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是获取Glass的左右眼的标定参数的数据集合。
3) 属性:
属性名 | 类型 | 说明 |
---|---|---|
fovDown | float | 下半屏fov |
fovLeft | float | 左半屏fov |
fovRight | float | 右半屏fov |
fovUp | float | 上半屏fov |
pos | Float[] | 一个长度为3的float数组,分别表示位置的X,Y,Z |
rot | Float[] | 一个长度为3的float数组,分别表示旋转的X,Y,Z |
CameraParameterAPI
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:这是获取相关标定参数的API集合。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseCameraParameterAPI | 这是调用通用功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StARkitGetRGBCameraGetIntrin | EStARkitCode | EStARkitResolutionCode | resolution:需要获取内参的分辨率(G2设备只支持640*480) | 获取指定分辨率下的RGB内参。 |
SStARkitRGBIntrin | rgbIntrin:标定的RGB的内参数据 | |||
StARkitGetUnityCameraFov | EStARkitCode | EIOConfigDataType | dataType:获取数据的种类(IO_CMD_GET_LEFT_EYE和IO_CMD_GET_RIGHT_EYE) | 获取左眼或者右眼的显示fov瞳距等参数 |
SStARkitEyeData | eyeData:标定的Glass的显示参数 |
EIOConfigDataType
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:获取标定参数的数据类型。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
IO_CMD_GET_RGB_INIRINSIC | 1 | RGB相机的内参 |
IO_CMD_GET_LEFT_EYE | 2 | Glass的左眼显示FOV和瞳距等显示参数 |
IO_CMD_GET_RIGHT_EYE | 3 | Glass的右眼显示FOV和瞳距等显示参数 |
EStARkitResolutionCode
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:图像分辨率。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
R2592X1944 | 1 | 分辨率为2592*194 |
R1920X1080 | 2 | 分辨率为1920*1080 |
R1280X720 | 3 | 分辨率为1280*720 |
R640X480 | 4 | 分辨率为640*480 |
R640X360 | 5 | 分辨率为640*360 |
SStARkitRGBIntrin
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:这是获取RGB内参的数据集合。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
fx | float | 内参的fx |
fy | float | 内参的fy |
cx | float | 内参的cx |
cy | float | 内参的cy |
RGBD 相关的API
1)命名空间:Lenovo.stARkit.SDK.Features.API。
2)简介:这个是将RGB图像和TOF图像之间进行转换的功能,赋予RGB图像深度值,只能在拥有TOF相机的设备上使用(例如G2)。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Instance | BaseRGBDAPI | 这是调用RGBD功能的单列,会根据平台不同,初始化不同的类,必须通过此调用其他函数。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
StARkitStartRGBD | EStARkitCode | EStARkitRGBDMode | trans_mode:RGBD的工作模式 | 用于启动工作流程和初始化RGBD算法。 |
EStARkitTofMode | tof_mode:TOF相机的工作模式 | |||
int | rgb_w:rgb图像数据的宽(像素分辨率) | |||
int | rgb_h:rgb图像数据的高(像素分辨率) | |||
StARkitStopRGBD | EStARkitCode | 无 | 无 | 用于关闭工作流程和初始化RGBD算法。 |
StARkitDoRGBD | EStARkitCode | IntPtr | in_rgb_img:要输入到RGBD算法的rgb图像数据缓冲区。如果在StARkitStartRGBD中将工作模式设置为"RGB_DEPTH",则必须输入此参数并且不能为null。如果工作模式设置为"DEPTH_RGB"或"DEPTH_RGB_PIXEL", 此输入缓冲区不会在算法中使用,因此参数可以为null。如果将rgb图像输入到算法中,则图像的分辨率必须等于在" StARkitStartRGBD"中设置的rgb_w和rgb_h。 | 用于执行RGBD算法的API。 每次调用API时,RGBD算法都会输出rgbd结果数据。必须首先调用API" StARkitStartRGBD" |
IntPtr | out_point_cloud:点云数据的输出数据缓冲区。在向API输入缓冲区之前,此缓冲区应该是由调用者使用(depth_w * depth_h * 12)字节的内存分配。在G2和StarCore模块中,depth_w为224,depth_h为172。 如果此参数输入NULL指针,则API将不会输出点云数据 | |||
IntPtr | out_depth_img:深度图像数据的输出数据缓冲区。在输入API缓冲区之前,调用者应将该缓冲区内存分配为(depth_w * depth_h * 2)字节。在G2和starCore模块中,depth_w为224,depth_h为172。 如果此参数输入NULL指针,则API将不会输出深度图像数据 | |||
IntPtr | out_rgbd_img:rgbd结果数据的输出数据缓冲区。如果在startRgbdTrans中将工作模式设置为"RGB_DEPTH",则此调用程序必须是由调用方使用(depth_w * depth_h * 3)字节的malloc。如果工作模式设置为"DEPTH_RGB"或"DEPTH_RGB_PIXEL" 在startRgbdTrans中,此缓冲区必须是由调用者使用(rgb_w * rgb_h * 2)字节的malloc。如果此参数输入NULL指针,则API将直接返回错误。 |
EStARkitRGBDMode
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:表示RGBD的工作模式。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
RGB_DEPTH | 0 | RGB图到TOF图模式 |
DEPTH_RGB | 1 | TOF图到RGB模式 |
DEPTH_RGB_PIXEL | 2 | 像素填充TOF图到RGB模式 |
EStARkitTofMode
1)命名空间:Lenovo.stARkit.Toolkit.Utilites.Definitions。
2)简介:TOF相机的工作模式。
3)属性:
属性名 | 值 | 说明 |
---|---|---|
MONO_FREQUENCY | 0 | 单频模式 |
DUAL_FREQUENCY | 1 | 双频模式 |
RGBDDemo
这个Demo主要是展示RGB的图像如何和Tof的深度信息进行匹配使用,由于需要使用TOF相机所以暂时只支持G2设备,NG2不支持。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/RGBDDemo /Scene/RGBDDemo 依照上面的Android Build的步骤出一个应用。

- 将Build好的apk在设备中安装好后运行应用。
- 场景中有3个按钮如下图:
StartRGBD: 开启RGBD功能
StopRGBD: 关闭RGBDD功能
Quit: 退出应用

- 点击StartRGBD之后会出现如下提示,按照提示将Gaze光标对准需要知道深度的地方,点击确认键,会在对应位置产生点云,上方是RGB相机拍到的图像。

FocusEventData
1)命名空间:Lenovo.stARkit.Tookit.EventSystems。
2)简介:这是Focus事件的数据类,里面包含了事件的需要用到的各种细节信息。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
Pointer | IStARkitPointer | 触发事件的指针。 |
OldFocusedObject | GameObject | 上一个Focus物体。 |
NewFocusedObject | GameObject | 新的Focus物体,即当前触发的物体。 |
HitPoint | Vector3 | 指针触发物体事件的点。 |
HitWorldNormal | Vector3 | 指针触发物体事件点的法线方向。 |
Reactable | bool | 当前Focus物体是否有点击事件可触发 |
EventCamera | Camera | 触发事件的相机。 |
4)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
FocusEventData | 无 | EventSystem | eventSystem:触发事件的事件系统。 | 构造函数,需传入事件系统。 |
Initialize | 无 | IStARkitPointer | pointer:用指针初始化数据。 | 1个参数的初始化重载函数。 |
Initialize | 无 | IStARkitPointer | pointer:用指针初始化数据。 | 2个参数的初始化重载函数。 |
GameObject | newFocusedObject:新的Focus物体,即当前触发的物体。 | |||
Initialize | 无 | IStARkitPointer | pointer:用指针初始化数据。 | 3个参数的初始化重载函数。 |
GameObject | oldFocusedObject:上一个Focus物体。 | |||
GameObject | newFocusedObject:新的Focus物体,即当前触发的物体。 | |||
Initialize | 无 | IStARkitPointer | pointer:用指针初始化数据。 | 7个参数的初始化重载函数。 |
GameObject | oldFocusedObject:上一个Focus物体。 | |||
GameObject | newFocusedObject:新的Focus物体,即当前触发的物体。 | |||
Vector3 | hitPoint:指针触发物体事件的点。 | |||
Vector3 | hitNormal:指针触发物体事件点的法线方向。 | |||
Camera | eventCamera:触发事件的相机。 | |||
bool | Clickable:当前Focus物体是否有点击事件可触发 |
IStARkitFocusChangedHandler
1)命名空间:Lenovo.stARkit.SDK.Features.Handler。
2)简介:这个接口和IPointerEnterHandler的使用方法是一样的,同时它还可以注册全局监听, CoreServices.InputSystem?.RegisterHandler<IStARkitFocusChangedHandler>(handler);这样可以在任意地方监听Gaze交互的状态了。
3)函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
OnFocusChanged | 无 | FocusEventData | eventData:事件触发的数据。 | 当Focus的物体发生改变时会被调用。 |
OnFocusTarget | 无 | FocusEventData | eventData:事件触发的数据。 | 当Focus在一个物体上时被调用。 |
IStARkitInputSystem
1)命名空间:Lenovo.stARkit.Tookit.EventSystems。
2)简介:这是事件系统的接口类,定义了事件系统对外的API,调用的方式为CoreServices.InputSystem,这里可以控制Gaze的开关。
3)属性:
属性名 | 类型 | 说明 |
---|---|---|
InputEnabled | Action | 在事件系统Enable的时候调用委托。 |
InputDisabled | Action | 在事件系统Disenable的时候调用委托。 |
IsInputEnabled | bool | 当前事件系统是不是enable状态。 |
Pointers | HashSet | 事件指针的存储列表。 |
KeyInputEnabled | bool | 手柄的按键事件是否工作 |
4) 函数:
函数名 | 返回值 | 参数类型 | 参数 | 说明 |
---|---|---|---|---|
RegisterPointer | bool | IStARkitPointer | pointer:触发事件的指针。 | 注册事件指针 |
UnregisterPointer | bool | IStARkitPointer | pointer:触发事件的指针。 | 取消注册事件指针。 |
IsPointerRegistered | bool | IStARkitPointer | pointer:触发事件的指针。 | 判断事件触发指针是否注册过。 |
GenerateNewPointerId | uint | 无 | 无 | 返回一个事件指针的全局ID。 |
SetPointerActive | bool | bool | active:事件指针是激活还是关闭。 | 操作事件指针的激活和关闭。例如关闭Gaze: CoreServices.InputSystem?.SetPointerActive(false, "GazePointer"); |
string | pointerName=null:如果是null,则是对所有的事件指针操作,否则是对传入的名字的事件指针执行操作。 | |||
RaiseFocusChanged | 无 | IStARkitPointer | pointer:触发事件的指针。 | 触发交互物体改变的事件,只有发生变化时才会触发。 |
GameObject | oldFocusedObject:上一个交互物。 | |||
GameObject | newFocusedObject:最新的交互物。 | |||
RaiseFocusTarget | 无 | IStARkitPointer | ||
GameObject | FocusedObject:当前正在交互的物体。 | |||
RegisterKeyEventCallBack | 无 | Action<KeyCode, EControllerKeyStatus> | keyStateEvent:按键触发的回调事件,KeyCode是键值,EControllerKeyStatus是按键的状态 | 注册按键触发的回调事件 |
UnregisterKeyEventCallBack | 无 | Action<KeyCode, EControllerKeyStatus> | keyStateEvent:按键触发的回调事件,KeyCode是键值,EControllerKeyStatus是按键的状态 | 取消注册按键触发的回调事件 |
GazeEvent Demo
这个Demo主要介绍Gaze交互系统,这个是支持Android和Windows的,主要使用了slam功能。和UGUI交互的条件是Canvas必须设置为WorldSpace,EventCamera设置为挂有StARkitEventSystem脚本的相机。Gaze通常是在平面的正中间,通过头的转动控制交互,当连接对应的手柄后,手柄控制Gaze在平面内的位置。和3D物体交互则物体必须有碰撞体且挂有实现了Ipointer事件的脚本。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/GazeEvent /GazeEventDemo,依照上面的Android Build或者PC Build的步骤出一个应用。

- 默认是事件系统是使用手柄的,可以在Scene中的EventCamera上挂的StARkitEventSystem上修改。

- 将Build的应用安装到指定设备上,并运行(PC上的运行请参考SlamWindows)。
- 程序运行起来后,会看到正前方有3列UI。
Interactive(可交互) : 这一列组件是可以Gaze交互的,最下方的方块也是可交互的,可以和最后一列进行对比找到其中的规律。和UGUI交互的条件是Canvas必须设置为WorldSpace,EventCamera设置为挂有StARkitEventSystem脚本的相机。3D物体的交互必须有碰撞体,且有挂有继承了Ipointer事件系统的组件或脚本。
Focus&Disable(全局监听Focus和关闭Gaze) : 这一列是监听了Gaze的全局事件,注册事件之后,当Gaze的交互物体发生改变时或者在交互物上移动时都会收到消息,继承IstARkitFocusChangedHandler。按钮DisableGaze是动态关闭Gaze交互功能。中间的Controller按钮是当有手柄连接时切换方向键控制和3dof控制的。
NotInteractive(不可交互) : 这一栏是不可交互的,主要是用来和可交互对比的。

stARkit for daystAR附录:Unity PC SLAM开发介绍
Unity Windows创建工程
具体流程参考创建工程
Unity 出 PC SLAM应用
- 按照上面创建工程的步骤创建一个工程和一个场景。
- PC上不支持GlassSeeThrouth,所以把场景中的StARkitMixtureGlassSeeThrough.prefab替换为StARkitTrackingWin.prefab。


Slam_win demo介绍
这个Demo主要是在Windows上展示Slam的,只需要PC上联接了支持此SDKSlam的设备即可。
- 选择Assets/stARkit/Lenovo.stARkit.SDK/Demo/Slam_win,按照PC build的步骤出应用。
- 默认slam是起的6dof,节点为Head,可以在Scene中的StARkitSlamWing上挂的脚本修改。

(NOTE: build完成后建议把Glass对应的标定文件手动拷贝到starkit_config目录下,拉取Glass标定文件的方式请联系售后)

- 如果你需要通过Glass观看效果,必须确保电脑能识别Glass并将电脑的显示设置为屏幕扩展,在启动应用时按如下设置。如果启动的时候没有选择显示屏幕和设置分辨率的界面,就将运行后的窗口拖拽到Glass的显示器上,应用会自动切换为全屏。


- 进去之后你会看到有一个星宝在视野的正前方,在初始位置正前方1m处。可以移动绕着方块从各个角度观察,如果方块在空间的位置固定不变,且距离感正确,这表示功能正常。
UnityXR
这个Demo场景主要是展示通过UnityXR的接口在PC上启用Slam的Tracking功能,必须使用Unity2019.3.x的版本进行编译。
- 从发布的StARkit3.x.release.unitysdk.zip解压得到一下文件:

- com.unity.xr.sdk.displaystarkit.zip是提供Tracking和Display功能unityXR native-libs package
- 把需要的插件解压后的内容拷贝到Unity工程Assets同等目录Packages下:

- 首先打开工程的ProjectSetting的XR plug-in Management功能:

- 然后在Unity中打开PackageManager窗口,导入需要的package:

- 退出并重新进入工程,(UnityXR需要)重新打开工程后,如果提示有依赖库找不到,可以尝试重新导入一遍packages。
- 设置插件的库的平台:比如DisplayProviderStarkit.dll 仅支持x86_64,勾选其他平台会导致应用异常。

- 按照Build PC的流程Build和运行。