ios - ARKit 添加 X 翻转的 2D 视频

标签 ios swift scenekit arkit

所以我有以下代码来创建自定义墙

    let wall = SCNPlane(width: CGFloat(distance),
                        height: CGFloat(height))
    wall.firstMaterial = wallMaterial()
    let node = SCNNode(geometry: wall)

    // always render before the beachballs
    node.renderingOrder = -10

    // get center point
    node.position = SCNVector3(from.x + (to.x - from.x) * 0.5,
                               from.y + height * 0.5,
                               from.z + (to.z - from.z) * 0.5)
    node.eulerAngles = SCNVector3(0,
                                  -atan2(to.x - node.position.x, from.z - node.position.z) - Float.pi * 0.5,
                                  0)

现在我在 HitTest 中添加简单的 SCNPlane 并添加视频(skscene)

          // first.node is hittest result 

            let node = SCNNode(geometry: SCNPlane(width: CGFloat(width) , height:  CGFloat(height))
            node.geometry?.firstMaterial?.isDoubleSided = true
            node.geometry?.firstMaterial?.diffuse.contents = self.create2DVideoScene(xScale: first.node.eulerAngles.y < 0 ? -1 : nil)
                         node.position = nodesWithDistance.previous.node.mainNode.position
        
            node.eulerAngles = first.node.eulerAngles

这里是我如何创建二维节点

 /// Creates 2D video scene
    private func create2DVideoScene (xScale:CGFloat?) -> SKScene {
        var videoPlayer = AVPlayer()

        if let validURL = Bundle.main.url(forResource: "video", withExtension: "mp4", subdirectory: "/art.scnassets") {
            let item = AVPlayerItem(url: validURL)
            videoPlayer = AVPlayer(playerItem: item)
        }
        let videoNode = SKVideoNode(avPlayer: videoPlayer)
        videoNode.yScale *= -1
        
        // While debug I observe that if first.node.rotation.y in  - , then we need to change xScale to -1 (when wall draw from right -> left )
        
        if let xScale = xScale {
            videoNode.xScale *= xScale

        }
        
        
        videoNode.play()
        
        let skScene = SKScene(size: self.sceneView.frame.size)
        skScene.scaleMode = .aspectFill
        skScene.backgroundColor = .green
        skScene.addChild(videoNode)
        videoNode.position = CGPoint(x: skScene.size.width/2, y: skScene.size.height/2)
        videoNode.size = skScene.size
        return skScene
    }

问题::如果我从左到右绘制墙节点意味着第一个点在左侧,另一个点在右侧,并在它们之间绘制墙。然后翻转视频。

如果我从右向左绘制意味着第一个点在右侧,第二个点在左侧,然后在它们之间画一条线,那么视频就完全没问题了。

为了解决这个问题,我检查了 wall eulerAngles 检查行 self.create2DVideoScene 但这并不是在现实世界的每个区域都有效

我希望视频不应该在用户面前翻转

编辑

视频翻转是因为 eulerAngles 在创建墙时两种情况下都不同

Angle point1 to point2 --> (0.000000 -1.000000 0.000000 3.735537)

Angle point2 to point1 -- > (0.000000 -1.000000 0.000000 0.478615)


发布视频Click here to play video

请提供此问题的建议或解决方案。

enter image description here

视频翻转

Flipped

最佳答案

我已经解决了临时解决方案的问题,仍在寻找更好的解决方案

问题是墙。当从右向左方向绘制时,墙会翻转到相机的另一侧。我已经通过设置 isDoubleSided = false 并将图像应用为具有文本的漫反射内容来解决这个问题,我可以看到图像本身翻转了。

我试过很多东西,但这个对我有帮助

  1. 归一化向量
  2. 找到 SCNVectors 之间的交叉点
  3. 如果 y > 0 我只是从 Value 交换到 Value

代码

    let normalizedTO = to.normalized()
    let normalizedFrom = from.normalized()
    let angleBetweenTwoVectors = normalizedTO.cross(normalizedFrom)

    var from = from
    var to = to
    if angleBetweenTwoVectors.y > 0 {
        let temp = from
        from = to
        to = temp
    }

// Inside extension of SCNVector3
func normalized() -> SCNVector3 {
    if self.length() == 0 {
        return self
    }

    return self / self.length()
}

func cross(_ vec: SCNVector3) -> SCNVector3 {
        return SCNVector3(self.y * vec.z - self.z * vec.y, self.z * vec.x - self.x * vec.z, self.x * vec.y - self.y * vec.x)
    }

希望对您有所帮助。如果有人知道更好的解决方案,请回答。

关于ios - ARKit 添加 X 翻转的 2D 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53282351/

相关文章:

ios - 按下一个按钮,它就会出现在屏幕的其他地方

ios - 如何使用 Starscream 检查套接字是否已连接?

ios - 如何检测我是否正在访问仅限 iOS6 的方法?

swift - 我可以编写类似于 Encodable 和 Decodable 的协议(protocol)吗?

scenekit - 在 SceneKit 场景图中制作独立的副本

ios - 预填写 UITextView 检测到的电子邮件

ios - 来自调试器 : Terminated due to memory issue While scrolling in UITableView/UICollectionView with gif images Kingfisher Library 的消息

ios - 如何使用 realm.addNotificationBlock?

ios - SCNProgram – 如何将类型为 "mat4"的制服传递给自定义着色器?

swift - 节点不旋转?