【问题标题】:How to make sure OBJ model gets shown in right direction?如何确保 OBJ 模型以正确的方向显示?
【发布时间】:2020-01-30 20:35:12
【问题描述】:

我一直忙于制作一个应用程序,以在 swift4 中使用 ARKit 动态显示 OBJ 模型。当前的问题是每当我在应用程序中加载模型时,我都会得到错误的方向。一个模型是颠倒的,另一个是等等...... 以下是该问题的一个示例。如您所见,模型应该围绕 X 轴旋转 90 度,但正如我之前提到的,每个模型都有自己的问题。

有人可以帮我解决这个问题吗?

更新:我正在使用这个框架https://github.com/prolificinteractive/SamMitiAR-iOS 我这样加载模型:

let virtualObject = SamMitiVirtualObject(refferenceNode: SCNReferenceNode.init(url:modelUrl as URL)! , allowedAlignments: [.horizontal])

然后:

virtualObjectLoader.loadVirtualObject(virtualObject) { loadedObject in
        loadedObject.scaleRange = (0.00001)...0.0002

        self.sceneView.currentVirtualObject = loadedObject
        self.sceneView.currentVirtualObject?.contentNode?.opacity = 0

        SceneKitAnimator.animateWithDuration(duration: 0.35, animations: {
            self.sceneView.currentVirtualObject?.contentNode?.opacity = 1
        })

这就是 viewDidLoad

override func viewDidLoad() {

    super.viewDidLoad()
    sceneView.placingMode = .focusNode

    sceneView.samMitiARDelegate = self
    sceneView.isAutoFocusEnabled = false
    sceneView.isLightingIntensityAutomaticallyUpdated = true

    if #available(iOS 12.0, *) {
        sceneView.environmentTexturing = .automatic
        sceneView.lightingEnvironmentContent = nil
        sceneView.baseLightingEnvironmentIntensity = 6

    } else {
        sceneView.environmentTexturing = .none
        sceneView.lightingEnvironmentContent = "art.scnassets/hdr-room.jpg"
        sceneView.baseLightingEnvironmentIntensity = 1.5
    }

    sceneView.initialPreviewObjectOpacity = 0.667
    sceneView.initialPreviewObjectMaxSizeRatio = CGSize(width: 0.667, height: 0.667)
    sceneView.allowedGestureTypes  = [.tap, .pan, .rotation, .pinch]



override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    initializeSamMiti()


}

override func viewDidAppear(_ animated: Bool) {

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Pause the view's AR session.
    sceneView.session.pause()
}

@IBAction func crossButtonDidTouch(_ sender: Any) {
    print("close button got touched")
    dismiss(animated: true, completion: nil)
}


extension ARViewController: SamMitiARDelegate {

/// Example of using delegate for haptic feedback when object was placed
func samMitiViewDidPlace(_ virtualObject: SamMitiVirtualObject) {
    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()
}

/// Example of using delegate for haptic feedback when object scaling is snapped
@objc(samMitiVirtualObject:didSnapToScalingFactor:) func samMitiVirtualObject(_ virtualObject: SamMitiVirtualObject, didSnapToScalingFactor didSnappedToScalingFactor: Float) {
    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()
}

/// Example of using delegate for haptic feedback when scaling to bound
func samMitiVirtualObject(_ virtualObject: SamMitiVirtualObject, didScaleToBound: Float) {
    let generator = UIImpactFeedbackGenerator(style: .light)
    generator.impactOccurred()
}

【问题讨论】:

  • 请编辑您的问题并发布相关代码
  • @Sia,对不起,这不是全部,它是代码 sn-ps。 config 是什么?场景节点的层次结构在哪里?
  • @ARGeo 冷你请让我知道你到底需要什么,然后我可以在平台上找到它。我只是将路径移交给平台,平台就会做它该做的事情。
  • @Sia,向我们展示您的所有代码:renderer() 方法的内容、viewWillAppear() 的内容等...您的代码是用 Xcode 编写的还是来自 Unity(包装 ARKit SDK在 C# 脚本中)?
  • @ArGeo 我刚刚更新了代码

标签: ios swift swift4 augmented-reality arkit


【解决方案1】:

我已经从 GitHub 下载了 SamMiti-iOS Xcode 项目并进行了测试。使用源代码Utah Teapot SamMiti-iOS 应用程序可以正常工作。我认为问题在于您的 3D 模型。

所以你需要在 Xcode 的Scene graph 中打开你的模型并适当地旋转/缩放它。

Project Navigator(左面板)中选择一个模型,然后转到Show the Node inspector(右面板)并围绕 X 轴旋转它。要显示/隐藏Scene Graph View,请使用视口底部的小矩形按钮。

您也可以通过编程方式进行:

private func initializeModel() {

    let virtualObject = SamMitiVirtualObject(refferenceNode: SCNReferenceNode(named: "art.scnassets/nameOfModel.scn")!,
                                          allowedAlignments: [.horizontal])

    // retrieving a model
    let yourModel = scene.rootNode.childNode(withName: "nameOfModelInSceneGraph",
                                          recursively: true)!
    yourModel.rotation.x = -90

    // ....
}

【讨论】:

  • 是的,这适用于茶壶,但客户提供给我们的模型会颠倒显示。寻找模型是obj-mtl模型的事实。如何用 Xcode 旋转它?你能帮我吗?
  • 好吧,我已经完成了如何保存模型。问题是模型应该保存并压缩并上传到服务器上。如果我可以通过 Xcode 手动执行此操作并保存它,那么我有一个解决方案。
  • 你有正确的代码。我应该在哪里找到那里的场景?这是initializeModel()中的self.sceneView吗?
  • 我在 ininitializeModel() 中做了这个 virtualObject.rotation.x = -90 没有成功!
  • @AndyFedo 感谢您的重播,我在下面的链接中发布了一个新问题,请指导我如何才能做到这一点。谢谢提前stackoverflow.com/q/59860657/7642568
猜你喜欢
  • 2015-09-09
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多