ios - 来自 .dae 的具有视频纹理的 SCNNode 不规则平面

标签 ios 3d augmented-reality arkit texture-mapping

我有一个不是 SCNPlane 的 3d 平面。它是一个来自 .dae 的 SCNNode

那是因为不规则的平面不是完美的矩形。 我想应用视频 (.mp4) 作为与平面几何形状相匹配的纹理。我已经能够将视频加载为 SCNPlane 的纹理,但那是在我决定使用自定义 3d 对象之前。

如果我将视频纹理应用于我的新自定义几何体.. 视频不适合该几何体。

任何想法什么是正确的方法?视频加载并显示..但全部倾斜并且与形状不正确匹配。

    let videoNode = SKVideoNode(avPlayer: self.theVideoPlayer)
    videoNode.play()
    let skScene = SKScene(size: CGSize(width: 4096, height: 720))
    skScene.addChild(videoNode)
    videoNode.position = CGPoint(x: skScene.size.width/2, y: skScene.size.height/2)
    videoNode.size = skScene.size
    //NodeTree: SKScene -> SKVideoNode

    let baseUrl = "art.scnassets/"
    let sceneUrl = baseUrl + "wallPlane/wallPlane.scn"
    let modelScene = SCNScene(named: sceneUrl)!
    let wallPlaneNode = modelScene.rootNode.childNodes.first! as SCNNode


    wallPlaneNode.geometry!.firstMaterial?.diffuse.contents = skScene
    wallPlaneNode.geometry!.firstMaterial?.isDoubleSided = true

    return wallPlaneNode

enter image description here

最佳答案

首先,您不需要复杂的 SKVideoNode > 正确定位 > SKScene > 正确调整大小 > 分配给 Material 舞来在 SceneKit 中做视频。从 iOS 11 开始,您可以将 AVPlayer 指定为 Material 属性的内容,它会自动映射以填充纹理坐标空间。 (不要讨厌 AVPlayer。)

但是,您仍然需要确保几何体上的纹理坐标已设置,以便纹理的一次重复可以填充所需的尽可能多的表面。有两种方法可以做到这一点:

  1. 在任何生成几何体的软件中,设置纹理映射(也称为 UV 生成),使原点 0,0 位于您想要视频的面部的一个角上,1,1 位于另一个角上。

  2. 在您的 SceneKit Material 属性上使用 contentsTransform 来拉伸(stretch)或收缩纹理坐标空间,直到您的纹理符合您喜欢的方式。 (您可以通过在 Xcode 场景编辑器中反复试验,将视频中的静止帧作为虚拟内容来完成此操作。)

关于ios - 来自 .dae 的具有视频纹理的 SCNNode 不规则平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51488899/

相关文章:

iphone - 附近地点查找 Google MAP SDK

objective-c - Apple Maps Callout Accessory Control Taped 永不触发

圆柱轴上的 Matlab 3D 图

opengl - glm::lookAt 返回具有 nan 元素的矩阵

ios - 有没有方便的iOS AR SDK可用?

ios - 以编程方式将 UiView 作为 subview

objective-c - 接口(interface)定义在ios示例代码中重复

javascript - 对HTML5 Youtube视频的3D转换

swift - 无法将 3D 模型作为 SCNGeometry 提供给 MDLMesh 容器

swift - ARKit – eulerAngles of Transform Matrix 4x4