精华内容
下载资源
问答
  • ARCore

    2020-01-05 18:49:52
    ARCore官网地址:SDK地址: 官网地址: https://developers.google.cn/ar/ https://developers.google.com/ar/ SDK地址: https://github.com/google-ar/arcore-unity-sdk/releases 当前版本:1.14.0 主要功能 运动...

    官网地址:

    https://developers.google.cn/ar/

    https://developers.google.com/ar/

    SDK地址:

    https://github.com/google-ar/arcore-unity-sdk/releases

    当前版本:1.14.0

    主要功能
    运动跟踪:让手机可以理解和跟踪它相对于现实世界的位置。

    环境理解:让手机可以检测各类表面(例如地面、咖啡桌或墙壁等水平、垂直和倾斜表面)的大小和位置。

    光估测:让手机可以估测环境当前的光照条件。

    增强图像:摄像头视野中检测到图像时,ARCore 会告诉您这些图像在 AR 会话中的物理位置。

    面部识别:摄像头视野中检测到人脸时,ARCore 会告诉您人脸在 AR 会话中的物理位置及相关信息。

    使用要求
    ARCore对使用设备有一定要求,在中国支持的设备主要是华为小米和三星的部分手机,具体请查看官网列表

    https://developers.google.cn/ar/discover/supported-devices

    基本结构

    ARCore最基本的是“ARCore Device”游戏对象,官方提供了预制件。ARCore的基本设置是在一个默认名为“ARCoreSessionConfig”的配置文件中,如果需要进行图片识别的时候,还需要在配置文件中添加识别图片的数据文件。

    官方提供了一个光照评估的预制件,叫“Environmental Light”,可以根据光照情况对场景中模型的明暗做出调节。

    此外,在官方示例中,显示识别点点云的预制件“PointCloud”和检测平面并显示的脚本“Detected Plane Generator”在多数情况下可以直接拿来使用。

    ARCore应用
    ARCore的应用运行时会检查设备是否安装了“AR Core”这个应用,如果没安装会自动提示安装。“AR Core”这个应用在Google、小米、华为和三星手机预置的应用商店中能找到并安装。

    ARCore Instant Preview
    官方提供了一个开发辅助工具,在Unity的编辑界面运行的时候会提示安装。可以不用将开发的应用发布到手机就能看到运行后的效果。不过,有部分功能不支持这样的方式预览。

    具体代码请参照官方的Demo,感觉使用起来不是很方便。

    展开全文
  • ARcore

    2018-06-15 14:17:29
    在Google为ARCore提供的Demo中,主要进行了相机预览、检测点云、检测平面和Android小机器人的绘制。本节我们将跟大家介绍相机预览背景的绘制过程和原理。 一、OpenGL ES渲染管线 OpenGL ES渲染管线其实就是渲染...

    https://blog.csdn.net/p106786860/rss/list

    1024工场新技术,新未来,尽在1024工场…
    [原]Android自动化测试:Appium简介
    一、什么是Appium
    一个自动化测试开源工具;
    支持Android和IOS平台原生应用、移动Web应用和混合应用;
    一个跨平台的工具,允许测试人员使用同样的接口基于不同的平台(Andorid,IOS)写自动化测试脚本;
    二、Appinum的理念
    无需为了自动化,而重新编译或者修改我们的应用(黑盒测试);
    不必局限于某种语言或者框架来写和运行测试脚本;
    不应该在接口上重复造轮子(移动自动化接口统一);
    开源;
    三、Appium的设计
    真正的工作引擎其实是第三方自动化框架,不需要再引用中植入Appium和第三方代码;
    这些第三方框架封装成一套API-WebDriver API,指定了客户端到服务端的协议,可以使用任何语言来编写客户端,向服务端发送恰当的HTTP请求;
    扩充了WebDriver的协议,在原有的基础上添加移动自动化相关的API方法;
    四、Appinum概念
    C/S架构:核心是一个Web服务器,提供一套REST接口,收到客户端的连接、监听的命令、在移动设备上执行这些命令,将执行结果在HTTP响应中返回客户端;
    Session:自动化总是在一个Session上下文中运行,客户端初始化一个和服务端交互的Session,服务端开始一个自动化Session,返回一个Session ID,客户端用这个ID发送后续的命令;
    Desired Capabilities:一些键值对集合,客户端将这些键值对发送给服务端,告诉服务端要启动怎么样的自动化Session,如启动Android或IOS Session;
    Appium Server:用nodejs写的,可以用源码编译或者从NPM直接安装;
    Appium服务端:有很多语言库Java、Ruby、Python、PHP、JavaScript和C#等,实现了Appinum对WebDriver协议的扩展;
    Appium.app,Appinum.exe:提供了GUI封装的Appium Server下载,封装了运行Appium Sever所有依赖元素,包含了一个Inspector工具,检查应用元素的层级;
    1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
    1024工场服务号

    作者:p106786860 发表于 2018/03/31 10:38:30 原文链接 https://blog.csdn.net/p106786860/article/details/79766649
    阅读:161
    [原]ARCore:相机预览背景绘制
    在完成了OpenGL ES和ARCore基本的实现后,下一步肯定就是图像绘制了。在Google为ARCore提供的Demo中,主要进行了相机预览、检测点云、检测平面和Android小机器人的绘制。本节我们将跟大家介绍相机预览背景的绘制过程和原理。

    一、OpenGL ES渲染管线
    OpenGL ES渲染管线其实就是渲染流水线,实质上指的是一系列的绘制过程。这些过程输入的是待渲染3D物理的相关描述信息数据,经过渲染管线,输出一帧想要的图像。

    OpenGL ES渲染管线,如下图所示:
    这里写图片描述

    1.基本处理
    在该阶段设定3D空间中物体的顶点坐标、顶点对应的颜色、顶点纹理坐标等属性,并指定绘制方式,如点绘制、线段绘制或者三角形绘制等。

    OpenGL ES支持2D和3D图形的绘制。当你希望在2D界面绘制一条任意的曲线的时候,把这边曲线放的足够大来看,会发现这条曲线其实是由许多足够短的直线连接起来的。那么绘制3D图形,即使你看见的是一个“圆滑曲面”的3D图形,实际上足够放大它依然是由多个小平面组成的。所以对于2D图形,可能是由很多“曲线”组成;而3D图形可能是由很多“曲面”组成。
    这里写图片描述

    2.顶点缓冲对象
    该阶段在应用程序中是可选的。在整个场景中顶点的基本数据不变的情况。可以在初始化阶段将顶点数据经过基本处理后送入顶点缓冲对象,在绘制每一帧想要的图像就省去了顶点IO的麻烦,直接从顶点缓冲对象中获取顶点数据即可。

    3.顶点着色器
    顶点着色器是一个可编程处理单元,为执行顶点变换、光照、材质的应用与计算等顶点相关的操作,每个顶点执行一次。工作过程首先将原始的几何信息及其他属性传送到顶点着色器中,经过自己开发的顶点着色器处理后产生纹理坐标、颜色、点位置等后流程需要的各项顶点属性信息,然后将其传递给图元装配阶段。

    顶点着色器输入主要为待处理顶点相应的attribute(属性)变量、uniform(一致)变量、采样器以及临时变量;输出主要为经过顶点着色器后生成的varying(易变)变量以及一些内建输出变量。
    这里写图片描述

    4.图元装配
    该阶段主要任务是图元组装和图元处理。

    图元组装是指顶点数据根据设置的绘制方式被结合成完整的图元。如点绘制每个顶点为一个图元;线段绘制方式每个图元则为两个顶点;三角形绘制方式下需要3个顶点构造成一个图元。

    图元处理最重要的工作是剪裁,其任务是消除位于半空间之外的部分几何图元。之所以进行剪裁,是因为随着观察位置、角度不同,并不能总看到特定3D物体某个图元的全部。剪裁时,若图元完全位置视景体以及自定义裁剪平面的内部,则将图元传递到后面步骤进行处理;如果其完全位于视景体或者自定义剪裁平面的外部,则丢弃该图元。
    这里写图片描述

    5.光栅化
    虚拟3D世界中的物体的几何信息一般采用连续的数学向量来表示,因此投影的平面结果也是用连续的数学向量表示的。但目前的显示设备都是离散化的(由一个一个的像素组成),因此还需要将投影的结果离散化。将其分解为一个一个离散化的小单元。
    这里写图片描述

    6.片元着色器
    片元着色器是用于处理片元值以及相关数据的可编程单元,其可以执行纹理的采样、颜色的汇总、计算雾颜色等操作,每片元执行一次。片元着色器通过重复执行,将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来后送入后续阶段,如剪裁测试、深度测试及模板测试等。

    片元着色器输入是从顶点着色器传递到片元着色器的易变变量(Varying0~n),输出为内建变量(gl_FragColor)是片元的最终颜色。
    这里写图片描述

    7.剪裁测试
    OpenGL ES会检查每个片元在帧缓冲中对应的位置,若对应位置在剪裁窗口中则将此片元送入下一阶段,否则丢弃此片元。

    8.深度测试和模板测试
    深度测试指将输入片元的深度值与缓冲区中存储的对应位置的深度值进行比较,若输入片元的深度值小于则将输入片元送入下一个阶段准备覆盖帧缓冲中的原片元或帧缓冲中的原片元缓冲,否则丢弃输入片元。

    模板测试的主要功能是为将绘制区域限定在一定范围内,一般应用在湖面倒影、镜像等场合。

    9.颜色缓冲混合
    若程序开启的Alpha混合,则根据混合因子将上一阶段送来的片元帧缓冲对应的位置的片元进行Alpha混合,否则送入的片元将覆盖帧缓冲中对应位置的片元。

    10.抖动
    抖动是一种简单的操作,允许只使用少量的颜色模拟出更宽的颜色显示范围,从而使颜色视觉更丰富。

    11.帧缓冲
    OpenGL ES中的物体绘制并不是直接绘制在屏幕上进行的,而是预先在帧缓冲区中进行绘制,每绘制完一帧再将绘制的结果交换到屏幕上。因此,在每次绘制更新一帧都需要清除缓冲区中的相关数据。

    二、纹理映射
    除了基本基本图形的绘制,如果想要绘制更加真实、炫酷的3D物体,就需要用到纹理映射。它就是把一幅纹理应用到相应的几何图元,告知渲染系统如何进行纹理映射。告知的方式就是为图元中的每个顶点指定恰当纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中的纹理区域中的内容根据纹理坐标映射到指定的图元上。
    这里写图片描述

    三 、相机预览背景绘制步骤
    1.绘制背景准备
    在该过程,完成了顶点和纹理坐标数据的提供,纹理id的生成获取、绑定和设置,创建顶点坐标和纹理坐标顶点缓冲对象,加载并绑定背景顶点和片元着色器,获取顶点和纹理坐标位置属性等。

    2.背景纹理和Session摄像头纹理绑定
    在该过程中,将背景纹理id和Session摄像头纹理id进行绑定。

    3.执行背景绘制
    该阶段处理显示旋转纹理坐标的变换,设置深度测试,告知OpenGL应用的纹理id和使用的程序,将顶点和纹理坐标传送渲染管线,启动顶点和纹理id数据,执行背景绘制和禁用顶点数据等。

    四、案例源码分析
    1.绘制背景准备
    com\google\ar\core\examples\java\helloar\rendering\BackgroundRender.java

    public class BackgroundRenderer {
    private static final String TAG = BackgroundRenderer.class.getSimpleName();
    private static final int COORDS_PER_VERTEX = 3;
    private static final int TEXCOORDS_PER_VERTEX = 2;
    private static final int FLOAT_SIZE = 4;

    //顶点坐标数据
    public static final float[] QUAD_COORDS = new float[]{
            -1.0f, -1.0f, 0.0f,     //左下顶点
            -1.0f, +1.0f, 0.0f,    //左上顶点
            +1.0f, -1.0f, 0.0f,    //右下顶点
            +1.0f, +1.0f, 0.0f,   //右上顶点
    };
    
    //纹理坐标数据
    public static final float[] QUAD_TEXCOORDS = new float[]{
            0.0f, 1.0f,
            0.0f, 0.0f,
            1.0f, 1.0f,
            1.0f, 0.0f,
    };
    
    //顶点坐标,纹理坐标和顶点变换数据内存
    private FloatBuffer mQuadVertices;
    private FloatBuffer mQuadTexCoord;
    private FloatBuffer mQuadTexCoordTransformed;
    
    //背景着色器程序
    private int mQuadProgram;
    //背景绘制顶点和纹理属性
    private int mQuadPositionParam;
    private int mQuadTexCoordParam;
    
    //背景纹理渲染id
    private int mTextureId = -1;
    private int mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
    
    public BackgroundRenderer() {
    }
    
    ... ... 
    
    /**
    * 分配和初始化背景渲染器的需要的OpenGL资源。必须在OpenGL线程中调用,通常在GLSurfaceView.Render
    * (GL10,EGLConfig)
    */
    public void createOnGlThread(Context context) {
        //生成背景纹理
        int textures[] = new int[1];
        GLES20.glGenTextures(1, textures, 0);
        //获取加载图像后OpenGL纹理id
        mTextureId = textures[0];
    
        //告诉OpenGL后面的纹理调用应该应用mTextureId这个纹理对象
        GLES20.glBindTexture(mTextureTarget, mTextureId);
    
        //当纹理大小被扩大或者缩小的时候,我们就会使用到纹理过滤
        //为mTextureTarget纹理设置属性,纹理放大和缩小的滤波方式,横向和纵向平铺方式
        GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
        GLES20.glTexParameteri(mTextureTarget, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    
        int numVertices = 4;
        if (numVertices != QUAD_COORDS.length / COORDS_PER_VERTEX) {
          throw new RuntimeException("Unexpected number of vertices in BackgroundRenderer.");
        }
    
        //OpenGL作为本地系统直接运行在硬件上,没有虚拟机。所以需要把Java虚拟机中的内存复制到本地堆中
        //分配一块本地内存bbVertices,告诉缓冲区按照本地字节组织它的内容
        ByteBuffer bbVertices = ByteBuffer.allocateDirect(QUAD_COORDS.length * FLOAT_SIZE);
        bbVertices.order(ByteOrder.nativeOrder());
        //获取一个可以反映底层字节的FloatBuffer类实例,把顶点QUAD_COORDS数据放到本地内存中
        mQuadVertices = bbVertices.asFloatBuffer();
        mQuadVertices.put(QUAD_COORDS);
        mQuadVertices.position(0);
    
        //同上
        ByteBuffer bbTexCoords = ByteBuffer.allocateDirect(numVertices * TEXCOORDS_PER_VERTEX * FLOAT_SIZE);
        bbTexCoords.order(ByteOrder.nativeOrder());
        mQuadTexCoord = bbTexCoords.asFloatBuffer();
        mQuadTexCoord.put(QUAD_TEXCOORDS);
        mQuadTexCoord.position(0);
    
        //同上
        ByteBuffer bbTexCoordsTransformed = ByteBuffer.allocateDirect(numVertices * TEXCOORDS_PER_VERTEX * FLOAT_SIZE);
        bbTexCoordsTransformed.order(ByteOrder.nativeOrder());
        mQuadTexCoordTransformed = bbTexCoordsTransformed.asFloatBuffer();
    
        //加载背景顶点和片元着色器
        int vertexShader = ShaderUtil.loadGLShader(TAG, context,GLES20.GL_VERTEX_SHADER, R.raw.screenquad_vertex);
        int fragmentShader = ShaderUtil.loadGLShader(TAG, context,GLES20.GL_FRAGMENT_SHADER, R.raw.screenquad_fragment_oes);
    
        //把顶点和Fragment着色器绑定放在一个单个的程序中一起工作:
        //新建程序对象mQuadProgram,并把vertexShader和fragmentShader附加到程序中
        mQuadProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(mQuadProgram, vertexShader);
        GLES20.glAttachShader(mQuadProgram, fragmentShader);
        //把这些着色器联合起来,并且告诉OpenGL在绘制背景的时候使用这个定义的程序
        GLES20.glLinkProgram(mQuadProgram);
        GLES20.glUseProgram(mQuadProgram);
    
        //获取顶点位置纹理坐标属性
        ShaderUtil.checkGLError(TAG, "Program creation");
        mQuadPositionParam = GLES20.glGetAttribLocation(mQuadProgram, "a_Position");
        mQuadTexCoordParam = GLES20.glGetAttribLocation(mQuadProgram, "a_TexCoord");
        ShaderUtil.checkGLError(TAG, "Program parameters");
    }
    
    ... ... 
    

    }
    com\google\ar\core\examples\java\helloar\rendering\ShaderUtil.java

    public class ShaderUtil {
    /**
    * 将原始文本文件(保存为资源)转换为OpenGL ES着色程序。
    */
    public static int loadGLShader(String tag, Context context, int type, int resId) {
    //通过着色器代码原始资源文件id,读取代码为字符串
    String code = readRawTextFile(context, resId);

        //创建一个类型的着色器对象
        int shader = GLES20.glCreateShader(type);
        //把着色器源代码上传上着色器对象里,它与shader引用的着色器对象关联起来
        GLES20.glShaderSource(shader, code);
        //编译着色器
        GLES20.glCompileShader(shader);
    
        //取出编译状态,检查OpenGL是否能成功地编译这个着色器,如果编译失败则删除着色器
        final int[] compileStatus = new int[1];
        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
        if (compileStatus[0] == 0) {
            Log.e(tag, "Error compiling shader: " + GLES20.glGetShaderInfoLog(shader));
            GLES20.glDeleteShader(shader);
            shader = 0;
        }
    
        //编译成功,返回着色器引用id
        if (shader == 0) {
            throw new RuntimeException("Error creating shader.");
        }
        return shader;
    }
    
    /**
    * 将原始文本文件转换为字符串:从原始资源中通过流读取字符串
    */
    private static String readRawTextFile(Context context, int resId) {
        InputStream inputStream = context.getResources().openRawResource(resId);
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            reader.close();
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    

    }
    java_arcore_hello_ar\app\src\main\res\raw\screenquad_vertex.shader

    attribute vec4 a_Position; //3D物理每个顶点各自不同的顶点位置信息
    attribute vec2 a_TexCoord; //3D物理每个顶点各自不同的纹理坐标信息
    varying vec2 v_TexCoord; //从顶点着色器计算产生并传递到片元着色器的纹理坐标信息

    void main() {
    gl_Position = a_Position; //顶点着色器从渲染管线中获得原始顶点信息a_Position,写入gl_Position内建变量传递到渲染管线的后阶段继续处理
    v_TexCoord = a_TexCoord; //顶点着色器从渲染管线中获得纹理坐标信息a_TexCoord,传递给片元着色器继续处理
    }
    java_arcore_hello_ar\app\src\main\res\raw\screenquad_fragment_oes.shader

    precision mediump float; //给出默认的浮点精度
    varying vec2 v_TexCoord; //从顶点着色器传来的纹理坐标
    uniform samplerExternalOES sTexture; //纹理内容数据

    void main() {
    gl_FragColor = texture2D(sTexture, v_TexCoord); //根据纹理坐标采样出颜色值
    }
    2.背景纹理和Session摄像头纹理绑定
    com\google\ar\core\examples\java\helloar\HelloArActivity.java

    public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //OpenGL环境被设置的时候,调用一次
    //设置背景帧的颜色
    GLES20.glClearColor(0.1f, 0.1f, 0.1f, 1.0f);

        //准备背景渲染对象
        mBackgroundRenderer.createOnGlThread(this);
        //创建纹理,并且将它传递给ARCore Session,在update()的时候填充,允许GPU访问相机图像
        mSession.setCameraTextureName(mBackgroundRenderer.getTextureId());
    }
    

    }
    com\google\ar\core\examples\java\helloar\rendering\BackgroundRender.java

    public class BackgroundRenderer {
    … …

    //背景纹理id
    private int mTextureId = -1;
    private int mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
    ... ... 
    
    //获取背景纹理id
    public int getTextureId() {
        return mTextureId;
    }
    ... ... 
    

    }
    3.执行背景绘制
    com\google\ar\core\examples\java\helloar\rendering\BackgroundRender.java

    public class BackgroundRenderer {
    private static final String TAG = BackgroundRenderer.class.getSimpleName();
    private static final int COORDS_PER_VERTEX = 3;
    private static final int TEXCOORDS_PER_VERTEX = 2;
    private static final int FLOAT_SIZE = 4;

    private FloatBuffer mQuadVertices;
    private FloatBuffer mQuadTexCoord;
    private FloatBuffer mQuadTexCoordTransformed;
    
    private int mQuadProgram;
    private int mQuadPositionParam;
    private int mQuadTexCoordParam;
    
    private int mTextureId = -1;
    private int mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
    
     /**
     * 绘制AR背景图片。这个图片将会使用Frame.getViewMatrix(float[], int)和Session.getProjectionMatrix(
     * float[], int, float, float)提供的矩阵绘制,将准确的跟踪静态物理对象,它必须在绘制虚拟对象之前调用
     * @param frame 通过Session.update()返回的最新Frame
     */
    public void draw(Frame frame) {
        //如果显示旋转(也包括尺寸的改变),我们需要重新查询屏幕rect的uv坐标,因为它们可能发生了变化
        if (frame.isDisplayRotationChanged()) {
            frame.transformDisplayUvCoords(mQuadTexCoord, mQuadTexCoordTransformed);
        }
    
        //不需要测试或者写入深度,屏幕顶点具有任意深度,预计将首先绘制
        GLES20.glDisable(GLES20.GL_DEPTH_TEST);
        GLES20.glDepthMask(false);
    
        //告诉OpenGL纹理调用应该应用mTextureId这个纹理对象
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureId);
        //告诉OpenGL在绘制背景的时候使用这个定义的程序
        GLES20.glUseProgram(mQuadProgram);
    
        //将顶点位置数据传送进渲染管线
        GLES20.glVertexAttribPointer(mQuadPositionParam, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, mQuadVertices);
        //将顶点纹理坐标数据传送进渲染管线
        GLES20.glVertexAttribPointer(mQuadTexCoordParam, TEXCOORDS_PER_VERTEX,GLES20.GL_FLOAT, false, 0, mQuadTexCoordTransformed);
    
        //启动顶点位置和着色数据
        GLES20.glEnableVertexAttribArray(mQuadPositionParam);
        GLES20.glEnableVertexAttribArray(mQuadTexCoordParam);
    
        //执行背景绘制
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
    
        //禁用顶点数组
        GLES20.glDisableVertexAttribArray(mQuadPositionParam);
        GLES20.glDisableVertexAttribArray(mQuadTexCoordParam);
    
        //恢复深度状态以作进一步绘图。
        GLES20.glDepthMask(true);
        GLES20.glEnable(GLES20.GL_DEPTH_TEST);
        ShaderUtil.checkGLError(TAG, "Draw");
    }
    

    }
    1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
    1024工场服务号

    2.完整和持续更新的《使用Android打开AR的开发大门—ARCore》文档,欢迎大家阅读!
    https://www.kancloud.cn/p3243986735/arcore_develop/457951
    这里写图片描述

    作者:p106786860 发表于 2018/01/01 23:40:39 原文链接 https://blog.csdn.net/p106786860/article/details/78948227
    阅读:403 评论:1 查看评论
    [原]ARCore:OpenGL ES环境搭建
    估计大部分Anroid开发的同学,对OpenGL ES的了解可能也仅仅停留在三维图形的渲染,入门模板代码的编写阶段。在ARCore开发中,如果你选择使用Android+OpenGL ES的开发技术栈,就需要大家深入的学习和了解OpenGL ES技术了。那么接下来我们就分如下主题和大家来唠唠:

    一、OpenGL ES概述
    1. Open GL是做什么的?

    高效、简洁的开放图形库接口,跨编程语言、跨平台的编程接口规范,主要用于三维图形编程;
    遵照接口,不同平台上有不同的实现,思想完全一致,方法名称和使用也基本一致;
    2. OpenGL ES和OpenGL是什么关系?

    OpenGL ES(OpenGL for Embedded System)是Open GL三维图形API的子集,针对手机、PAD和游戏主机等嵌入式设备;
    相对于Open GL来说更轻量级,减少了许多不必要的数据类型,去掉了不必须的功能,对代价大的功能做了限制;
    OpenGL ES中没有四边形、多边形、无论多复杂的图形都是由点、线和三角形组成的,也去除了glBegin/glEnd等方法;
    3. OpenGL ES在ARCore中的作用?
    OpenGL ES在ARCore中,结合ARCore对环境的理解,返回的位置和光线等信息,完成2d或者3d图像的渲染。

    二、OpenGL ES环境搭建
    进行ARCore开发的第一步就是建立一个OpenGL ES环境,主要由如下几个步骤:
    1. 创建GLSurfaveView或者其子类,调用setContentView()设置为Activity显示视图。
    2. 获取GLSurfaveView或其子类的实例,在Activity中的onResume()和onPause()方法中处理相应的生命周期方法。
    3. 设置GLSurfaveView的配置,如渲染器,渲染模式,EGLContext是否保存和GLContextClient版本等;
    4. 实现GLSurfaveView.Render接口,重写onSurfaceCreate(),onDrawFrame()和onSurfaceChanged()方法;

    三、案例源码解析
    相信大家对OpenGL ES应该有了初步的了解。那么接下来我们将会依照ARCore官方提供的Demo的源代码,给大家逐步讲解ARCore是如何开发的。

    1. 创建GLSurfaceView实例
      java_arcore_hello_ar\app\src\main\res\layout\activity_main.xml

    展开全文
  • ARCore:ARCore课程-源码

    2021-05-11 13:46:29
    核心 ARCore课程欢迎来到ARCore课程库-通过增强型初创公司(以前是Arduino Startups) 在此处查看完整的课程: : 关于Udemy的增强现实课程: ://bit.ly/UdemyARCourses 最近针对ARCore 1.2更新
  • This book is for web and mobile developers who have broad programming knowledge on Java or JavaScript or C# and want to develop Augmented Reality applications with Google ArCore. To follow this book ...
  • Google Arcore

    2021-03-30 01:02:02
    ARCore概述: Google 的 ARCore 不是一个你可以下载的 app。它是一个软件开发工具包(SDK),来帮助开发者们创建 AR 应用。 ARCore是Google的构建增强现实体验的平台。通过使用不同的API,ARCore使您的手机能够...

    ARCore概述

    Google 的 ARCore 不是一个你可以下载的 app。它是一个软件开发工具包(SDK),来帮助开发者们创建 AR 应用。

    ARCore是Google的构建增强现实体验的平台。通过使用不同的API,ARCore使您的手机能够感知其环境,了解世界并与信息进行交互。某些API可在Android和iOS上使用,以实现共享的AR体验。

    ARCore使用三项关键功能来将虚拟内容与现实世界集成在一起,如通过手机的摄像头所看到的:

    • 运动跟踪使手机能够了解和跟踪其相对于世界的位置。
    • 通过了解环境,手机可以检测所有类型的表面的大小和位置:水平,垂直和倾斜的表面,例如地面,咖啡桌或墙壁。
    • 光线估计功能可以让手机估计环境当前的照明条件。

    支持的设备

    ARCore设计为可在运行Android 7.0(牛轧糖)及更高版本的各种合格Android手机上使用。

    ARCore如何工作?

    从根本上说,ARCore正在做两件事:跟踪移动设备在移动过程中的位置,以及建立自己对现实世界的理解。

    ARCore的运动跟踪技术使用手机的摄像头识别有趣的点(称为特征),并跟踪这些点随时间的移动方式。结合这些点的移动和手机惯性传感器的读数,ARCore可以确定手机在空间中移动时的位置和方向。

    除了识别关键点外,ARCore还可以检测平面,例如桌子或地板,还可以估计其周围区域的平均照明度。这些功能相结合,使ARCore可以建立自己对周围世界的了解。

    ARCore对现实世界的理解使您能够以与现实世界无缝集成的方式放置对象,注释或其他信息。您可以在茶几的角上放个午睡的小猫,或用有关画家的传记信息为画作注释。运动跟踪意味着您可以从任何角度四处走动并查看这些对象,即使您转过身离开房间,当您回来时,小猫或注解也将恰好位于您离开的地方

    在深入研究ARCore之前,了解一些基本概念会很有帮助。这些概念共同说明了ARCore如何实现可以使虚拟内容看上去停留在真实表面上或附着在真实世界位置上的体验。

    1、运动追踪

    当您的手机在世界各地移动时,ARCore使用称为同步本地化和映射(SLAM)的过程来了解手机相对于其周围世界的位置。 ARCore在捕获的相机图像中检测视觉上明显不同的特征,称为特征点,并使用这些点计算其位置变化。视觉信息与来自设备IMU的惯性测量值结合在一起,以估计摄像机相对于世界的姿势(位置和方向)。

    通过将渲染3D内容的虚拟摄像机的姿势与ARCore提供的设备摄像机的姿势对齐,开发人员可以从正确的角度渲染虚拟内容。渲染的虚拟图像可以叠加在从设备的摄像头获得的图像之上,使其看起来好像虚拟内容是真实世界的一部分。

    2、对环境的了解 

    ARCore可以使用支持的设备上的主RGB摄像头创建深度图,这些深度图包含有关到给定点的曲面之间的距离的数据。您可以使用深度图提供的信息来实现身临其境的逼真的用户体验,例如使虚拟对象与观察到的表面准确碰撞,或者使它们出现在现实对象的前面或后面。

    3、光线估算

    ARCore可以检测有关其环境照明的信息,并为您提供给定摄像机图像的平均强度和颜色校正。这些信息使您可以在与周围环境相同的条件下点亮虚拟对象,从而增加了真实感。

    4、用户互动

    ARCore使用命中测试来获取与手机屏幕相对应的(x,y)坐标(通过轻击或您希望应用程序支持的任何其他交互方式提供),并将光线投射到相机的世界视野中,返回任何平面或射线相交的特征点,以及该交点在世界空间中的姿势。这允许用户选择环境中的对象或与之交互。

    5、定向点

    定向点使您可以将虚拟对象放置在倾斜的表面上。执行击中测试以返回特征点时,ARCore会查看附近的特征点,并使用这些特征来尝试估计给定特征点处的曲面角度。然后,ARCore将返回考虑该角度的姿势。

    由于ARCore使用特征点簇来检测表面的角度,因此可能无法正确检测到没有纹理的表面(例如白墙)。

    6、锚和可追踪物

    随着ARCore增强对自身位置和环境的了解,姿势可能会发生变化。当您要放置虚拟对象时,需要定义锚点以确保ARCore随时间推移跟踪对象的位置。通常,您会根据点击测试返回的姿势来创建锚点。

    姿势可以改变的事实意味着ARCore可以随着时间的推移更新环境对象(如平面和特征点)的位置。平面和点是一种特殊的对象,称为可追踪对象。顾名思义,这些是ARCore随时间推移将跟踪的对象。您可以将虚拟对象锚定到特定的可跟踪对象,以确保虚拟对象与可跟踪对象之间的关系即使在设备四处移动时也保持稳定。这意味着,如果您将虚拟的Android雕像放到桌子上,如果ARCore稍后调整了与桌子相关联的平面的姿势,则Android雕像将仍然停留在桌子上方。

    7、增强图像

    增强图像是一项功能,可让您构建可响应特定2D图像(例如产品包装或电影海报)的AR应用。当用户将手机的相机指向特定图像时,他们可以触发AR体验-例如,他们可以将手机的相机指向电影海报并弹出角色并制作场景。

    ARCore还可以跟踪运动图像,例如运动公共汽车侧面的广告牌。

    可以离线编译图像以创建图像数据库,也可以从设备实时添加单个图像。注册后,ARCore将检测这些图像,图像的边界,并返回相应的姿势。

    8、分享分享

    借助ARCore Cloud Anchor API,您可以为Android和iOS设备创建协作或多人游戏应用。

    借助Cloud Anchors,一台设备会将锚和附近的特征点发送到云中进行托管。这些锚可以与同一环境中的Android或iOS设备上的其他用户共享。这使应用程序可以渲染附加到这些锚点的相同3D对象,从而使用户同时具有相同的AR体验。

    应用场景介绍:

    美图 - 用 AR 拍出梦幻自我

    美图公司利用 ARCore 的增强脸部 API(Augmented Faces API)构建了 100 多个自拍滤镜,让用户可以在拍摄照片和视频时体验 AR 特效。增强脸部 API 提供高精度的由 468 个点组成的密集 3D 脸部网格,追踪嘴部动作、眨眼、点头和一些复杂的细节。

    此外,新推出的瞬间放置 API (Instant Placement API) 对美图更是如虎添翼。加上几行代码,通过将 AR 对象锚定到 2D 图像中,让用戶不需要扫描,就可以放置虚拟物件并进行互动。

    有道少儿词典 - 用 AR 身临其境地学习

    有道少儿词典使用 AR 打破了时空限制,让孩子们有趣和又有效的方式学习新单词。利用 ARCore 的环境理解(Environmental Understanding)及平面识别(Plane Finding),识别环境中的对象和特征,精确地理解环境,加上炫酷逼真的 3D 模型,为孩子们带来身临其境学单词的乐趣体验。

    学习过程中,孩子们不仅可以将精致模型投射在家里,从各种角度进行观察,放大缩小或移动;还可以点击模型上的中英文词框,或点进查词结果页,查看中英单词的权威释义,使形象和字义深刻联结。这大大提升了学习的趣味性,让孩子们边学边玩两不误。

    滴滴 - 用 AR 让路痴永不迷路

    在火车站、商场和机场等大型公共区域,你是否有打上车却找不到司机的体验?AR实景导航,让路痴轻松找到方向。

    基于 ARCore 技术,滴滴构建了一个实景导航解决方案,实时识别用户和环境之间的定位关系,AR 实景导航引导信息逼真地和实景环境相结合,用户只需要跟着 AR 路标走,直接跳过转换 2D 地图信息的步骤。在这个过程中,ARCore 的环境理解和运动跟踪功能,确保手机始终识别用户方位,给出正确的路标指导。

     

    在定位时,ARCore 会提示用户获得一张有效定位图片,利用运动追踪功能,感知用户位置、移动速度和角度。同时,ARCore 通过环境理解功能可以理解周围现实环境,估算平面信息,不论是商场地面,还是垂直于水平地面的墙壁、指示牌,它都能快速理解并相应放置虚拟指示路标,使引导信息渲染得更加逼真,让用户一看就明白。

    这种有用、科技感十足的导航方式,一经推出就大受用户好评。这项功能在中国、日本等多地上线,据数据显示,它帮助用户节省近 1/4 的时间,满意度达 80%。

    ARCore 新进展 - 让更多人,在更多地方体验更逼真的增强世界

    除了这些丰富多彩的创新合作成果,本次 Google 开发者大会上,还着重介绍了 ARCore 技术的最新进展,为各位开发者们带来了两项AR领域的重磅功能:Depth API(深度 API)以及持久云锚点(Persistent Cloud Anchors)技术。

    深度 API - 解决 AR 界的遮挡及互动难题

    2020年中,Google 发布了 ARCore Depth API(深度 API),为开发者们带来解决虚拟物件拟真技术难题的希望,开发者凭借 Depth API 和单个 RGB 摄像头就可创建出深度图。不依赖任何特殊硬件,所以在大部分兼容 ARCore 的设备上都是可以使用深度API的。

    Depth API 的一项最关键功能就是“遮挡”:虚拟物体能够准确地出现在现实物体后面,与场景真正融合在一起。此前没有遮挡功能,虚拟物体容易“横空出世”,更像是现实世界中的“贴图”,让人瞬间出戏。

    AR 作为一种视觉沉浸式媒介,持续吸引着社会各界的广泛关注。Google 作为技术先驱,正积极地与全球开发者合作,用大放异彩的 ARCore 带来一个又一个惊喜。这种变革式的新体验,在不断发展中已有长足进步,但想必它还有更为广阔的远景。未来,它将如何予力社会与个人,改变你我的生活呢,让我们拭目以待。

     

    展开全文
  • ARCoreARCore开发的起步

    千次阅读 2017-11-26 10:50:30
    已经是第7章节了,终于可以开始正式接触到我们梦寐以求的ARCore了,相信大家应该都有一点点小激动了吧。那么下面我们就开始讲解如何进行ARCore的开发。 一、Session简介 初看到Session,大家都摸不到头脑。最...

    已经是第7章节了,终于可以开始正式接触到我们梦寐以求的ARCore了,相信大家应该都有一点点小激动了吧。那么下面我们就开始讲解如何进行ARCore的开发。

    一、Session简介


    初看到Session,大家都摸不到头脑。最直接的解释,它是ARCore API的一个类com.google.ar.core.Session。它管理了AR系统的状态,有自己的生命周期,开始和停止访问摄像头图像帧的获取。

    所管理AR系统状态,包含跟踪的Anchor信息、通过session.add(Pose)和session.removeAnchor(anchors)保存和删除。session.getAllPlanes()返回被检测到的平面、当前投影矩阵等。

    当ARCore App退至后台,Activity调用onPause()方法时,也需要通过session.pause()暂停Session,来停止摄像机的图像获取并获取资源。在App呈现在前台的时候,onResume()方法中调用session.resume(Config)可以重新启用Session,获取摄像机图像等。

    有了平面和虚拟内容位置等信息进行渲染。但是当手机的位置移动的时候,我们是如何保持绘制内容的“位置不变”的呢?这都是基于ARCore系统不断返回的图像帧、设备位置和朝向等信息。调用session.update()方法来获取最新的相机帧,更新设备的位置,更新被跟踪的Anchor信息,更新被检查的平面。

    二、Config简介


    Config,即ARCore API中com.google.ar.core.Config,保存了用于配置Session的设置。那么这个配置中都包含了什么呢?

    1. 光线评估子系统的行为Config.LightingMode,包含开启或者禁止光线评估。
    2. 平面检测子系统的行为Config.PlaneFindingMode,包含开启和禁止平面检测。
    3. update()的行为Config.UpdateMode。在大多数设备中,摄像头被配置每秒捕捉30帧。当调用update()从摄像机获取帧的时,没有新的相机图片包含两种行为:立即分会和阻塞等待。

    另外前面提到过目前并不是所有设备都支持ARCore,session.isSupport(config)方法就能完成当前设备是否支持该ARCore的配置。

    三、ARCore开发起步


    了解了Config和Session的意义之后,正式开始ARCore开发。我们需要处理这么几件事情:

    1. ARCore设备支持检测:自定义或者创建默认Config,然后通过Session来检测当前设备是否支持当前ARCore配置。
    2. 处理Session生命周期和视图变化:

      • 在Activity的onPause()和onResume()生命周期回调中,处理Session生命周期。正确的开始和暂停相机获取图像,释放资源等。
      • 当手机屏幕变化等情况发生,导致GLSurfaceView大小变化。需要适当调整透视图矩阵和背景,设置纵横比和坐标缩放,用于UV坐标系和投影矩阵生成。保证变化后虚拟内容的正常渲染。

    四、案例源码分析


    了解了基本的概念和步骤后,我们来看看在Google的ARCore Demo中是如何处理的。
    1. ARCore设备支持检测
    com\google\ar\core\examples\java\helloar\HelloArActivity.java

    public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
        ... ...
        private Session mSession;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ... ... 
            //Sessoin类是ARCore API的主要入口,管理AR系统状态和处理Session生命周期,接收帧允许访问摄像头的图片和设备的Pose
            mSession = new Session(/this);
            //创建默认的Config,平面检测,光线评估被启动,并且阻塞更新被选中。检查当前的设备是否支持ARCore,从这个Config创建Session
            mDefaultConfig = Config.createDefaultConfig();
            if (!mSession.isSupported(mDefaultConfig)) {
                Toast.makeText(this, "This device does not support AR", Toast.LENGTH_LONG).show();
                finish();
                return;
            }
            ... ...
        }
    }

    2.处理Session生命周期和视图变化
    com\google\ar\core\examples\java\helloar\HelloArActivity.java

    public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
        ... ...
        private Session mSession;
    
        @Override
        protected void onResume() {
            super.onResume();
            //ARCore需要摄像机权限来操作。如果我们还没有Android M及以上得到运行时的权限,现在是一个向用户请求它的好时机
            if (CameraPermissionHelper.hasCameraPermission(this)) {
                showLoadingMessage();
    
                //使用默认配置恢复Session,如果Session没有开始或者被暂停,这个方法必须在App的UI线程中被调用。它将会启动Session,初始化相机和运动跟踪,当update()被调用的时候,将会产生帧。注意这个顺序很重要 - 在onPause()中看到该说明,相反的在这里也同样适用。
                mSession.resume(mDefaultConfig);
    
                //恢复渲染线程,如果有必要的话重新创建OpenGL上下文,它和onPause对应
                mSurfaceView.onResume();
            } else {
                CameraPermissionHelper.requestCameraPermission(this);
            }
        }
    
        @Override
        public void onPause() {
            super.onPause();
            //注意这个顺序很重要 - GLSurfaceView首先暂停所以它不会再尝试查询Session。如果Session在GLSurfaceView。前被暂停,GLSurfaceView可能一直调用mSession.update()并且获取一个SessionPauseException
            mSurfaceView.onPause();
    
            //暂停当前Session,这个方法将会停止相机反馈和释放资源
            mSession.pause();
        } 
    
            @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            GLES20.glViewport(0, 0, width, height);
    
            //通知ARCore Session视图大小被改变,所以透视矩阵和视频背景可以适当的调整。设置纵横比和坐标缩放,这个数据将会被使用UV坐标系,生成投影矩阵
            mSession.setDisplayGeometry(width, height);
        }
    }

    1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
    1024工场服务号

    2.完整和持续更新的《使用Android打开AR的开发大门—ARCore》文档,欢迎大家阅读!
    https://www.kancloud.cn/p3243986735/arcore_develop/457951
    这里写图片描述

    展开全文
  • ARCoreARCore的初体验

    千次阅读 2017-11-14 17:46:07
    在正式跟带大家进入到ARCore开发之前,让大家体验一下ARCore还是很有必要的。现在就带着大家一起来感受一下来自Google AR实验室的几个作品,相信大家已经迫不及待的想体验和试试ARCore的功能了。1.Draw And Dance ...
  • arcore-preview

    2017-08-31 11:49:54
    arcore-preview
  • ARCore UNITY插件

    2018-09-18 08:36:56
    ARCore UNITY插件ARCore UNITY插件
  • ARCore_1.6

    2019-02-18 15:39:48
    最新版arcore apk1.6 测试可用 Android手机三星s7
  • Eazy ARCore Interface是一个Unity3D插件,可简化ARCore项目的开发和调试。 具体而言,它模拟ARCore在Unity3D编辑器内部的Android设备中如何工作。 因此,它可以更快地开发ARCore应用,而无需构建和部署到设备上以...
  • Nimbl3-ARCore示例项目 使用ARCore在Android中探索AR 该项目是从的原始示例项目派生而来的,该项目经过修改,添加了更多对象并且在AR Environment中与对象进行了简单的拖动交互。 设置: 当前受ARCore支持的设备...
  • ARCoreARCore带来的新概念

    千次阅读 2017-11-23 01:39:33
    一、ARCore能做什么 在Google官方提供的Demo中,实现了这样一个功能。当我们在照相机预览的空间轻轻点击屏幕的时候,在空间中就生成一个Android小机器人,如下图所示: 当我们更换手机的位置或者照相机的观察...
  • 初识ARCore

    2020-06-08 21:35:06
    初识ARCore前言ARCore概览支持的设备ARCore 的工作原理开发环境 前言 暑期实训所选的题目需要使用ARCore,因为还有很多不了解的地方,目前只是学习相关知识。 ARCore官网:https://developers.google.cn/ar ARCore...
  • Google ARCore SDK

    2017-09-09 20:00:27
    Google ARCore SDK:ARCore,Google 推出的增强现实 SDK。软件开发者现在就可以下载它去开发 Android 平台上的增强现实应用,或者为他们的 App 增加增强现实功能。
  • Android_ARCore

    2017-10-13 15:09:58
    Android_ARCoreAndroid_ARCoreAndroid_ARCoreAndroid_ARCore
  • unity arcore插件

    2020-12-08 13:46:46
    unity 谷歌AR安卓使用插件,比高通与Easy高级的东西;包内有1.16与1.21最新版本 unity ARCoreSdk 最新版本。
  • ARCore SDK v1.4

    2018-08-23 15:24:51
    压缩包内包含最新的ARCore 1.4的SDK,包括ARCore_1_4.apk,ARCore_1_4_x86_for_emulator.apk,以及相应的测试代码arcore-android-sdk-1.4.0.tar.gz
  • ARCore谷歌AR

    2018-06-05 15:21:31
    Google 推出的增强现实 SDK(ARCore)。软件开发者现在就可以下载它去开发 Android 平台上的增强现实应用,或者为他们的 App 增加增强现实功能。
  • ARCore:从哪里冒出来的ARCore

    千次阅读 2017-09-07 00:08:11
    一、ARCore的横空出世前几天的谷歌开发人员日,技术专家Tom Slater连线在波兰克拉科夫的ICE会议中心,在YouTube直播中荣重推出了ARCore。苹果今年6月份发布的ARkit,对于开发者和用户都极度友好,它通过iPhone现有的...
  • Awesome-ARCore:精选的ARCore项目和资源的精选清单。 随时贡献!
  • 适用于iOS的Google ARCore SDK 版权所有(c)2018 Google LLC。 版权所有。 该SDK可访问所有ARCore跨平台功能,例如云锚。 请注意,我们不接受请求请求。 快速开始 对于Cloud Anchors,请参阅。 有关增强脸部,请...
  • ARCore.apk.zip

    2019-09-06 13:08:26
    ARCore.apk 1.11版本,可用于安卓机型配合ARCore SDK 进行开发
  • 安卓Arcore Unity3D插件

    2017-12-18 15:52:57
    安卓Arcore Unity3D插件 安卓Arcore Unity3D插件 安卓Arcore Unity3D插件
  • ARCore快速入门-02导入ARCore For Unity

    千次阅读 2020-01-29 22:52:01
    1.需要一台支持ARCore的安卓手机用来调试,...3.在测试手机上安装Google ARCore服务,(如果不想翻墙去下载,也能在”应用宝“上,下载名字为”ARCore“的...
  • 适用于Android的ARCore SDK 版权所有2017 Google LLC 该SDK为所有基本的AR功能(例如运动跟踪,环境理解和光线估计)提供API。 借助这些功能,您可以构建全新的AR体验或使用AR功能增强现有应用程序。 重大更改影响...
  • ARCore 1.0 For Unity

    2018-04-17 16:26:04
    ARCore 是一个用于在 Android 上构建增强现实应用的平台,包括运动跟踪、环境理解和光估测。 该资源是应用于Unity上使用ARcore的工具包。
  • ARCore视频教程.rar

    2020-04-21 22:09:45
    ARCore视频教程 ARCore是谷歌推出的搭建增强现实应用程序的软件平台,类似苹果的ARKit, [1] 它可以利用云软件和设备硬件的进步,将数字对象放到现实世界中。 Google 推出的增强现实 SDK(ARCore)。软件开发者可以...
  • 谷歌ARcore for UNITY

    2018-02-25 20:47:56
    Google 推出的增强现实 SDK(ARCore)。软件开发者现在就可以下载它去开发 Android 平台上的增强现实应用,或者为他们的 App 增加增强现实功能。这是最新发布的ARCore1.0 for UNITY的SDK包。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,857
精华内容 742
关键字:

arcore