最近想把一个老的iOS AR项目迁移到VisionPro上面,一起统筹iOS和visionOS两个版别,可是遇到了一些问题,这里简单总结记载一下:

iOS现在的情况

现在加载3D模型的方法是,在项目目录中有一个Experience.rcproject的文件,是老的AR项目创立时,主动创立的。可以用老的Reality Composer翻开。

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

然后经过以下办法加载Anchor Entity和获取模型的Entity

guard let anchor = try? Experience.loadStick(),
let stickEntity = anchor.findEntity(named: "Stick") else {
    return arView
}

在手机的AR场景下,展示如下:

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

具体AnchorEntity相关的内容可以参阅官方文档:

developer.apple.com/documentati…

developer.apple.com/documentati…

可是,现在遇到一个问题便是这个rcproject文件是经过老的Reality Composer来创立的,用新的Reality Composer Pro根本打不开。即便我现在项目依然可以正常运转,可是假如我想编辑老的模型和场景,就没有办法了。

以下是网上找到相关问题的回答:

最新版别的Xcode(v.15)附带了一个名为Reality Composer Pro 1.0的新原型规划工具,它与之前包含在Xcode 14中的Reality Composer 1.5开发者运用不可互换。两个版别的Xcode都可以与老旧的Reality Composer 1.5运用协同作业。但是,要可以主动将Experience.rcproject文件加载到RealityKit项目中,请运用Xcode 14。在Xcode 15中运用非pro版Reality Composer的场景时,有必要手动导入.rcproject文件。

原文地址:

stackoverflow.com/questions/7…

由于Mac版的Reality Composer是跟着Xcode一起的,所以Xcode 15.2之后就没办法获取老的Reality Composer,只能运用Reality Composer Pro了

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

所以只能硬着头皮,探究如何运用新的Reality Composer Pro在iOS和visionOS上面进行3D内容的制作。

开始运用Reality Composer Pro

1. 创立模型

增加一个圆柱体

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

调整圆柱体的半径

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

修正色彩

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

修正Entity名称为Stick

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

2. 导入模型

2.1. 导入realitycomposerpro项目(只支持visionOS)

项目中的文件

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

加载方法:

首先在,Targets -> Frameworks, Labraries…中增加该RealityComposerPro项目

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

这里有个小知识点,便是,假如app一起面向visionOS和iOS多平台,这里一定要只勾选visionOS。否则就会报错:Building for ‘iphones’, but realitytool only supports [xros, xrsimulator]

解决方案也是可巧刚刚网上有遇到的:

stackoverflow.com/questions/7…

然后就可以在项目中引证该对象

import Milfol
....
var stickEntity = Entity()
do { // Load assets.
    stickEntity = try await Entity(
        named: "Stick",
        in: milfolBundle
    )
} catch {
    fatalError("Failed to load a model asset.")
}

最后看一下模拟器的作用:

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

2.2. 导出成usdz格局,再导入到xcode

导出Entity

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

导出成果

VisionPro开发 - 从Reality Composer 1.5 迁移到 Reality Composer Pro

加载方法:先经过文件名获取到AnchorEntity,由于后续ARView中要运用到,再经过AnchorEntity找到模型的Entity。

guard let anchor = try? Entity.loadAnchor(named: "Milfol") else {
    print("load anchor failed")
    return arView
}
guard let stickEntity = anchor.findEntity(named: "Stick") else {
    print("load entity failed")
    return arView
}

总结

感觉这次visionOS针对AR的晋级兼容性仍是比较差的,老的AR运用假如想移植到visionOS,最好的方案便是重写。假如是新的AR App,或许要优先考虑visionOS,然后再兼容iOS。以下是官方文档的部分引证

要创立一个一起在iOS和visionOS上运转的单一运用,请运用两个平台都可用的技能。虽然在iOS中,ARKit允许你运用多种不同的技能创立你的界面,但在visionOS中,首选的技能是SwiftUI和RealityKit。假如你现在没有运用RealityKit来处理3D内容,请在开始增加visionOS支持之前考虑切换到它。假如你保留在iOS运用中运用旧技能的代码,当迁移到visionOS时,你或许需求运用RealityKit重新创立那些代码。

原文地址:

developer.apple.com/documentati…

总归,在visionOS体系下,现在ARKit的运用仍是很受限的,官方的说法是主要考虑到隐私原因。不要紧,我仍是先把RealityKit再好好学一学吧,感觉这个是未来的运用重点。