Vuforia入门Windows 10开发

来源:互联网 发布:西交大网络圈存 编辑:程序博客网 时间:2024/06/06 02:53
(本文翻译自https://library.vuforia.com/content/vuforia-library/en/articles/Training/Getting-Started-with-Vuforia-for-Windows-10-Development.html)
  • 在Unity中为Windows 10开发
  • 在Visual Studio 2015中使用ImageTargets

Vuforia 6引入了针对基于Intel的Windows 10设备(包括Microsoft Surface和HoloLens)开发Windows UWP应用程序的支持。已经推出了新的UWP版本的Vuforia SDK,用于本机和Unity开发,以及两个示例项目,演示了在C ++和C#中使用VuMark和ImageTargets的Unity。

SDK和样本都使用Vuforia C ++ API进行UWP本机开发,并使用C#API进行Unity开发。

释放人工制品

本土发展

  • 适用于Windows 10的Vuforia UWP SDK
  • 适用于Windows 10的Vuforia UWP本地样本
    • 图像目标
    • VuMark

团结发展

  • Vuforia Unity Extension for Windows 10
  • Vuforia Unity样本Windows 10
    • 图像目标
    • VuMark

样品

您可以在核心功能中找到以下示例 档案为UWP

  • 图像目标
  • VuMark

支持的工具

  • Visual Studio 2015(推荐更新2)
  • Direct3D11

你可以找到有关Vuforia支持的操作系统,工具和设备版本的其他信息在这里

支持的设备

有关支持的设备的其他信息,请参见此处

注意: Vuforia仅支持x86 UWP构建。不支持ARM UWP构建。


在Unity中为Windows 10开发

支持的版本:
⦁Visual Studio 2015(推荐更新2)
⦁Unity 5.4.0f3

安装和配置

您需要安装上述版本的Visual Studio和Unity,然后配置Unity才能使用Visual Studio作为首选的IDE和编译器。您还需要为Unity安装Visual Studios工具,请参阅下面的文章以获取此安装程序的链接。
  请参阅:
Visual Studio Tools for Unity入门 - MSDN
Unity - 手册:Visual Studio C#集成

安装Unity时,请确保安装Windows Store平台以及.Net脚本后台选择Windows Store平台后,也可以从“ 构建设置”对话框中安装Windows Store组件

入门

从UWP的Vuforia Unity样本之一开始,了解Vuforia Windows 10 Unity项目的结构和组织。对于Unity,Vuforia UWP扩展和样本与Android和iOS几乎相同。唯一的区别是Windows Store从Unity构建使用一组平台特定的编译的Vuforia插件库。

示例是完整的Unity项目,包括用于Win 10的Vuforia Unity Extension,以及实现图像目标或VuMarks的预配置场景。您可以通过选择Windows Store作为目标平台,然后在构建设置中按Build按钮,轻松构建它们来评估每个功能。请参阅构建并执行下面的示例

构建Windows Store应用程序时,Unity会生成一个Visual Studio项目并启动Visual Studio IDE。然后,您可以从Visual Studio构建并运行该项目。

安装Unity扩展
请参阅:开始使用Vuforia进行Unity开发

安装Unity样本
 

构建设置

要构建示例,请将“ 场景”文件夹中的所有场景添加“ 文件”>“构建设置”对话框中的“ 生成场景选择Windows Store作为构建平台。

注意:  如果您最初安装了Unity编辑器时没有选择安装这些组件,则可能需要安装其他Unity Windows Store组件 - 该对话框将引导您使用必要的安装程序。

选择Build for Windows Store将为这些平台生成本机项目目录和解决方案。然后,您将需要从这些资源Visual Studio构建可执行文件。 

构建和执行示例
⦁在“ 文件”>“构建设置”中设置 Windows Store的平台构建目标
⦁将场景添加到Build中的场景中。
⦁定义唯一的产品名称,作为安装在设备上的应用程序的名称。
⦁按Build按钮生成Visual Studio项目
⦁从Visual Studio生成可执行文件并将其安装在设备上

Visual Studio构建配置

确保为x86设置构建目标。

要打包所有UWP设备的应用程序,请参阅:打包适用于Windows 10的通用Windows应用程序

 


在Visual Studio 2015中使用ImageTargets

本文将指导您完成在Visual Studio 2015中设置Vuforia UWP SDK和ImageTargets示例的步骤。
  安装SDK和示例

⦁在开发环境中的适当位置打包Vuforia UWP 
SDK⦁转到SDK根文件夹中的samples目录
⦁将ImageTarget示例打包到此文件夹中
⦁双击ImageTarget示例文件夹中* .sln文件以加载样本Visual Studio 2015中的项目


注意:此图像显示VuMark示例中的VuMark.sln,ImageTarget.sln是由ImageTarget Sample提供的。
运行样品

⦁从developer.vuforia.com获取许可证密钥,并将其添加到您的项目中,请参阅:Vuforia License Manager
⦁将此键添加到AppSession.cpp中的InitAR()方法中
用户添加的图像
⦁您现在可以构建并运行示例。 


注意:如果Visual Studio不能识别示例项目的包含路径,则需要通过右键单击项目检查器中的项目名称,通过ImageTarget项目的“属性”对话框添加它。将Vuforia文件夹添加到包含路径。 
 
确保设置x86的构建目标,请注意不支持64位版本。

要打包所有UWP设备的应用程序,请参阅:https://msdn.microsoft.com/en-us/library/hh454036.aspx

修改样品

获得可追踪国家

State对象包含对所有当前TrackableResults的引用。您可以从Vuforia Renderer实例获取,如ImageTargetRenderer.cpp中的Render()方法所示。

在ImageTargetRenderer.cpp中:
 

1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">//使用顶点和像素着色器渲染一帧。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
voidImageTargetsRenderer :: Render()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    // Vuforia初始化和数据加载是异步的。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //仅在Vuforia初始化/加载完成后开始呈现。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    if(!m_rendererInitialized ||!m_vuforiaStarted)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        返回;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //从Vuforia获取状态并标记渲染部分的开头</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Vuforia :: DXRenderData dxRenderData(m_deviceResources-> GetD3DDevice());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Vuforia :: Renderer&vuforiaRenderer = Vuforia :: Renderer :: getInstance();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Vuforia :: State state = vuforiaRenderer.begin(&dxRenderData);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    // TODO:根据相机方向设置剔除</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    RenderScene(vuforiaRenderer,state);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    Vuforia ::渲染::的getInstance()结束();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>

查询跟踪结果

一旦拥有状态对象,您可以查询每个TrackableResult的状态来访问其姿态,确定其类型,并获取对其关联的可跟踪实例的引用。

在ImageTargetRenderer.cpp中:
 

1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
三十
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">voidImageTargetsRenderer :: RenderScene(Vuforia :: Renderer&renderer,Vuforia :: State&state)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    并发:: critical_section :: scoped_lock lock(m_renderingPrimitivesLock);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    auto context = m_deviceResources-> GetD3DDeviceContext();</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    XMMATRIX xmProjection = XMLoadFloat4x4(&m_projection);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //设置视频背景渲染的状态</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> RSSetState(m_videoRasterState.Get());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    context-> OMSetDepthStencilState(m_videoDepthStencilState.Get(),1);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    context-> OMSetBlendState(m_videoBlendState.Get(),NULL,0xffffffff);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //绘制视频背景:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    renderer.drawVideoBackground();</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //设置增强渲染的状态</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
if(Vuforia :: Renderer :: getInstance()。getVideoBackgroundConfig()。mReflection == Vuforia :: VIDEO_BACKGROUND_REFLECTION_ON)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        上下文> RSSetState(m_augmentationRasterState.Get()); </font><font style="vertical-align: inherit;">//前置摄像头</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    其他</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        上下文> RSSetState(m_augmentationRasterState.Get()); </font><font style="vertical-align: inherit;">//返回相机</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    context-> OMSetDepthStencilState(m_augmentationDepthStencilState.Get(),1);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    context-> OMSetBlendState(m_augmentationBlendState.Get(),NULL,0xffffffff);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    forinttIdx = 0; tIdx <state.getNumTrackableResults(); tIdx ++)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        //获取跟踪:</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        constVuforia :: TrackableResult * result = state.getTrackableResult(tIdx);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        constVuforia :: Trackable&trackable = result-> getTrackable();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        constchar * trackableName = trackable.getName();</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        //设置modelview矩阵</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        auto poseGL = Vuforia :: Tool :: convertPose2GLMatrix(result-> getPose());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        XMFLOAT4X4 poseDX;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        memcpy(poseDX.m,poseGL.data,sizeoffloat)* 16);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        XMStoreFloat4x4(&poseDX,XMMatrixTranspose(XMLoadFloat4x4(&poseDX)));</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        XMMATRIX xmPose = XMLoadFloat4x4(&poseDX);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        std :: shared_ptr <SampleCommon :: Texture> texture = GetAugmentationTexture(trackable.getName());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        if(!texture-> IsInitialized()){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            提升口感>初始化();</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        if(m_extTracking){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            RenderTower(xmPose,xmProjection,texture);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        else{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            RenderTeapot(xmPose,xmProjection,texture);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>

呈现内容

从该结果获得的姿态可用于将内容呈现到相机视图中的ImageTarget上。

在ImageTargetRenderer.cpp中:
 

1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
三十
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">voidImageTargetsRenderer :: RenderTeapot(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    constXMMATRIX&poseMatrix,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    constXMMATRIX&projectionMatrix,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    conststd :: shared_ptr <SampleCommon :: Texture>纹理</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    )</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    auto context = m_deviceResources-> GetD3DDeviceContext();</font></font><font></font>
 <font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    自动缩放= XMMatrixScaling(TEAPOT_SCALE,TEAPOT_SCALE,TEAPOT_SCALE);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    auto modelMatrix = XMMatrixIdentity()* scale;</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //设置模型矩阵('model'部分的'model-view'矩阵)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    XMStoreFloat4x4(&m_constantBufferData.model,modelMatrix);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //设置姿势矩阵('视图''模型视图'矩阵的一部分)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    XMStoreFloat4x4(&m_constantBufferData.view,poseMatrix);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //设置投影矩阵</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    XMStoreFloat4x4(&m_constantBufferData.projection,projectionMatrix);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //准备常量缓冲区以将其发送到图形设备。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> UpdateSubresource1(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        m_constantBuffer.Get()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        空值,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        &m_constantBufferData,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        );</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //每个顶点是TexturedVertex结构体的一个实例。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    UINTstride = sizeof(SampleCommon :: TexturedVertex);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    UINToffset = 0;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> IASetVertexBuffers(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        1,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        m_teapotMesh-> GetVertexBuffer(),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        和步幅,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        &抵消</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        );</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> IASetIndexBuffer(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        m_teapotMesh-> GetIndexBuffer(),</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        DXGI_FORMAT_R16_UINT,//每个索引是一个16位无符号整数(short)。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        );</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> IASetInputLayout(m_inputLayout.Get());</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //附加我们的顶点着色器。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    context-> VSSetShader(m_vertexShader.Get(),nullptr,0);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //将常量缓冲区发送到图形设备。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文> VSSetConstantBuffers1(</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        0,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        1,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        m_constantBuffer.GetAddressOf()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        nullptr,</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        nullptr</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        );</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //附加我们的像素着色器。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文 - > PSSetShader(m_pixelShader.Get(),nullptr,0);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文 - > PSSetSamplers(0,1,texture-> GetSamplerState());</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    上下文 - > PSSetShaderResources(0,1,texture-> GetTextureView());</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //绘制对象。</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    context-> DrawIndexed(m_teapotMesh-> GetIndexCount(),0,0);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>
原创粉丝点击