0

我正在使用 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 类处理。我就是无法让这种可变纹理做任何事情。我真的希望我只是俯瞰一个小环境。

如果您想查看更多代码,请告诉我。

4

0 回答 0