【问题标题】:SKVideoNode only on a small part of SCNSphereSKVideoNode 仅在 SCNSphere 的一小部分
【发布时间】:2016-05-30 13:17:54
【问题描述】:

我使用 SKVideoNode 作为我的 360 视频球体的材料,但它只在球体的 xy 正部分呈现视频,我正在从一个 URL 流式传输视频,它是一个 .m3u8 供参考,请参阅- SKVideoNode as texture for SCNSphere 很多人似乎和我有同样的问题

func makeSphere() {

    let sceneView = SCNView(frame: self.view.frame);
    self.view.addSubview(sceneView);

    var screenSize: CGRect = UIScreen.mainScreen().bounds;

    var screenWidth = screenSize.width;
    var screenHeight = screenSize.height;

    sceneView.frame.size.height = screenHeight * 1;
    sceneView.frame.size.width = screenWidth * 1;
    sceneView.center.x = screenWidth * 0.5;

    let scene = SCNScene();
    sceneView.scene = scene;

    sphereGeometry = SCNSphere(radius: 5);

    sphereNode = SCNNode(geometry: sphereGeometry);

    sphereNode.position = SCNVector3(x: 0, y: 0, z: 0);

    sphereGeometry.segmentCount = 55;

    constraint = SCNLookAtConstraint(target: sphereNode);

    let camera = SCNCamera();
    let cameraNode = SCNNode();
    cameraNode.camera = camera;
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 0);

    let light = SCNLight();
    light.type = SCNLightTypeOmni;
    let lightNode = SCNNode();
    lightNode.light = light;
    lightNode.position = SCNVector3(x: 0, y: 0, z: 0);

    cameraNode.constraints = [constraint];

    scene.rootNode.addChildNode(cameraNode);
    scene.rootNode.addChildNode(sphereNode);

    let videoMaterial = SCNMaterial();

    let path = "http://video-url.m3u8";
    let url  = NSURL(string: path);
    let asset = AVURLAsset(URL: url!,options: nil);
    let playerItem = AVPlayerItem(asset: asset);
    let player = AVPlayer(playerItem: playerItem);
    let videoNode = SKVideoNode(AVPlayer: player);

    let size = CGFloat(100.0);
    let spriteScene = SKScene(size: CGSizeMake(size,size));
    videoNode.size.width = size;
    videoNode.size.height = size;
    spriteScene.addChild(videoNode);


    videoMaterial.diffuse.contents = spriteScene;
    videoMaterial.specular.contents = UIColor.redColor();
    videoMaterial.shininess = 1.0;
    videoMaterial.doubleSided = true;

    sphereGeometry.materials = [videoMaterial];
    videoNode.play();

    }

您可以使用上面的代码来重现我的问题,如果它有所不同,当我显示图像时它工作得很好。

编辑

使用videoMaterial.diffuse.contents.transfom(SCNMatrix4MakeScale(0,-1,1));videoMaterial.diffuse.wrapT = SCNWrapMode.Repeat; 会导致视频投影在球体的下半部分,但我只能看到拉伸环,而不是正确显示,而是更改WrapMode 使得iOS 6屏幕只显示一种颜色。

使用videoMaterial.diffuse.contents.transfom(SCNMatrix4MakeScale(1,0,1));videoMaterial.diffuse.wrapT = SCNWrapMode.Repeat; 会在球体左侧渲染视频,但会拉伸纹理/视频。

【问题讨论】:

  • 可能不是您需要的,但为什么不使用具有透明图像 .PNG 的 SKSNode?您还可以缩放旋转等等
  • 因为我需要显示视频,而不是图像@OmarGonzalezRocha
  • 您还可以在 App Delegate 中添加一个带有自定义 drawRect 的常规 Cocoa 子视图
  • 很好奇,你是怎么得出球体半径值 5 的?
  • @AlfieHanssen 它的尺寸刚刚好,不会太大也不会太小,据我所知,它会覆盖每个屏幕,如果屏幕太小,屏幕的角落会有一个可见的边框,显示球体有多大。

标签: ios swift sprite-kit video-streaming skvideonode


【解决方案1】:

很难说具体出了什么问题,但我在这里有一个可行的解决方案:https://github.com/alfiehanssen/ThreeSixtyPlayer

它使用 SKVideoNode 来处理单视场和立体球面 360 度视频。

我确实注意到您没有设置 SKScene 的 positionanchorPoint,我相信您必须这样做才能正确定位 SKVideoNode(材质)。

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多