我正在使用SceneKit进行游戏。目前,它有4面墙(4个平面)。我已经设置为在每面墙上播放MP4,并带有一个播放器摄像机对象。代码如下:
self.astralroom = [SCNScene sceneNamed:@"AstralScene.scnassets/AstralWall.scn"];
NSURL *playervideoURL =[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Wall3" ofType:@"mp4"]];
AVPlayerItem *playerItem1 = [AVPlayerItem playerItemWithURL:playervideoURL];
AVPlayerItem *playerItem2 = [AVPlayerItem playerItemWithURL:playervideoURL];
AVPlayerItem *playerItem3 = [AVPlayerItem playerItemWithURL:playervideoURL];
AVPlayerItem *playerItem4 = [AVPlayerItem playerItemWithURL:playervideoURL];
self.wall1player = [AVPlayer playerWithPlayerItem:playerItem1];
self.wall2player = [AVPlayer playerWithPlayerItem:playerItem2];
self.wall3player = [AVPlayer playerWithPlayerItem:playerItem3];
self.wall4player = [AVPlayer playerWithPlayerItem:playerItem4];
SKVideoNode *wallnode = [SKVideoNode videoNodeWithAVPlayer:self.wall1player];
SCNView *scnview = (SCNView*)self.AstralSceneView;
SKScene *wallscene = [SKScene sceneWithSize:CGSizeMake(640, 480)];
wallscene.scaleMode = SKSceneScaleModeFill;
wallnode.position = CGPointMake(wallscene.frame.size.width/2,wallscene.frame.size.height/2);
wallnode.size = wallscene.size;
[wallscene addChild:wallnode];
SCNNode *wallplane1 = [self.astralroom.rootNode childNodeWithName:@"astralwall1" recursively:true];
SCNMaterial *wallmaterial = [SCNMaterial material];
wallmaterial.diffuse.contents = wallscene;
SCNGeometry *g = wallplane1.geometry;
g.materials = @[wallmaterial];
SKVideoNode *wallnode2 = [SKVideoNode videoNodeWithAVPlayer:self.wall2player];
scnview = (SCNView*)self.AstralSceneView;
wallscene = [SKScene sceneWithSize:CGSizeMake(640, 480)];
wallscene.scaleMode = SKSceneScaleModeFill;
wallnode2.position = CGPointMake(wallscene.frame.size.width/2,wallscene.frame.size.height/2);
wallnode2.size = wallscene.size;
[wallscene addChild:wallnode2];
SCNNode *wallplane2 = [self.astralroom.rootNode childNodeWithName:@"astralwall2" recursively:true];
wallmaterial = [SCNMaterial material];
wallmaterial.diffuse.contents = wallscene;
g = wallplane2.geometry;
g.materials = @[wallmaterial];
SKVideoNode *wallnode3 = [SKVideoNode videoNodeWithAVPlayer:self.wall3player];
scnview = (SCNView*)self.AstralSceneView;
wallscene = [SKScene sceneWithSize:CGSizeMake(640, 480)];
wallscene.scaleMode = SKSceneScaleModeFill;
wallnode3.position = CGPointMake(wallscene.frame.size.width/2,wallscene.frame.size.height/2);
wallnode3.size = wallscene.size;
[wallscene addChild:wallnode3];
SCNNode *wallplane3 = [self.astralroom.rootNode childNodeWithName:@"astralwall3" recursively:true];
wallmaterial = [SCNMaterial material];
wallmaterial.diffuse.contents = wallscene;
g = wallplane3.geometry;
g.materials = @[wallmaterial];
SKVideoNode *wallnode4 = [SKVideoNode videoNodeWithAVPlayer:self.wall4player];
scnview = (SCNView*)self.AstralSceneView;
wallscene = [SKScene sceneWithSize:CGSizeMake(640, 480)];
wallscene.scaleMode = SKSceneScaleModeFill;
wallnode4.position = CGPointMake(wallscene.frame.size.width/2,wallscene.frame.size.height/2);
wallnode4.size = wallscene.size;
[wallscene addChild:wallnode4];
SCNNode *wallplane4 = [self.astralroom.rootNode childNodeWithName:@"astralwall4" recursively:true];
wallmaterial = [SCNMaterial material];
wallmaterial.diffuse.contents = wallscene;
g = wallplane4.geometry;
g.materials = @[wallmaterial];
scnview.allowsCameraControl = YES;
scnview.autoenablesDefaultLighting = YES;
scnview.backgroundColor = [UIColor lightGrayColor];
self.camera = [self.astralroom.rootNode childNodeWithName:@"camera" recursively:true];
scnview.scene = self.astralroom;
self.wall1player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.wall1player currentItem]];
[wallnode play];
self.wall2player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.wall2player currentItem]];
[wallnode2 play];
self.wall3player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.wall3player currentItem]];
[wallnode3 play];
self.wall4player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[self.wall4player currentItem]];
[wallnode4 play];
所有这些都按预期进行。问题是当您在房间周围扫描时,我得到了一个空白空间,两堵墙相遇。
当您不直接看角落时,它会消失。
我不确定相机对象上是否有设置或MP4文件中是否有设置。我尝试过将墙延伸到拐角处,但没有任何效果。我可以在角落里贴一个帖子来掩饰它,但我也不太喜欢。这只是Metal的功能还是我缺少什么?
谢谢 汤姆