ARKit添加X翻转的2D视频 [英] ARKit add 2D Video flipped by X

查看:102
本文介绍了ARKit添加X翻转的2D视频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I have following code to create custom wall

    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并添加视频(视频场景)

And Now I am adding simple SCNPlane on hit test and add video (skscene to it)

          // 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

这是我创建2d节点的方式

Here How I created 2d node

 /// 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
    }

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

Issue :: If I draw wall node from left to right means first point is on left side and other point on right side and draw wall between them. Then Video is flipped.

如果我从右到左绘制,则意味着第一个点在右侧,第二个点在左侧,并且在它们之间画线,那么视频就可以了.

If I draw from right to left means first point is on right side and second point is on left side and draw line between them then video is perfectly fine.

要解决此问题,我检查了墙eulerAngles,检查了self.create2DVideoScene行,但这不适用于现实世界的每个区域

To fix this I checked wall eulerAngles check the line self.create2DVideoScene but this is not working in every area of real world

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

I want video should not be start flipped in front of user

编辑

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

video is flipped because of eulerAngles is different in both case while create a wall

从点1到点2倾斜-> (0.000000 -1.000000 0.000000 3.735537)

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

从点2到点1倾斜-> (0.000000 -1.000000 0.000000 0.478615)

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


发布视频单击此处播放视频

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

Please please provide the suggestion or solution of this issue .

视频已翻转

推荐答案

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

I have fixed issue with temporary solution still looking for a better one

问题在墙上.从右向左绘制时,墙会翻转相机的另一侧.我已经通过设置isDoubleSided = false并通过将图像应用为具有文本的分散内容来弄清楚了,我可以看到图像本身被翻转了.

Issue is of wall. wall is flipped other side of camera when draw from right to left direction. I have figure it out by setting isDoubleSided = false and by applying a image as diffuse contents which has text and I can see that image is flipped itself.

我尝试了很多事情,但这对我有帮助

I have tried many things but this one helps me

  1. 归一化向量
  2. 找到SCNVectors之间的十字架
  3. 如果y> 0,我刚从交换到值

代码

    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)
    }

希望它会有所帮助.如果有人知道更好的解决方案,请回答.

Hope it is helpful. If anyone know better solution please answer it.

这篇关于ARKit添加X翻转的2D视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆