我正在使用 AVFoundation 来获取实时摄像机源,将像素处理为 alpha 蒙版图像,然后尝试使用该图像在我的 SKView 中创建碰撞边界。球将从该节点的边界反弹。一种增强现实的东西。
所有 AVFoundation 的东西都可以正常工作。这是我遇到问题的碰撞。由于设置 SKTexture 的成本很高,因此我选择了 SKMutableTexture 来更新物理体。我似乎无法让它工作(没有发生碰撞),但是使用带有静态图像的 SKTexture 效果很好。例如,我在作为开发步骤编写的代码中的其他地方有一个树节点(一个不规则的形状,可以让球弹开)。球从它上面反弹得很好,但它们不会从我的实时视频节点上反弹。SKTexture/SKMutableTexture 和 SKPhysicsBody 对象在两个节点之间是不同的,并且创建方式也不同。
树示例很简单,并使用图像创建它的 SKPhysicsBody:
SKTexture *objTexture = [SKTexture textureWithImageNamed:objImageName];
self.obj.physicsBody = [SKPhysicsBody bodyWithTexture:objTexture size:self.obj.size];
实时视频节点 (self.env) 在 SKScene 中设置如下:
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
self.dots = [@[]mutableCopy];
self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0.0f, 0.0f);
SKPhysicsBody* borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
self.physicsBody = borderBody;
self.physicsBody.friction = 0.0f;
self.env = [[SKSpriteNode alloc]init];
self.env.name = @"env";
self.env.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
self.env.size = self.size;
[self addChild:self.env];
}
}
当处理了新的视频帧时,这由 AVFoundationDelegate 调用。
-(void)updateTextureWithPixels:(uint8_t*)pixel length:(size_t)size{
if(self.envTexture == nil){
self.envTexture = [SKMutableTexture mutableTextureWithSize:self.env.size];
self.env.physicsBody = [SKPhysicsBody bodyWithTexture:self.envTexture alphaThreshold:0.5 size:self.env.size];
self.env.physicsBody.friction = 0.0f;
self.env.physicsBody.restitution = 1.0f;
self.env.physicsBody.linearDamping = 0.0f;
self.env.physicsBody.allowsRotation = NO;
self.env.physicsBody.dynamic = NO;
}
[self.envTexture modifyPixelDataWithBlock:^(void *pixelData, size_t lengthInBytes) {
pixelData = pixel;
NSLog(@"updated texture");
}];
}
添加一个球
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
UITouch* touch = [touches anyObject];
CGPoint touchLocation = [touch locationInNode:self];
self.startPoint = touchLocation;
self.ball = [SKSpriteNode spriteNodeWithImageNamed: @"ball.png"];
self.ball.name = ballCategoryName;
self.ball.position = self.startPoint;
[self.dots addObject:self.ball];
[self addChild:self.ball];
self.ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.ball.frame.size.width/2];
self.ball.physicsBody.friction = 0.0f;
self.ball.physicsBody.restitution = 1.0f;
self.ball.physicsBody.linearDamping = 0.0f;
self.ball.physicsBody.allowsRotation = NO;
}
我已经验证了传递给 updateTexture 的像素是必需的。它们是 BGRA 格式。一组这些 BGRA 将全部为 0x00 或全部为 0xFF,由我的 AVFoundation 类处理。我就是无法让这种可变纹理做任何事情。我真的希望我只是俯瞰一个小环境。
如果您想查看更多代码,请告诉我。