Unity 博客
https://blogs.unity3d.com/2018/02/16/developing-for-arkit-1-5-update-using-unity-arkit-plugin/
使用Unity ARKit插件開發ARKit 1.5更新
Unity的ARKit插件現在支持Apple在其2018年春季更新中宣布的新增強現實(AR)功能。ARKit與iOS 11的推出將AR應用於億萬iPhone和iPad用戶的手中。隨著ARKit 1.5的推出,Apple的目標是為開發人員提供工具,以提供更加逼真的AR體驗,從而更好地與現實世界融合。
通過Unity更新的ARKit插件,開發人員現在可以充分利用新的ARKit 1.5工具創建新一代AR應用程序。除了水平表面之外,您現在可以識別垂直表面上的垂直對象,並更精確地映射不規則形狀的表面。查找並識別真實世界2D圖像的位置,並將其轉化為AR體驗,例如將藝術品帶入生活。其他新功能包括重新定位,視頻格式,自動對焦和重置世界原點的能力。
從Bitbucket下載更新的插件,並閱讀下面的內容,開始使用Unity的ARKit Spring 2018更新進行開發。
設定
需求
- iOS設備支持ARKit,並且安裝了Apple開發人員站點上的最新iOS 11.3 beta圖像。
- Mac與MacOS 10.13(高Sierra)或以上。
- Unity版本2017.1或以上。
- 來自Apple Developer網站的最新XCode 9.3 beta(需要macOS 10.13)
- Unity ARKit插件Bitbucket repo的“spring2018_update”分支的最新版本。
步驟
- 啟動Unity編輯器2017.1或更高版本
- 打開你從Bitbucket下載的“unity-arkit-plugin”項目
- 按照以下說明加載示例場景或創建自己的場景
- 在Unity中構建場景以創建XCode項目
- 打開已創建的XCode項目,並在ARKit支持的設備上構建並運行它。
垂直平面(Vertical Planes)
垂直平面是最受歡迎的新功能之一。當原始ARKit發佈時,只有水平面能被檢測到,許多開發人員為垂直面檢測而大聲疾呼。有了這個更新,Apple已經收聽了這個請求並提供了垂直面檢測。在Unity中,您可以將其視為UnityARPlaneDetection列舉(enum)中的額外條目。如果您想要同時檢測垂直和水平兩個平面,我們還添加了另一個條目。我們還在ARPlaneAnchorAlignment列舉中添加了“垂直”條目,以便您可以識別檢測到的每個平面錨點的方向。
我們原來的“ Assets / UnityARKitPlugin / Examples / UnityARKitScene / UnityARKitScene.scene ”可以與UnityCameraManager.cs的輕微修改一起使用,以允許您使用配置檢測水平和垂直平面,而不是使用新的示例來顯示此功能。
在場景層次結構中,選擇ARCameraManager遊戲對象,然後在Inspector窗口中選擇水平和垂直:
以下是在設備上發現的兩種平面的示例:
平面邊界和細節網格(Plane boundaries and detail mesh)
通過此次更新,ARKit不僅提供了平面中心和矩形範圍,還提供了更詳細的平面邊界可視化以及檢測到的平坦表面形狀的詳細網格。
這個實現是通過一個作為ARPlaneAnchor的一部分返回的ARPlaneGeometry項目實現的。對此項目的進一步檢查將顯示類似於ARFitGeometry的結構,您將從ARKit Face Tracking for iPhone X中記住這一結構。
您將獲得一組代表邊界點的向量,這些向量可以插入到LineRenderer中,以表示已檢測到的平坦表面的邊界。您還將獲得一系列頂點,這些頂點處的紋理坐標以及表示曲面形狀的細節網格三角形的索引列表。
要了解如何使用這些信息,請查看Assets / UnityARKitPlugin / Examples /ARKit1.5/UnityARPlaneMesh/UnityARPlaneMesh.scene。這個場景的設置就像我們上面的原始UnityARKitScene一樣,但GeneratePlanes GameObject引用了ARKitPlaneGeometry預製而不是debugPlanePrefab。
查看Inspector中的ARKitPlaneGeometry預製:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public void UpdateMesh(ARPlaneAnchor arPlaneAnchor)
{
planeMesh.vertices = arPlaneAnchor.planeGeometry.vertices;
planeMesh.uv = arPlaneAnchor.planeGeometry.textureCoordinates;
planeMesh.triangles = arPlaneAnchor.planeGeometry.triangleIndices;
lineRenderer.positionCount = arPlaneAnchor.planeGeometry.boundaryVertexCount;
lineRenderer.SetPositions (arPlaneAnchor.planeGeometry.boundaryVertices);
// Assign the mesh object and update it.
planeMesh.RecalculateBounds();
planeMesh.RecalculateNormals();
}
|
現在將上述場景建立到您的設備上,並尋找形狀奇怪的平面以查看它們是否實際顯示其形狀:
圖像錨(Image Anchors)
這可以說是最重要和最複雜的新功能:它允許您檢測場景中的特定圖像(或標記),並在描述標記的位置,大小和方向的位置創建一個錨點。閱讀ARKit文檔的這一部分以更好地理解此功能。
然後打開Assets / UnityARKitPlugin / Examples / ARKit1.5 / UnityARImageAnchor / UnityARImageAnchor.scene進行操作。
在Unity中,我們需要設置參考圖像,圖像集並允許我們的配置參考任意圖像集進行檢測。為了實現這一點,我們使用兩種新的資產類型:ARReferenceImage和ARReferenceImagesSet。這些資產可以通過使用Assets / Create / UnityARKitPlugin菜單創建:
現在,在場景中的ARCameraManager遊戲對像中,輸入要在該場景中檢測到的ARReferenceImagesSet的引用:
此配置現在將查找包含在您引用的ARReferenceImagesSet中的所有ARReferenceImages。當檢測到集合中的任何圖像時,您將獲得添加,更新和刪除與該圖像關聯的ARImageAnchor的事件。我們使用名為GenerateImageAnchor的腳本在檢測到特定的ARReferenceImage時放置適當的預製實例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
void Start () {
UnityARSessionNativeInterface.ARImageAnchorAddedEvent += AddImageAnchor;
UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent += UpadteImageAnchor;
UnityARSessionNativeInterface.ARImageAnchorRemovedEvent += RemoveImageAnchor;
}
void AddImageAnchor(ARImageAnchor arImageAnchor)
{
Debug.Log (“image anchor added”);
if (arImageAnchor.referenceImageName == referenceImage.imageName) {
Vector3 position = UnityARMatrixOps.GetPosition (arImageAnchor.transform);
Quaternion rotation = UnityARMatrixOps.GetRotation (arImageAnchor.transform);
imageAnchorGO = Instantiate<GameObject> (prefabToGenerate, position, rotation);
}
}
|
現在將此場景構建到XCode。檢查XCode項目,您會注意到每個ARReferenceImageSet都顯示為一個AR資源組,並使用您在相應資產中使用的名稱命名:
重新定位(Relocalization)
以前,當您接到電話或以其他方式讓您的ARKit應用程序進入後台時,您將失去世界跟踪信息,並且一切都會失去位置。通過此次更新,只要您沒有從以前的位置移動過多,ARKit現在允許您在中斷後保留您的世界跟踪信息。有了這個新功能,我們可以設置一個跟踪狀態原因來指定ARKit在中斷後重新定位所需的時間:ARTrackingStateReason enum現在有一個ARTrackingStateReasonRelocalizing條目。
此功能是可選的:通過將屬性UnityARSessionNativeInterface .ARSessionShouldAttemptRelocalization的值設置為false,您可以像以前一樣使ARKit應用程序正常工作。
打開Assets / UnityARKitPlugin / Examples / ARKit1.5 / UnityARKitRelocalize / UnityARKitRelocalize.scene,看看它是如何完成的。此場景允許您在兩種模式之間切換,並在ARKit重新定位時查看跟踪狀態和跟踪狀態原因。請參閱RelocalizationControl.cs中的代碼,了解如何完成此操作。
自動對焦(Autofocus)
對於ARKit,相機最初設置為無限焦點。有了這個更新,您可以選擇無限焦點或ARKit相機上的自動對焦。默認情況下,如果您的設備上有最新的ARKit更新,則會將相機設置為自動對焦。為了改變這種情況,我們引入了一個新的boolean enableAutoFocus,您可以在啟動ARKit之前在您的配置上設置它。
打開Assets / UnityARKitPlugin / Examples / UnityARKitScene / UnityARKitScene.scene,並檢查ARCameraManager GameObject,它現在有一個“Enable Auto Focus”複選框,它被傳遞給ARKitWorldTrackingSession配置(參見UnityARCameraManager.cs):
視頻格式(Video Formats)
開發者的另一個要求是增加ARKit應用上顯示的視頻的分辨率。此更新為AR應用程序提供更高分辨率的視頻,但允許您根據正在使用的實際設備選擇其他視頻格式。
要枚舉設備支持的視頻格式,可以調用靜態方法UnityARVideoFormat.SupportedVideoFormats(),該方法將返回UnityARVideoFormat的列表,其中每個列表包含寬度,高度和每秒幀數。每個UnityARVideoFormat還包含一個IntPtr,您可以在ARKitWorldTrackingSessionConfiguration的videoFormat字段中使用它來使用該視頻格式初始化會話。默認情況下,設備上使用盡可能高的分辨率。
打開Assets / UnityARKitPlugin / Examples / ARKit1.5 / UnityARVideoFormats / UnityARVideoFormats.scene查看它是如何使用的。在設備上構建並運行,查看與設備上可用視頻格式相對應的按鈕列表。選擇其中一個按鈕以使用包含所選視頻格式的新配置重置會話:
設置世界原點(Set World Origin)
此更新還介紹了AR Session的功能,以將世界坐標系設置為新的位置和方向。如您所知,在啟動AR Session時,設備的原始位置和方向將用作ARKit世界跟踪的世界坐標系的原點。在某些情況下,您將需要基於某個真實世界參考點重置ARKit世界跟踪的世界坐標系。你可以使用UnityARSessionNativeInterface.GetARSessionNativeInterface()。SetWorldOrigin()並給它一個Unity變換,它將被用作新設置的世界坐標系的原點。
請打開Assets / UnityARKitPlugin / Examples / ARKit1.5 / UnityARSetWorldOrigin / UnityARSetWorldOrigin.scene並構建它來試用它。按下按鈕以“設置世界原點”將使用設備當前世界變換重置世界坐標系。您應該注意到,所有現有的錨點都將更新到相對於世界原點的新位置,但是任何未錨定的虛擬對像都將處於其相對於設備原始世界坐標系的原始位置(它們似乎具有移動)。
點擊測試結果類型(Hit Test Result Types)
為了支持垂直平面的概念和平面的細節幾何,現在在ARHitTestResultType枚舉中還有兩個條目。它們是ARHitTestResultTypeEstimatedVerticalPlane和ARHitTestResultTypeExisting PlaneUsingGeometry。有關這些的描述,請參閱ARHitTestResultType.cs。
前進並發展
這些是ARKit在本更新中發布的一些有趣的新功能。有關這些功能的更多信息,請諮詢Apple的ARKit文檔。請利用使用Unity ARKit插件的簡單性來改善您的ARKit應用程序的這些新功能。期待看到您的更新!請記住,此更新仍處於測試階段,因此您必須等待此更新的發布才能將更新的應用發佈到AppStore。查詢應該指向我們的論壇。