ARFoundation学习
学习方式
加入一些 ar 技术交流群,看一些博客。博客推荐_davidwang_的 arfoundation 之路,csdn 上的。
可以读一些官方文档,像 ARCore 和 ARKit 的。每年的 wwdc 苹果全球开发者大会都会有人讲 ARKit 有哪些新的功能,可以去理解底层是如何设计的。unity 官方也会出一些视频讲 ar 方面的内容
打包教程
https://www.bilibili.com/video/BV1Qt4y1a7aW?p=11&vd_source=5270415d668b21206238403450bb29b5
notes:
ios的打包教程,需要有ios的环境(但我们没有苹果电脑,此外我在尝试给实验室工位上的电脑装虚拟机,之前试过一次失败了;可以回头搜一搜哔哩哔哩,找找怎么配置)
https://blog.51cto.com/myselfdream/2493033
2
实操案例
AR Foundation | AR Foundation | 5.1.0 (unity3d.com)
AR Foundation手册:
https://docs.unity3d.com/cn/2021.3/Manual/com.unity.xr.arfoundation.html
Gaze Interaction in Unity+Mapbox🔍
https://www.youtube.com/watch?v=Xhz3cmnluNo&list=PL88ZsSjUqiTD0CJAdMQ9MO3m43mxVjMoU&index=1
https://www.youtube.com/watch?v=OE66gtiF8QQ&list=PLNFBI1dJIh36ku4BVYGBEcvDuQAGSrcbn&index=14
安装包:AR Foundation; ARCore XR Plugin; ARKit XR Plugin
删除初始相机,构建XR->AR Session Origin;
构建XR-> AR Session, XR->AR Default Point Cloud, XR->AR Default Plane
为AR Session Origin添加component:AR Point Cloud Manger, AR Plane Manager, AR Raycast Manager,并把之前的Point Cloud和Plane的gameobject挂载上去;
新建3D物体Plane,并确保zero out(就是reset为初始化0),这个plane就是为了实现AR的shadow和stuff的渲染;删除mesh collider,并重命名为ContentParent; 所有它的子物体都会显示在AR的场景下;
新建子物体Cube,然后设置Scale为(0.2,0.2,.0.2),因为在AR的里面,一个单位对应的是一米,原始的1太大了。此外,把物体的y设置为0.1,这样物体就看着是放置在平面上了。
为了不看到plane,把mesh render设置为非激活状态;
之后添加toggle,来实现对点云呈现与否的切换:
UI->Canvas, RenderMode:ScreenSpace-Overlay, UIScaleMode: ScaleWithScreenSize
UI->Toggle: 修改锚点到左上角,Pivot为x=0,y1=1,然后调整PosX=0,PosY=0; Toggle内部的把Text删掉,设置Background锚点下为Stretch,right为0;然后回到Toggle,设置宽高;再回到background里的checkmark,设置为stretch,调整left=0, top=0, right=0,bottom=0
新建Scripts文件夹,构建脚本PlaceContent.cs, ToggleAR.cs
PlaceContent挂在ContentParent上;
ToggleAR挂在Toggle上,同时Toggle添加OnValueChanged的事件,拖入的是Toggle的Toggle AR的脚本组件
切换环境到安卓,并添加main到Scenes in Build里;
修改PlayerSettings里的PackageName为com.matt.GazeInteraction; 并同时修改到IOS的包里面;
之后在playsettings里
IOS: 激活requires arkit support,修改target minimum iOS version为11.0;修改Architecture为arm64;
Android: 删除Graphics APIs里的Vulkan; 取消勾选Multithreaded rendering; Minimum API Level为Android 7.0 ‘Nougat’(API level 24);修改scripting backend为IL2CPP,勾选ARM64
黑屏问题解决:https://blog.51cto.com/u_15127683/4151076
对Cube修改大小scale为(0.5,0.5,0.5);
create Empty: SectionInfo
create Quard: InfoParent;
略微拉高SectionInfo, 修改Quard的rotation(0,180,0), scale(2,1,1)
新建材质文件夹,构建trans材质,设置为rgb0-1.0,调整透明度为0.7,黑色背景。
对InfoParent构建child object:Cube和Text(TMP)
前者拉下来,然后调整scale,添加材质;
后者
- 因为一开始添加之后字体扭曲了distorted,所以修改y的scale为2,
- 在Scene上方找到Gizmos并激活(这里我没有找到,而是默认就激活了,就是那个圆形按钮一样的带一个下拉框的,这个选项是让text上显示黄色线框);
- 调整width和height(不要再修改scale了),使得text的边框可以和InfoParent大小一致
- 设置text里的内容居中,字体大小fontsize随着线框大小变化auto size,最小为0,最大为1000
- 如果在上y右x的坐标下,text显示在infoParent的里面,则需要把text往外拉;
- 修改里面的内容为Here is some infos.
- 关掉线框
- 为了让SectionInfo缩放的时候,感觉是从cube弹出来的,需要先把InfoParent从子物体拉出来,然后修改SectionInfo的Y大小为0.5,然后再把InfoParent拉进来还原为子物体。这个时候缩放SectionInfo就正常了
让text的Extra Settings里的order in layer设置为1,可以首先显示出来。
新建材质,命名为Blue,修改颜色为蓝色,然后给Cube这个材质;
添加脚本InfoBehaviour,实现SectionInfo的缩放,并给到Cube上(因为Cube上放了Box Collider),也拖入SectionInfo作为transform的那个参数;
为了让SectionInfo会始终面向摄像机,也就是随着相机旋转,添加脚本FaceCamera;
我们不希望SectionInfo的x和z轴方向旋转,所以需要设置为0;
为了进行验证,加上了[ExecuteInEditMode],这样就可以在编辑模式里面通过移动摄像机测试是否生效(为了让项目中的摄像机可以被获取到,需要在参数设置面板中设置为main camera
之后新建gaze脚本,挂到AR Camera上(main camera)
获取到射线投射到的物体,通过tag判断是否是有信息的可交互的gameobject
补充知识点: |
修改Game为800*480的Landscape,然后看到toggle有点大,所以进行width和height的大小,和location的位置,移动到左上角。
入门教程
https://www.bilibili.com/video/BV1VT4y1z7MH?p=1&vd_source=5270415d668b21206238403450bb29b5
arfoundation教程里具备环境之后的操作:
登录:developer.apple.com/download/
需要一个新版本的Mac OS,Xcode(ios 13);
作者安装了macOS Catalina 10.15 beta, iOS 13 beta
新建场景scene;
新建gameobject:
ar session
ar session origin(在原点的地方新建了一个,然后里面的相机就是AR的相机), add components(ar plane manager(script)
新建一个empty gameobject,add components(ar plane, ar plane mesh visulizer, mesh collider, mesh filter, mesh renderer, line renderer),针对line renderer,设置lighting里的shadow\width\materials\corner vertices\en cap vertices\use world space\loop ———-> 也就是xr里的ar default plane
在ar session origin里的ar pane manager关联一下内置的prefab: ar default plane
新建脚本PlacementController.cs并挂到ar session origin上面
添加自定义的物体prefab,然后就可以打包了
Selection 场景
添加PlacedObject, 挂载Placement Object.cs
在AR Session Origin上,挂载PlacementWithManySelectionController.cs
notes: 注意,一个是物体的位置设置,可以把相机拉远一点,如果物体不在视锥体里面,是在相机里看不到的;
其他部分还是保持默认即可
这个最后的效果是以手机处为中心的,所以做不到锚点定位
但这个静态的,就可以考虑加上地形的一套
室内导航demo
https://www.youtube.com/watch?v=fuHFrMZ4q_s
ardraw demo
官方demo
https://github.com/Unity-Technologies/arfoundation-samples/tree/4.2
ar云锚点等需要的功能
报错处理
打包的时候:Unity.IL2CPP.Building.BuilderFailedException
切到新版本上(2020->2021)
Building Library\Bee\artifacts\Android\d8kzr\libil2cpp.so failed with output:
删掉Unity已经弃用的UnityARKitPlugin 的旧插件