SamMitiAR 1.1

SamMitiAR 1.1

Nattawut SinghchaiVirakri Jinangkul 维护。



  • Nattawut Singhchai

Cocoapods Compatible Platform

在 iOS 上的 SamMiti AR

为最佳用户体验准备的简单易用的 ARKit 框架。

概述

自从苹果在 2017 年的 WWDC 上宣布 ARKit 以来,增强现实(AR)在 iOS 上已经成为一个非常大的话题。该 API 广泛用于利用 3D 沉浸式用户体验;然而,为了实现良好的 ARKit 体验,需要考虑很多小组件,而且需要花费大量时间和精力。iOS 上的 SamMiti-AR 是一个基于基本用户体验构建的 ARKit 框架,这些基本用户体验符合苹果的人机界面指南和为工程师使用的常见功能。

显著功能

放置多个虚拟对象

Placing Multiple Virtual Objects

框架附带一个多虚拟对象处理器,可以直接使用 SamMiti AR 放置功能。

快速预览,轻松实现AR预览

Quick Drop, Preview in AR with No Effort

受iOS 12中AR快速预览功能启发,此功能可实现无需在屏幕上点击任何按钮即可放置虚拟对象。在AR中预览一个虚拟对象时,这种方式是最理想的方法,可以将所有步骤缩减为一步。

流畅自然的交互

Interaction with Fluidity

虚拟对象拖动时不再有跳跃效果。即使对象从桌面拖动到地板上,所有交互过程也是平滑过渡。

与精准缩放的交互

一键式虚拟对象操作交互

可自定义的AR焦点

调试模式,真正了解发生的事情

Debug Mode, Really Know What’s Going on

支持所有开放3D内容格式(glTF-ready)

ARKit2-ready

还有一些东西可以玩耍

描述

SamMiti-AR在iOS上集中了大多数AR与3D相关功能。这意味着使用此框架可以将许多需要在基本结构上花费的时间减少。

为了您的信息,该框架基于ARSCNView(ARKit SceneView)构建,后者使用SceneKit作为渲染图像的引擎,因此您可以期待在这个框架中遇到许多SceneKit功能。

要求

  • iOS 11.3+
  • Xcode 9.0+

安装

CocoaPods

SamMitiAR可以通过CocoaPods获取。要安装它,只需要将下面的行添加到Podfile中

#for Xcode9 (iOS 11.3+)
pod 'SamMitiAR', '~> 1.0'

#for Xcode10 Beta
pod 'SamMitiAR', :git => 'https://github.com/prolificinteractive/SamMitiAR-iOS.git', :branch => 'features/xcode10-compatible'

示例项目

使用方法

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis quis fringilla lectus. Nullam ornare erat eget ultrices rhoncus. Aenean eleifend euismod dolor, id tempus eros iaculis et. Aenean efficitur mi id nulla egestas mollis. Integer id tincidunt tortor.

SamMiti-AR for iOS结构和其工作原理

此框架是在ARSCNView之上构建的,它利用了SceneKit和ARKit的双重功能。此外,框架还包含几个辅助类以设置基本的增强现实体验,加载和放置虚拟对象,允许用户与对象交互。框架中的类包括……

配置和设置

要使用SamMitiARView,在安装SamMiti pod之后,您只需在Storyboard中创建新的ARSCNView,将视图更改为SamMiti的子类,并创建IBOutlet将其链接到Storyboard,或者在视图中编程初始化SamMitiARView。

在您的视图中,您需要导入SamMiti框架以及ARKit和SceneKit。

import SamMiti
import ARKit
import SceneKit

为了让SamMitiView能够回调到视图控制器,需要定义代理方法,ViewDidLoad函数是一个很好的地方。

// SamMiti AR View Delegate
sceneView.samMitiARDelegate = self

要配置一些行为,您可以在视图控制器的 ViewDidLoad 方法中进行操作。在视图初始化 ARSession 之前,需要调用一些函数,包括启用相机自动对焦功能 isAutoFocusEnabled,以及 ARSession 运行期间可以更改的几个可选函数。

// SamMiti AR View Configuration
sceneView.isAutoFocusEnabled = false

// SamMiti AR View Configuration can be changed along the ARSession is running
sceneView.hitTestPlacingPoint = CGPoint(x: 0.5, y: 0.5)
sceneView.isLightingIntensityAutomaticallyUpdated = true
sceneView.baseLightingEnvironmentIntensity = 6

要运行 SamMitiAR,必须在 View Will Appear 中调用 setup()

sceneView.setup(withDebugOptions: [])

除了 setup() 函数外,在视图将消失时还需要调用 session.pause() 来停止在用户离开视图控制器时对 ARSession 的处理。

// Pause the view's AR session.
sceneView.session.pause()

工作进行中

放置模式

放置虚拟对象有两种模式。一种称为 quickDrop。此模式允许用户在不触摸屏幕上的任何内容的情况下放置虚拟对象,但需要用户移动设备以初始化 ARKit 平面锚点。另一种模式称为 focusNode。此模式允许用户使用焦点节点(指示焦点)来指示虚拟对象的位置,并且用户需要在屏幕上点击以将虚拟对象放置在所需的位置。

// WIP image example of quickDrop mode

quickDrop 模式示例

// WIP image example focusNode mode

focusNode 模式示例

要设置 SamMitiAR 视图的放置模式,需要将 placingMode 属性设置为所需模式。最好在调用 startAR() 函数之前设置此属性。

/// Example of setting SamMitiAR view to *quickDrop* mode
sceneView.placingMode = .quickDrop

放置和移除虚拟对象

工作进行中

func prepareToPlaceVirtualObject() {

let virtualObjectScene = SCNReferenceNode(named: "art.scnassets/stubhub_model/stadium_1223.scn")!
let virtualObjectNode = SamMitiVirtualObject(refferenceNode: refNode, allowedAlignments: .all)

/*
let virtualObjectGLTFNode = SamMitiVirtualObject(gltfUrl: URL(string: "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Embedded/Duck.gltf")!, allowedAlignments: [.horizontal])
*/

SamMitiVitualObjectLoader().loadVirtualObject(virtualObjectNode, loadedHandler: self.handleLoad)

}

func handleLoad(virtualNode: SamMitiVirtualObject?) {

guard let virtualNode = virtualNode else { return }
samMitiARView.currentVirtualObject = virtualNode

}

工作进行中

func remove(virtualNode: SamMitiVirtualObject?) {

guard let virtualNode = virtualNode else { return }
samMitiARView.currentVirtualObject = virtualNode

if samMitiARView.placedVirtualObjects.contains(virtualNode) {
self.virtualObjectLoader.remove(virtualNode)
}

}

工作进行中

自定义焦点节点

工作进行中

工作进行中

samMitiARView.focusNode = SamMitiFocusNode(withNotFoundNamed: "art.scnassets/focus_node_not_found.scn",
estimatedNamed: "art.scnassets/focus_node_estimated.scn",
existingNamed: "art.scnassets/focus_node_existing.scn")

工作进行中

使用 SamMiti-AR 回调

工作进行中

func trackingStateReasonChanged(to trackingStateReason: ARCamera.TrackingState.Reason?) {
guard let trackingStateReason = trackingStateReason else { return }
switch trackingStateReason {
case ARCamera.TrackingState.Reason.excessiveMotion:
messageLabelDisplay("Please move your phone slower")
case ARCamera.TrackingState.Reason.initializing:
messageLabelDisplay("Initializing AR Experience")
case ARCamera.TrackingState.Reason.insufficientFeatures:
messageLabelDisplay("Seems like there isn't enough light")
case ARCamera.TrackingState.Reason.relocalizing:
messageLabelDisplay("Relocalizing AR Experience")
}
}

工作进行中

func samMitiViewWillPlace(_ virtualObject: SamMitiVirtualObject, at transform: SCNMatrix4) {
guard let virtualObjectName = virtualObject.name else { return }
messageLabelDisplay("SamMiti will place \(virtualObjectName)")
let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
}

工作进行中

为SamMiti AR贡献

要报告错误或增强请求,请随意在相关标题下提交问题。

如果您想为该项目做出贡献,请将该仓库分叉并提交拉取请求。

许可证

prolific

版权所有 (c) 2017 Prolific Interactive

SamMiti-AR-iOS 由 Prolific Interactive 维护并赞助。它可以在LICENSE文件中指定的条款下进行重新分发。