- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ARKit,我无法从 SCNScene url 获取下载进度。这是我的代码:
func downloadModel(hitTestResult: ARHitTestResult) {
DispatchQueue.global().async {
// create loading view
// I WANT TO GET DOWNLOAD PROGRESS HERE
let loading = UIAlertController(title: nil, message: "Please wait...\(downloadProgressValueHere)%", preferredStyle: .alert)
let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();
loading.view.addSubview(loadingIndicator)
self.present(loading, animated: true, completion: nil)
// download 3d model from server
let myURL = URL(string: "http://www.mydownloadlink.com")
let scene = try! SCNScene(url: myURL!, options: nil)
let node = (scene.rootNode.childNode(withName: "parentNode", recursively: true))!
self.sceneView.scene.rootNode.addChildNode(node)
// dismiss loading view
loading.dismiss(animated: true, completion: nil)
}
}
如何获取“请稍候...”消息的下载进度?谢谢大家。
最佳答案
据我了解,虽然看起来以下方法会采用远程 URL,但实际上它不会(尽管我可能是错的):
convenience init(url: URL,
options: [SCNSceneSource.LoadingOption : Any]? = nil) throws
无论如何,这里回答您的问题是您的示例(可能有点 OTT,但希望它也能帮助其他人)。
假设我们在以下 URL
处有一个 SCNScene
文件:
http://stackOverflow.com/stackOverFlow.scn
首先我们需要为 ProgressInfo
创建变量,如下所示:
var loading: UIAlertController!
var loadingIndicator: UIActivityIndicatorView!
var downloadString: String = "Downloading"
然后我们要做的是创建一个 URLSession 来下载文件,如下所示:
/// Downloads An SCNFile From A Remote URL
func downloadSceneTask(){
//1. Get The URL Of The SCN File
guard let url = URL(string: "http://stackOverflow.com/stackOverFlow.scn") else { return }
//2. Create The Download Session
let downloadSession = URLSession(configuration: URLSession.shared.configuration, delegate: self, delegateQueue: nil)
//3. Create The Download Task & Run It
let downloadTask = downloadSession.downloadTask(with: url)
downloadTask.resume()
//4. Show The Progress Alert
DispatchQueue.main.async {
self.loading = UIAlertController(title: nil, message: self.downloadString , preferredStyle: .alert)
let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();
self.loading.view.addSubview(loadingIndicator)
self.present(self.loading, animated: true, completion: nil)
}
}
请注意,我创建了一个 variable
caused downloadString
,我们稍后会更改它。
然后我们将引用以下 URLSession 委托(delegate),例如:
class ViewController: UIViewController, URLSessionDelegate, URLSessionDownloadDelegate {
}
对于我们的示例,它将调用以下函数:
第一个跟踪我们的下载进度,您可以在其中处理诸如在 HUD
中显示进度或使用 progressIndicator
之类的事情:
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {
print("Downloaded \(totalBytesWritten) / Of \(totalBytesExpectedToWrite) Bytes")
DispatchQueue.main.async {
self.loading.message = "Downloaded \(totalBytesWritten) / Of \(totalBytesExpectedToWrite) Bytes"
}
}
文件下载完成后处理的第二个:
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
//1. Remove The Loading View
loading.dismiss(animated: true, completion: nil)
//2. Create The Filename
let fileURL = getDocumentsDirectory().appendingPathComponent("stackOverFlow.scn")
//3. Copy It To The Documents Directory
do {
try FileManager.default.copyItem(at: location, to: fileURL)
print("Successfuly Saved File \(fileURL)")
//4. Load The Model
loadModel()
} catch {
print("Error Saving: \(error)")
}
}
请注意,在此方法中,我使用以下函数来检索下载的文件并将其复制到 documents 目录
:
/// Returns The Documents Directory
///
/// - Returns: URL
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
文件下载并复制后,我们 (4) 调用我们的 loadModel 函数
,如下所示:
/// Loads The SCNFile From The Documents Directory
func loadModel(){
//1. Get The Path Of The Downloaded File
let downloadedScenePath = getDocumentsDirectory().appendingPathComponent("stackOverFlow.scn")
do {
//2. Load The Scene Remembering The Init Takes ONLY A Local URL
let modelScene = try SCNScene(url: downloadedScenePath, options: nil)
//3. Create A Node To Hold All The Content
let modelHolderNode = SCNNode()
//4. Get All The Nodes From The SCNFile
let nodeArray = modelScene.rootNode.childNodes
//5. Add Them To The Holder Node
for childNode in nodeArray {
modelHolderNode.addChildNode(childNode as SCNNode)
}
//6. Set The Position
modelHolderNode.position = SCNVector3(0, 0, -1.5)
//7. Add It To The Scene
self.augmentedRealityView?.scene.rootNode.addChildNode(modelHolderNode)
} catch {
print("Error Loading Scene")
}
}
请注意,这是一个非常粗略的示例,不包括检查文件是否存在、缩放等内容,但它应该足以帮助您实现您正在寻找的...
关于ios - 从 SCNScene url 获取下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50018196/
我正在尝试创建一个允许放置 3d 对象的应用程序。我能够编写一些有效的代码,但仅限于几何对象。我需要在一个场景中添加多个 SCNScenes。我该如何实现? 我是如何尝试的: let sceneVie
我正在使用一个共享项目,并花了很多时间将它更新为 Swift 2,所以我想让它正常工作,但不幸的是我有一个运行时错误需要处理。 Storyboard 上没有任何内容,因此一切都是以编程方式完成的。看到
我一直在尝试将 SCNScene 子类化,因为这似乎是保持场景相关逻辑的最佳位置。现在我不确定是否推荐这样做,所以我的第一个问题是——我是否应该将 SCNScene 子类化,如果不是,为什么不呢? 文
我有一个使用 SpriteKit 和发射器粒子 (sks) 的应用程序,我发现它不如 Scene kit 的粒子 (scnp) 真实。所以我希望将它合并到 SKScene 中,但我不确定这是否可能。所
目前,我正在制作有关ARKit的演示。我正在使用两个 3D 对象 .dae 文件。还实现了该对象的旋转,但在这里我遇到了问题,因为对象连续旋转,我们如何只旋转一次? 如何替换屏幕上的这些对象? 我还提
import UIKit import SceneKit class Scene: SCNScene { var cameraPosition = SCNVector3Make(0, 0, 1
我正在尝试创建包含带有纹理的 SCNScene 的 pod,但出现错误: SceneKit Error: Failed loading : C3DImage src:file:///Users/...
我正在尝试用代码更改当前的 sceneNamed,但我的方法似乎有一些问题。首先,新场景将发生变化,但我必须触摸或评价对象才能发生变化。其次,childNodeWithName 似乎根本没有变化!这是
我正在构建一个 ARKit + SceneKit 应用程序,它需要在现实世界中显示模型。每次用户选择一个按钮时,模型都会改变。 我尝试在按下按钮时将新模型加载到节点中,然后将其添加到场景的根节点,但这
感谢这里提供的答案 -- Programmatically create a UIView with color gradient --我可以为我的应用程序的主屏幕背景设置颜色渐变。 在使用 CAGr
我正在使用 ARKit,我无法从 SCNScene url 获取下载进度。这是我的代码: func downloadModel(hitTestResult: ARHitTestResult) {
我正在为我的 IT 任务做一个 ARKit 应用程序,我遵循了位掩码和碰撞指南,我让它工作,但它只适用于一个简单的盒子,而不是我的 3D 模型,所以有没有办法转换将此代码添加到底部的代码还是我做错了什
我想知道我应该如何从实例化的 SceneKit 场景中提取 SCNRenderer。我正在尝试获取位于 SCNRenderer 中的 AVAudioEngine,以便我可以将音频过滤器应用于我的节点。
如何将 off-screen SCNScene 渲染到 UIImage 中? 我知道 SCNView 提供了一个 -snapshot 方法,但不幸的是,它不适用于离屏 View 。 similar q
我正在使用一种非常简单的方法来设置 SKVideoNode 并通过几何体的漫反射内容将其放置在 SCNNode 中。当我这样做时,唯一纹理更新和正确显示视频的时间是相机或节点移动时。当两者都静止时,纹
我正在尝试找到将 SCNScene 与物理表对齐的最佳策略。就像 ARKit 应用程序 WWWFreeRivers . 目前我只是在测试一个简单的平面模型,其尺寸与表格相同。如果我画出 ARKit 检
我正在 SceneKit 中开发一个项目,用户可以更改场景中的对象,并希望能够在用户点击提交按钮时保存场景的状态。在SceneKit的文档中,有一个函数调用write:https://develope
我正在使用 SceneKit 和 ARKit。我用一系列表情符号制作了一个collectionView。现在,我希望用户能够从 collectionView 中选择表情符号,并且当他/她触摸屏幕时,所
我有一个带有相机设置的 SCNScene 子类,我想在所有子类中使用它。 let scene01 = TheSubclassScene() let scene02 = TheSubclassScene
我正在尝试加载目前只有 3 面墙、天花板和地板的场景。我正在加载我在 blender 中创建的场景并正常加载它。但是,具有 SCNBox 几何形状的 SCNNode 会直接掉落。该盒子附有一个动态物理
我是一名优秀的程序员,十分优秀!