- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在运行时将 UIImage 保存到 AR 资源组中,以便之后检测它。您可以使用 referenceImagesInGroupNamed:bundle: 阅读该组,但没有说明如何编写它。
我正在尝试以下操作:
//step 1: list all reference images
print("BEFORE = ", ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) ?? "None")
//step 2: take snapshot
let snapshot = self.viewController?.sceneView.snapshot()
//optional crops and image processing here
//step 3: add shapshot to bundle
let referenceImage = ARReferenceImage(snapshot.cgImage, orientation: CGImagePropertyOrientation.up, physicalWidth: someComputedPhysicalWidth)
// ??
//step 4: list all reference images and ensure new one is added
print("AFTER = ", ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) ?? "None")
//step 5: relaunch session if intempted to redirect it now
sceneView.session.pause()
configuration.detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)!
sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
关闭应用程序后,存储在组中的内容会被保存吗?我可以删除其中的内容吗?如果无法进行写访问,我想我可以将创建的 referenceImage 参数保存在某处并在需要时重建 referenceImage?
最佳答案
您无法在运行时修改默认文件夹的内容,但您可以即时创建图像并在以后访问它们。
要动态创建图像,您可以使用以下方法:
为了保持并发性,例如访问任何已保存的快照
,您需要将它们保存到设备,然后再访问它们。
这是一个基本的实现,您可以在其中拍摄 ARSCNView
的快照,然后它们会动态加载它们。
这里的问题(您需要解决)是确定需要以米为单位提供的 ARReferenceImages
的 physicalSize
:
extension ViewController{
//------------------------------------------------
//MARK: Get CIImageProperyOrientation From UIImage
//------------------------------------------------
/// Converts A UIImageOrientation To A CGImagePropertyOrientation
///
/// - Parameter orientation: UIImageOrientation
/// - Returns: CGImagePropertyOrientation
func cgImagePropertyOrientation(_ orientation: UIImageOrientation) -> CGImagePropertyOrientation {
switch orientation {
case .up:
return .up
case .upMirrored:
return .upMirrored
case .down:
return .down
case .downMirrored:
return .downMirrored
case .leftMirrored:
return .leftMirrored
case .right:
return .right
case .rightMirrored:
return .rightMirrored
case .left:
return .left
}
}
//---------------------
//MARK: File Management
//---------------------
/// Returns The Documents Directory
///
/// - Returns: URL
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
}
extension ViewController: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
guard let currentImageAnchor = anchor as? ARImageAnchor else { return }
//2. Get The Targets Name
let name = currentImageAnchor.referenceImage.name!
//3. Get The Targets Width & Height
let width = currentImageAnchor.referenceImage.physicalSize.width
let height = currentImageAnchor.referenceImage.physicalSize.height
//4. Log The Reference Images Information
print("""
Image Name = \(name)
Image Width = \(width)
Image Height = \(height)
""")
//5. Create A Plane Geometry To Cover The ARImageAnchor
let planeNode = SCNNode()
let planeGeometry = SCNPlane(width: width, height: height)
planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
planeNode.opacity = 0.25
planeNode.geometry = planeGeometry
//6. Rotate The PlaneNode To Horizontal
planeNode.eulerAngles.x = -.pi/2
//7. The Node Is Centered In The Anchor (0,0,0)
node.addChildNode(planeNode)
//8. Create AN SCNBox
let boxNode = SCNNode()
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
//9. Create A Different Colour For Each Face
let faceColours = [UIColor.red, UIColor.green, UIColor.blue, UIColor.cyan, UIColor.yellow, UIColor.gray]
var faceMaterials = [SCNMaterial]()
//10. Apply It To Each Face
for face in 0 ..< 5{
let material = SCNMaterial()
material.diffuse.contents = faceColours[face]
faceMaterials.append(material)
}
boxGeometry.materials = faceMaterials
boxNode.geometry = boxGeometry
//11. Set The Boxes Position To Be Placed On The Plane (node.x + box.height)
boxNode.position = SCNVector3(0 , 0.05, 0)
//12. Add The Box To The Node
node.addChildNode(boxNode)
}
}
class ViewController: UIViewController {
//1. Create A Reference To Our ARSCNView In Our Storyboard Which Displays The Camera Feed
@IBOutlet weak var augmentedRealityView: ARSCNView!
//2. Create Our ARWorld Tracking Configuration
let configuration = ARWorldTrackingConfiguration()
//3. Create Our Session
let augmentedRealitySession = ARSession()
//4. Create An Array To Store Our Reference Images
var customReferenceImages = [ARReferenceImage]()
//5. Create An Identifier So We Can Create A Unique Name For Each Image
var identifier = 0
//--------------------
//MARK: View LifeCycle
//--------------------
override func viewDidLoad() {
setupARSession()
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//--------------------------------
//MARK: Creation Of Dynamic Images
//--------------------------------
/// Saves The Snapshot Of An ARSCNView
@IBAction func saveScreenShot(){
//1. Create A Snapshot Of The ARView
let screenShot = self.augmentedRealityView.snapshot()
//2. Convert It To A PNG
guard let imageData = UIImagePNGRepresentation(screenShot) else { return }
//3. Store The File In The Documents Directory
let fileURL = getDocumentsDirectory().appendingPathComponent("custom\(identifier).png")
//4. Write It To The Documents Directory & Increase The Identifier
do {
try imageData.write(to: fileURL)
identifier += 1
} catch {
print("Error Saving File")
}
//5. Load The Custom Images
loadCustomImages()
}
/// Loads Any Custom Images From The Documents Directory & Appends Them To A Custom [ARReferenceImage]
func loadCustomImages(){
//1. Get Reference To The NSFileManager
let fileManager = FileManager.default
//2. Get The URL Of The Documents Directory
let documentsDirectory = getDocumentsDirectory()
do {
//a. Get All Files In The Documents Directory
let fileURLs = try fileManager.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil)
//b. Loop Through Them And If The Path Contains Our Custom Prefix Then Convert To CGImage & Then ARReference Image
for file in fileURLs{
if file.lastPathComponent.hasPrefix("custom"){
if let arImage = UIImage(contentsOfFile: file.path), let arCGImage = arImage.cgImage{
/* Here You Will Need To Work Out The Pysical Widht Of The Image In Metres */
let widthInCM: CGFloat = CGFloat(arCGImage.width) / CGFloat(47)
let widthInMetres: CGFloat = widthInCM * 0.01
let arReferenceImage = ARReferenceImage(arCGImage,
orientation: cgImagePropertyOrientation(arImage.imageOrientation),
physicalWidth: widthInMetres)
arReferenceImage.name = file.lastPathComponent
customReferenceImages.append(arReferenceImage)
}
}
}
} catch {
print("Error Listing Files \(documentsDirectory.path): \(error.localizedDescription)")
}
//3. Set Our ARSession Configuration Detection Images
configuration.detectionImages = Set(customReferenceImages)
augmentedRealitySession.run(configuration, options: [.resetTracking, .removeExistingAnchors ])
}
//---------------
//MARK: ARSession
//---------------
/// Sets Up The ARSession
func setupARSession(){
//1. Set The AR Session
augmentedRealityView.session = augmentedRealitySession
//2. Conifgure The Type Of Plane Detection
configuration.planeDetection = []
//3. If In Debug Mode Show Statistics
#if DEBUG
augmentedRealityView.showsStatistics = true
#endif
//4. Run The Session
augmentedRealitySession.run(configuration, options: [.resetTracking, .removeExistingAnchors])
augmentedRealityView.delegate = self
}
}
这个例子从实用的角度和一个快速的模型来看效果很好,尽管正如我所指出的,您需要了解如何正确确定动态创建的引用图像等的大小:
希望对你有帮助
关于swift - 在 AR 资源组中保存 ARKit 屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236422/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!