Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ARKit添加X翻转的2D视频_Ios_Swift_Scenekit_Arkit - Fatal编程技术网

Ios ARKit添加X翻转的2D视频

Ios ARKit添加X翻转的2D视频,ios,swift,scenekit,arkit,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.ren

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

    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)
现在,我在命中测试中添加了简单的SCNPlane,并添加了视频(skscene)

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

若我从右到左画图,意味着第一个点在右边,第二个点在左边,在它们之间画一条线,那个么视频是完美的

为了解决这个问题,我检查了wall eulerAngles,检查了self.create2DVideoScene一行,但这在现实世界的每个领域都不起作用

我想视频不应该在用户面前开始翻转

编辑

由于创建墙时,两种情况下的
eulerAngles
不同,因此视频被翻转

角度点1到点2-->(0.000000-1.000000 0.000000 3.735537)

角度点2到点1-->(0.000000-1.0000000.0000000.478615)


发布视频

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

视频翻转


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

问题是墙。从右向左绘制时,墙会翻转到摄影机的另一侧。我通过设置isDoubleSided=false,并将图像应用为包含文本的漫反射内容,我可以看到图像本身被翻转

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

  • 规范化向量
  • 找到要转换的交叉点
  • 如果y>0,我只是从和交换到值
  • 代码


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

    请注意,在SceneKit的最新版本中,不需要使用
    SKScene
    SKVideoNode
    。您可以直接将
    AVPlayer
    设置为
    SCNMaterialProperty
    实例的内容。@m谢谢您的评论,我已经尝试过了。我已经直接添加了视频,即AVplayer,但问题是从右->左绘制墙工作正常,但从左->右绘制AVplayer翻转问题是-atan2(to.x-node.position.x,from.z-node.position.z)-Float.pi*0。但是我不明白你说的“从左向右画”和“从右向左画”是什么意思@m语言对不起,我的英语不好,请看我写的第1点和第2点的图片。如果我画点1--->点2视频是正常的。但在同一位置,如果我从点2绘制-->点1视频正在翻转,如图2所示
              // 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
        }
    
        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)
        }