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

SCNNode irregular Plane from .dae with Video Texture

我有一个不是 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

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

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

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

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