ARKit добавить 2D видео перевернуто X - PullRequest
0 голосов
/ 13 ноября 2018

Итак, у меня есть следующий код для создания пользовательской стены

    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 к нему)

          // 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 узел

 /// 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 :: Если я рисую настенный узел слева направо, это означает, что первая точка находится на левой стороне, а другая точка на правой стороне и рисую стену между ними. Затем видео переворачивается.

Если я рисую справа налево, это означает, что первая точка находится на правой стороне, а вторая точка на левой стороне и рисует линию между ними, тогда видео в порядке.

Чтобы это исправить, я проверил настенный eulerAngles, проверьте линию self.create2DVideoScene, но это работает не во всех областях реального мира

Я хочу, чтобы видео не запускалось перед пользователем

EDIT

видео переворачивается, потому что eulerAngles отличается в обоих случаях при создании стены

Угол от точки 1 до точки 2 -> (0,000000 -1,000000 0,000000 3,735537)

Угол от точки 2 до точки 1 -> (0,000000 -1,000000 0,000000 0,478615)


Выпуск видео Нажмите здесь, чтобы воспроизвести видео

Пожалуйста, предоставьте предложение или решение этой проблемы.

enter image description here

Видео перевернуло

Flipped

1 Ответ

0 голосов
/ 15 ноября 2018

Я исправил проблему с временным решением, которое все еще ищет лучшее

Проблема из-за стены.стена переворачивается с другой стороны камеры, когда рисует справа налево.Я понял это, установив isDoubleSided = false и применив изображение в качестве диффузного содержимого, содержащего текст, и я вижу, что изображение само переворачивается.

Я пробовал много вещей, но этот помогает мне

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

Надеюсь, это полезно.Если кто-нибудь знает лучшее решение, пожалуйста, ответьте на него.

...