SceneKit渲染工件

时间:2018-08-10 12:34:13

标签: ios objective-c scenekit metal

我正在使用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];

所有这些都按预期进行。问题是当您在房间周围扫描时,我得到了一个空白空间,两堵墙相遇。

Image of the problem

当您不直接看角落时,它会消失。

Image where the problem does not exist

我不确定相机对象上是否有设置或MP4文件中是否有设置。我尝试过将墙延伸到拐角处,但没有任何效果。我可以在角落里贴一个帖子来掩饰它,但我也不太喜欢。这只是Metal的功能还是我缺少什么?

谢谢 汤姆

0 个答案:

没有答案