如何在 ARkIt2 中将图像包裹在 3d 对象上?

Posted

技术标签:

【中文标题】如何在 ARkIt2 中将图像包裹在 3d 对象上?【英文标题】:How to wrap image over an 3d object in ARkIt2? 【发布时间】:2019-05-20 08:52:45 【问题描述】:

我需要用图像包裹 3d 对象 (scene)。像这样的:

我正在使用以下代码:

let imageMaterial = SCNMaterial()
let image = UIImage(named: "temp_flow_image")
imageMaterial.diffuse.contents = image

let objectScene = SCNScene(named: "art.scnassets/frame.scn")
    let objectNode: SCNNode = objectScene!.rootNode.childNode(withName: "frame", recursively: true)! 
objectNode.geometry?.firstMaterial?.diffuse.contents = imageMaterial

objectNode.position = SCNVector3(0,0,-4)

let scene = SCNScene() // Main scene of the app
self.sceneView.scene = objectScene!

整个过程是这样的:

3d 对象加载为SCNNode,并以编程方式将图像包裹在其周围。我可以看到 3d 对象,但看不到上面的图像。我在这里做错了什么?我们不能务实地编辑scene 的几何部分吗?

我可以将图像环绕在 SCNBoxarkit 中的任何其他预定义形状,但不能使用外部 3d 对象

【问题讨论】:

你试过这样的objectNode.geometry吗?.firstMaterial?.diffuse.contents = UIImage(named: "temp_flow_image") 是的,已经试过了。请检查代码 在 frame.scn 文件中转到材质 -> 属性 -> 阴影,在 sahding 中物理更改为 blinn 能分享一下scn文件的材料属性截图吗 太棒了!!!赞成.. 【参考方案1】:

以下代码正在运行:

self.sceneView.scene.rootNode.enumerateChildNodes  (node, _) in
if(node.name == "box") 
   parentNode = node
   let geometry = parentNode.geometry
   geometry?.firstMaterial?.diffuse.contents = imageToDisplay
   parentNode.position = SCNVector3Make(0, 0, -2.9)
   let boxShape:SCNPhysicsShape = SCNPhysicsShape(geometry: geometry!, options: nil)
            parentNode.physicsBody = SCNPhysicsBody(type: .static, shape: boxShape)
            parentNode.physicsBody?.restitution = 1
        
    

 sceneView.scene.rootNode.addChildNode(parentNode)

我在 Xcode 中创建了scene box

【讨论】:

以上是关于如何在 ARkIt2 中将图像包裹在 3d 对象上?的主要内容,如果未能解决你的问题,请参考以下文章

结合 CoreML 对象检测和 ARKit 2D 图像检测

如何在unity3d中将2d对象导入场景3d

找不到使用 C# 在 openGL 中将纹理应用于 3d 对象的方法

我们如何在反应原生项目中将多个图像合并为单个图像

如何在 Unity3D 中将类对象转换为 JSON 字符串?

如何在屏幕边缘包裹blit?