【问题标题】:image is not displaying in scene图像未在场景中显示
【发布时间】:2018-01-29 07:10:30
【问题描述】:

我正在创建一个基于Augmented Reality 的应用程序。我从 Internet 下载了一个 .obj 格式的 3D 对象,并将其转换为 .scn 格式的 Xcode。当我运行应用程序相机启动但图像未添加到场景中。我正在使用 ARKit SceneKitView

import ARKit
import UIKit
class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    addTapGestureToSceneView()
    configureLighting()
}

func configureLighting() {
    sceneView.autoenablesDefaultLighting = true
    sceneView.automaticallyUpdatesLighting = true
}


@IBOutlet weak var sceneView: ARSCNView!


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let configuration = ARWorldTrackingConfiguration()
    sceneView.session.run(configuration)
}


func addBox(x: Float = 0, y: Float = 0, z: Float = 0)
{
    guard let paperPlaneScene = SCNScene(named: "chair_f.scn"),
        let paperPlaneNode = paperPlaneScene.rootNode.childNode(withName: "chair_f",recursively: true)
        else { return }
    paperPlaneNode.position = SCNVector3(x, y, z)
    sceneView.scene.rootNode.addChildNode(paperPlaneNode)
}

func addTapGestureToSceneView() {
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.didTap(withGestureRecognizer:)))
    sceneView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func didTap(withGestureRecognizer recognizer: UIGestureRecognizer) {
    let tapLocation = recognizer.location(in: sceneView)
    let hitTestResults = sceneView.hitTest(tapLocation)
    guard let node = hitTestResults.first?.node else {
        let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
        if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
            let translation = hitTestResultWithFeaturePoints.worldTransform.translation
            addBox(x: translation.x, y: translation.y, z: translation.z)
        }
        return
    }
    node.removeFromParentNode()
}




override func viewWillDisappear(_ animated: Bool) {
    super.viewWillAppear(animated)
    sceneView.session.pause()
}
}
extension float4x4 {
var translation: float3 {
    let translation = self.columns.3
    return float3(translation.x, translation.y, translation.z)
}
}

【问题讨论】:

  • 如果不检查您的代码,我建议您尝试几个不同的对象。在我的第一次测试中,许多 scn 对象根本不起作用。
  • 这个问题有什么更新吗?
  • 没有。还在等

标签: ios swift xcode swift4 arkit


【解决方案1】:

将您的chair_f.scn 文件放在art.scnassets 中并按如下方式访问它,

let scene = SCNScene(named: "art.scnassets/chair_f.scn")!

谢谢。

【讨论】:

  • 没有收到任何错误。运行应用程序后,相机正在显示,当我点击屏幕时没有任何反应
【解决方案2】:

如果您有一个从外部来源获得的动态 .obj 文件,或者您希望将项目中已有的 .obj 文件导入到场景视图中,我建议您将 .obj 转换为 .scn,如下所示:

    import SceneKit.ModelIO

    var downloadedNode = SCNNode()


    func convertToScn(sourceUrl: URL){
    let asset = MDLAsset(url: sourceUrl)

    guard let object = asset.object(at: 0) as? MDLMesh else { return }
    downloadedNode = SCNNode.init(mdlObject: object
    //Do what you require in the application using the downloadedNode. Maybe add to your root node.
    }

像这样使用它:

self.convertToScn(destinationUrl: destinationObjectUrl)

这里的destinationObjectUrl 是你的.scn/.obj 文件所在位置的url。

【讨论】:

  • 下载的节点是什么?
  • SCNNode 类型的变量。
  • 能告诉我怎么申报吗?它向我显示错误未解析的标识符“downloadedNode”
  • 添加到答案中。
  • 函数中的 URL 是什么?
【解决方案3】:

同样的事情发生在我身上,我使用了 .DAE 模型并导出到 SCN 文件对我有用。

【讨论】:

    猜你喜欢
    • 2022-07-10
    • 1970-01-01
    • 2021-08-20
    • 2016-06-28
    • 1970-01-01
    • 2020-02-05
    • 2019-02-11
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多