SKVideoNode仅在SCNSphere的一小部分上?

10
我正在使用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;将视频呈现在球体左侧,但会拉伸纹理/视频。


也许不是您需要的,但为什么不使用带有透明背景的SKSNode .PNG文件呢?您还可以进行缩放、旋转等操作。 - Omar Gonzalez
1
因为我需要显示视频,而不是图像 @OmarGonzalezRocha - Gerwin
您还可以在应用程序委托中添加一个带有自定义drawRect的常规Cocoa子视图。 - Omar Gonzalez
好奇,您是如何确定球体半径为5的值的? - Alfie Hanssen
@AlfieHanssen 它的尺寸刚刚好,既不太大也不太小,据我所知它可以覆盖每个屏幕,如果太小的话,屏幕的角落会有可见的边框,显示球体的大小。 - Gerwin
1个回答

1
很难具体说明出了什么问题,但我这里有一个可行的解决方案: https://github.com/alfiehanssen/ThreeSixtyPlayer 它使用SKVideoNode来处理单眼和立体全景360度视频。
我注意到你没有设置SKScene的positionanchorPoint,我认为这是必须做的,以便正确定位SKVideoNode(材料)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接