2017-12-30 57 views
1

저는 Arkit으로 응용 프로그램을 만들고 있습니다. 많은 3D 모델이 있고 크기가 내 앱에서 큽니다. 이 모델을 다른 서버 (외부 사이트)에서 가져올 수 있습니까? 저는 신속하게 새로운 제품입니다. 웹 서버에서 3D 모델을로드 할 때 아무것도 찾을 수 없습니다.Swift의 웹 서버에서 3D 모델을 얻을 수 있습니까?

모델 경로를 변경하려면 충분합니까? 이 (내가 아래에 가짜 IP를 사용)처럼 IP 주소와 웹 서버에서 SCN 파일을로드 할 수 있습니다

import UIKit 
import SceneKit 
import ARKit 

class VirtualObject: SCNNode { 

    var modelName: String = "" 
    var fileExtension: String = "" 
    var thumbImage: UIImage! 
    var title: String = "" 

    var viewController: ViewController? 

    override init() { 
     super.init() 
     self.name = "Virtual object root node" 
    } 

    init(modelName: String, fileExtension: String, thumbImageFilename: String, title: String) { 
     super.init() 
     self.name = "Virtual object root node" 
     self.modelName = modelName 
     self.fileExtension = fileExtension 
     self.thumbImage = UIImage(named: thumbImageFilename) 
     self.title = title 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func loadModel() { 
     guard let virtualObjectScene = SCNScene(named: "\(modelName).\(fileExtension)", inDirectory: "Models.scnassets/\(modelName)") else { 
      return 
     } 

     let wrapperNode = SCNNode() 

     for child in virtualObjectScene.rootNode.childNodes { 

      let defaults = UserDefaults.standard 
      wrapperNode.addChildNode(child) 
     } 
     self.addChildNode(wrapperNode) 
    } 

    func unloadModel() { 
     self.removeFromParentNode() 
     for child in self.childNodes { 
       child.removeFromParentNode() 
     } 
    } 

    func translateBasedOnScreenPos(_ pos: CGPoint, instantly: Bool, infinitePlane: Bool) { 

     guard let controller = viewController else { 
      return 
     } 

     let result = controller.worldPositionFromScreenPosition(pos, objectPos: self.position, infinitePlane: infinitePlane) 

     controller.moveVirtualObjectToPosition(result.position, instantly, !result.hitAPlane) 
    } 
} 

extension VirtualObject { 

    static func isNodePartOfVirtualObject(_ node: SCNNode) -> Bool { 
     if node.name == "Virtual object root node" { 
      return true 
     } 

     if node.parent != nil { 
      return isNodePartOfVirtualObject(node.parent!) 
     } 

     return false 
    } 

    static let availableObjects: [VirtualObject] = [ 
     Anatomy() 
    ] 
} 

답변

1

let myURL = NSURL(string: “http://110.151.153.202:80/scnfiles/myfile.scn”) 

let scene = try! SCNScene(url: myURL! as URL, options:nil) 

편집 :

func loadModel() { 
    guard let virtualObjectScene = SCNScene(named: "\(modelName).\(fileExtension)", inDirectory: "Models.scnassets/\(modelName)") else { 
     return 
    } 

    let wrapperNode = SCNNode() 

    for child in virtualObjectScene.rootNode.childNodes { 

     let defaults = UserDefaults.standard 
     wrapperNode.addChildNode(child) 
    } 
    self.addChildNode(wrapperNode) 
} 

모든 코드 주셔서 감사합니다 :

내 github repo에서 테스트 큐브 scn 파일을 가져 오는 간단한 Swift PlayGrounds가 있습니다. 아무 데나 탭하면 큐브가로드됩니다.

import ARKit 
import SceneKit 
import PlaygroundSupport 

class ViewController: NSObject { 

     var sceneView: ARSCNView 
     init(sceneView: ARSCNView) { 
     self.sceneView = sceneView 

     super.init() 

     self.setupWorldTracking() 
     self.sceneView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(ViewController.handleTap(_:)))) 

} 

private func setupWorldTracking() { 
    if ARWorldTrackingConfiguration.isSupported { 
     let configuration = ARWorldTrackingConfiguration() 
     configuration.planeDetection = .horizontal 
     configuration.isLightEstimationEnabled = true 
     self.sceneView.session.run(configuration, options: []) 
    } 
} 

@objc func handleTap(_ gesture: UITapGestureRecognizer) { 
    let results = self.sceneView.hitTest(gesture.location(in: gesture.view), types: ARHitTestResult.ResultType.featurePoint) 
    guard let result: ARHitTestResult = results.first else { 
     return 
    } 

    // pulls cube.scn from github repo 

    let myURL = NSURL(string: "https://raw.githubusercontent.com/wave-electron/scnFile/master/cube.scn") 
    let scene = try! SCNScene(url: myURL! as URL, options: nil) 
    let node = scene.rootNode.childNode(withName: "SketchUp", recursively: true) 
    node?.scale = SCNVector3(0.01,0.01,0.01) 

    let position = SCNVector3Make(result.worldTransform.columns.3.x, result.worldTransform.columns.3.y, result.worldTransform.columns.3.z) 
    node?.position = position 
    self.sceneView.scene.rootNode.addChildNode(node!) 

} 
} 

let sceneView = ARSCNView() 

let viewController = ViewController(sceneView: sceneView) 
sceneView.autoenablesDefaultLighting = true 
PlaygroundPage.current.needsIndefiniteExecution = true 
PlaygroundPage.current.liveView = viewController.sceneView