来自 .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。)
但是,您仍然需要确保已设置几何体上的纹理坐标,以便纹理的一次重复可以填充所需的尽可能多的表面。有两种方法可以做到这一点:
在任何生成几何体的软件中,设置纹理映射(也称为 UV 生成),使原点 0,0 位于您想要视频的面部的一角,1,1 位于另一个角落。
在您的 SceneKit material 属性 上使用 contentsTransform
来拉伸或收缩纹理坐标 space 直到您的纹理符合您喜欢的方式。 (您可以通过在 Xcode 场景编辑器中反复试验,将视频中的静止帧作为虚拟内容来完成此操作。)
我有一个不是 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。)
但是,您仍然需要确保已设置几何体上的纹理坐标,以便纹理的一次重复可以填充所需的尽可能多的表面。有两种方法可以做到这一点:
在任何生成几何体的软件中,设置纹理映射(也称为 UV 生成),使原点 0,0 位于您想要视频的面部的一角,1,1 位于另一个角落。
在您的 SceneKit material 属性 上使用
contentsTransform
来拉伸或收缩纹理坐标 space 直到您的纹理符合您喜欢的方式。 (您可以通过在 Xcode 场景编辑器中反复试验,将视频中的静止帧作为虚拟内容来完成此操作。)