我正在为我的应用程序使用ARKit,我尝试从我的web服务器(URL)动态加载.scn文件
这是我的代码的一部分
let urlString = "https://da5645f1.ngrok.io/mug.scn"
let url = URL.init(string: urlString)
let request = URLRequest(url: url!)
let session = URLSession.shared
let downloadTask = session.downloadTask(with: request,
completionHandler: { (location:URL?, response:URLResponse?, error:Error?)
-> Void in
print("location:\(String(describing: location))")
let locationPath = location!.path
let documents:String = NSHomeDirectory() + "/Documents/mug.scn"
ls = NSHomeDirectory() + "/Documents"
let fileManager = FileManager.default
if (fileManager.fileExists(atPath: documents)){
try! fileManager.removeItem(atPath: documents)
}
try! fileManager.moveItem(atPath: locationPath, toPath: documents)
print("new location:\(documents)")
let node = SCNNode()
let scene = SCNScene(named:"mug.scn", inDirectory: ls)
let nodess …Run Code Online (Sandbox Code Playgroud) 我是新来的SceneKit和三维物体.我一直在做一些研究,但我没有找到我的问题的答案.
我需要在水平方向上显示多个3D对象UICollectionView,每个单元格中有一个.我希望它们对齐并且大小相同,所以我希望它们适合父视图,也就是说SCNView.
用于描绘场景的图像:
我希望3D对象的边界在视觉上与SCNView的边界匹配.我希望3D对象在视图中"适合",有点像UIViewContentMode.scaleAspectFit.
到目前为止,这是我的代码:
let scene=SCNScene(named: file_name)
let node=scene.rootNode.childNode(withName: node_name, recursively: true)!
node.scale=SCNVector3Make(28, 28, 28)
node.position=SCNVector3Make(0, 0.05, -0.5)
scene.rootNode.addChildNode(node)
sceneview.scene=scene
Run Code Online (Sandbox Code Playgroud) 设计师提供了三个文件:
我可以成功将.obj文件加载到我的场景中,如下所示:
SCNView * sceneView = [SCNView new];
sceneView.frame = view.bounds;
[view addSubview:sceneView];
SCNScene * scene = [SCNScene sceneNamed:@"models.scnassets/whatever.obj"];
[sceneView setScene:scene];
Run Code Online (Sandbox Code Playgroud)
我正在努力将.jpg和.mtl文件应用于.obj文件.我尝试使用以下代码应用图像,但没有爱:
SCNMaterial * material = [SCNMaterial material];
material.diffuse.contents = [UIImage imageNamed:@"image.jpg"];
SCNNode * materialNode = [SCNNode node];
materialNode.geometry.firstMaterial = material;
[scene.rootNode addChildNode:materialNode];
Run Code Online (Sandbox Code Playgroud) 我尝试在ARKit应用程序中从服务器URL加载动态.scn和纹理文件.我已经通过这种 方式从web url上实现了加载.scn文件..但是在运行后我没有在设备上看到任何纹理.我收到以下错误消息.
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d42e1980 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_DIFFUSE.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d00fe800 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_NORMAL.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d40ff800 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_METALLIC.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d42e0d80 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_ROUGHNESS.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d02e2e00 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_SHADOW.png [0.000000x0.000000]>
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题.谢谢
@ Xartec我已经尝试过你提到的方式,但我没有得到任何回复.我怎么能解决它?
let urlString = "\("https://d533c2fd.ngrok.io/")\("mode")"
let url = URL.init(string: urlString)
let request = URLRequest(url: url!)
let session = URLSession.shared
let downloadTask = session.downloadTask(with: request, …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个玩家可以移动的SceneKit 3D迷宫世界.像跳跃这样的一些动作涉及在几秒钟的时间段内改变观察方向时上下移动相机.在此期间,我想忽略用户的轻击和滑动,这通常会导致其他类型的动作,如转弯和前进.
我可以创建一个匹配跳转持续时间的计时器并设置Bool,但我希望能够以更简单的方式检查摄像机的SCNNode.
有没有一种简单的方法来查看相机的SCNNode是否不再运行SCNAction跳转,所以我可以在其他点按和滑动操作之前添加此逻辑?
或者也许有一个SCNAction可以设置我可以在跳转序列的开始和结束时放置的Bool?
这是我的跳转代码:
let jumpUp: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), jumpHeight), duration: jumpTime)
let jumpAppex: SCNAction = SCNAction.wait(duration: jumpWaitTime)
let fallDown: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), cameraHeight), duration: jumpTime)
var lookDown: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(?), duration: jumpTurnTime)
let noLook: SCNAction = SCNAction.wait(duration: jumpTime*2.0)
var lookBack: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: 0, duration: jumpTurnTime)
switch playerDirection.direction
{
case .south:
lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(southZ), duration: jumpTurnTime)
lookBack = SCNAction.rotateTo(x: …Run Code Online (Sandbox Code Playgroud) 如何设置 2d 视图的 SceneKit SCNCamera属性,例如:
- top view
- bottom view
- front view
- back view
- left side view
- right side view
Run Code Online (Sandbox Code Playgroud) 根据本答案中的建议,目标是向场景添加环境光以及相机的定向光.
这适用于Xcode场景编辑器,定向灯设置为70%白色,环境光设置为50%白色.方向灯的欧拉角使用默认值.
编码这种安排失败了.就好像没有添加定向灯一样.对场景没有影响; 好像只有环境光存在.
x欧拉角分量的不同值没有区别 - 尝试了PI/2,PI和其他值,但仍然没有变化.
但是,将方向光添加到场景的根节点(scene.rootNode.addChildNode(directionalLightNode))确实会将光添加到场景中.
fileprivate func addLightNode() {
// Create ambient light
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.color = UIColor(white: 0.70, alpha: 1.0)
// Add ambient light to scene
scene.rootNode.addChildNode(ambientLightNode)
// Create directional light
let directionalLight = SCNNode()
directionalLight.light = SCNLight()
directionalLight.light!.type = .directional
directionalLight.light!.color = UIColor(white: 1.0, alpha: 1.0)
directionalLight.eulerAngles = SCNVector3(x: 0, y: 0, z: 0)
// Add directional light to camera
let cameraNode …Run Code Online (Sandbox Code Playgroud) 在 Xcode SceneKit 场景检查器中,Procedural Sky该部分下有一个选项Environment。
根据一些教程,启用此选项将为 3D 模型带来更多真实感。
1) 如果您从代码而不是从场景检查器创建场景,如何启用该Procedural Sky选项?没有Environment财产。
2) 该Procedural Sky选项是否仅在使用 PBR 材质时才有效?
有谁知道如何清除 SceneView 3D 对象的背景?我正在尝试使用 UIColor.clear,但它使它变成白色。[
]
import SwiftUI
import SceneKit
struct TestView: View {
var body: some View {
ZStack{
Color.green
SceneView(
scene: {
let scene = SCNScene(named: "Earth.scn")!
scene.background.contents = UIColor.clear
return scene
}(),
options: [.autoenablesDefaultLighting,.allowsCameraControl]
)
.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height/2, alignment: .center)
}
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
Run Code Online (Sandbox Code Playgroud) 目标是增加SCNBox的长度,使其仅在正z方向上生长.
这个答案建议玩pivot房产.
但是,该pivot属性的文档在SCNNode页面上是稀疏的,并且SCNBox页面上没有任何内容.
有人可以解释该pivot物业的运作方式吗?
我正在使用ModelIO演示加载和纹理化.OBJ文件。当我使用本地文件时,下面的代码工作正常。
guard let url = Bundle.main.url(forResource: "myVase", withExtension: "obj") else {
fatalError("Failed to find model file.")
}
let asset = MDLAsset(url:url)
guard let object = asset.object(at: 0) as? MDLMesh else {
fatalError("Failed to get mesh from asset.")
}
Run Code Online (Sandbox Code Playgroud)
但是,当我更改代码以使用Amazon S3 中的文件而不是本地文件时。我收到错误:“无法打开 OBJ 文件”和“无法从资产获取网格。” 这是我的代码:
let url = URL.init(string: "https://s3.amazonaws.com/myObject/.../object.obj")
let asset = MDLAsset(url:url!)
guard let object = asset.object(at: 0) as? MDLMesh else {
fatalError("Failed to get mesh from asset.")
} …Run Code Online (Sandbox Code Playgroud) 当应用程序首先启动时,在一面墙上检测到垂直表面,而不是相机聚焦到第二面墙,在第二面墙上检测到另一个表面。第一面墙现在对 ARCamera 不再可见,但此代码为我提供了第一面墙的锚点。但我需要第二面墙的锚点,现在在相机中可见/聚焦。
if let anchor = sceneView.session.currentFrame?.anchors.first {
let node = sceneView.node(for: anchor)
addNode(position: SCNVector3Zero, anchorNode: node)
} else {
debugPrint("anchor node is nil")
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 MetalKit 并且有一个复杂的渲染管道。结果呈现为MTKView.
现在我想将 的内容提供MTKView给 aSCNScene并使用 aSCNCamera来执行 HDR 等后期处理效果。
这怎么可能?
我不需要一般性的指导。如果可能的话,我想要具体的电话。