gpt4 book ai didi

swift - 我可以从 Swift 上的 Web 服务器获取 3d 模型吗?

转载 作者:可可西里 更新时间:2023-11-01 00:56:02 26 4
gpt4 key购买 nike

我正在使用 Arkit 开发一个应用程序。我的应用程序中有很多 3D 模型并且尺寸很大。我可以从另一台服务器(外部站点)获取这些模型吗?我是 swift 的新手,我似乎找不到任何关于从网络服务器加载 3d 模型的信息。

在那里更改模型路径是否足够?谢谢

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)
}

所有代码:

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()
]
}

最佳答案

您可以使用这样的 ip 地址从网络服务器加载 scn 文件(我在下面使用了假 ip)

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

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

编辑:

这是一个简单的 Swift PlayGrounds,它从我的 github 存储库中提取一个测试立方体 scn 文件。您只需点击任意位置,立方体就会加载。

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

关于swift - 我可以从 Swift 上的 Web 服务器获取 3d 模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com