didBeginContact委托方法未触发以进行ARKit冲突检测 [英] didBeginContact delegate method not firing for ARKit collision detection

查看:79
本文介绍了didBeginContact委托方法未触发以进行ARKit冲突检测的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法启动didBeginContact方法,我已经尝试了一段时间,但我无法发现错误,可以使用新的方法:

I can't get the didBeginContact method to fire, I have been trying for a while and I can't spot the error, could use a fresh set of eyes:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.lastRender = nil;
    self.accelX = 0.0;
    self.accelY = 0.0;
    self.accelZ = 0.0;
    self.isLooping = TRUE;
    self.tripWire = TRUE;
    self.lastPaddleNode = [[SCNNode alloc] init];

    self.paddleNode = [[SCNNode alloc] init];
    SCNPlane* paddlePlane = [SCNPlane planeWithWidth:0.067056 height:0.138176];
    self.paddleNode.geometry = paddlePlane;
    self.paddleNode.geometry.firstMaterial.diffuse.contents = [UIColor colorWithRed:133.0/255.0f green:158.0/255.0f blue:122.0/255.0f alpha:0.8];
    self.paddleNode.simdTransform = matrix_identity_float4x4;
    self.paddleNode.name = @"paddle";

    SCNPhysicsBody* paddlePhys = [[SCNPhysicsBody alloc] init];
    paddlePhys.type = SCNPhysicsBodyTypeDynamic;
    paddlePhys.physicsShape = [SCNPhysicsShape shapeWithGeometry:paddlePlane options:nil];
    //paddlePhys.affectedByGravity = FALSE;
    paddlePhys.categoryBitMask = SCNPhysicsCollisionCategoryAll;
    paddlePhys.collisionBitMask = SCNPhysicsCollisionCategoryAll;
    paddlePhys.contactTestBitMask = SCNPhysicsCollisionCategoryAll;
    paddlePhys.usesDefaultMomentOfInertia = TRUE;
    self.paddleNode.physicsBody = paddlePhys;

    SCNNode* ball = [[SCNNode alloc] init];
    SCNPhysicsBody* phys = [[SCNPhysicsBody alloc] init];
    phys.type = SCNPhysicsBodyTypeDynamic;
    SCNSphere* sphere = [SCNSphere sphereWithRadius:0.067f];
    phys.physicsShape = [SCNPhysicsShape shapeWithGeometry:sphere options:nil];
    ball.geometry = sphere;
    ball.geometry.firstMaterial.diffuse.contents = [UIColor yellowColor];
    //phys.affectedByGravity = FALSE;
    phys.categoryBitMask = SCNPhysicsCollisionCategoryAll;
    phys.collisionBitMask = SCNPhysicsCollisionCategoryAll;
    phys.contactTestBitMask = SCNPhysicsCollisionCategoryAll;
    phys.usesDefaultMomentOfInertia = TRUE;
    phys.velocityFactor = SCNVector3Make(10.0, 10.0, 10.0);
    ball.physicsBody = phys;
    ball.physicsBody.continuousCollisionDetectionThreshold = 0.134f;
    ball.simdPosition = simd_make_float3(0.0, 0.27, -0.27);
    ball.name = @"ball";
    //phys.velocityFactor = SCNVector3Make(10, 10, 10);

    [self.sceneView setPreferredFramesPerSecond:60];

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    // Set the view's delegate
    self.sceneView.delegate = self;

    // Show statistics such as fps and timing information
    self.sceneView.showsStatistics = YES;

    //phys.velocityFactor = SCNVector3Make(10, 10, 10);

    // Create a new scene
    SCNScene* scene = [[SCNScene alloc] init];
    scene.physicsWorld.contactDelegate = self;
    self.sceneView.scene = scene;

    [locationManager startUpdatingHeading];

    while(!(self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 359)) {

        NSLog(@"heading: %f", self.locationManager.heading.trueHeading);

        if (self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 359) {
            break;
        }
    }

    [self.sceneView.scene.rootNode addChildNode:self.paddleNode];
    [self.sceneView.scene.rootNode addChildNode:ball];

    [self startUpdates];
}

我现在要写的只是当我的游戏中的两个节点发生碰撞时触发的委托方法:

All I am trying to do write now is the delegate method to fire when the two nodes in my game collide:

- (void)physicsWorld:(SCNPhysicsWorld *)world didBeginContact:(SCNPhysicsContact *)contact {
    NSLog(@"in didBeginContact");
    CollisionCategory contactMask =
        contact.nodeA.physicsBody.categoryBitMask | contact.nodeB.physicsBody.categoryBitMask;

    // first, sort out what kind of collision
    if (contactMask == (CollisionCategoryPaddle | CollisionCategoryBall)) {
        // next, sort out which body is the missile and which is the rocket
        // and do something about it
        if (contact.nodeA.physicsBody.categoryBitMask == CollisionCategoryPaddle) {
            NSLog(@"nodeA is paddle!");
            //[self hitRocket:contact.nodeB withMissile:contact.nodeA];
        } else {
            NSLog(@"nodeB is paddle!");
            //[self hitRocket:contact.nodeA withMissile:contact.nodeB];
        }
    }
}

注意 我知道我正在使用SCNPhysicsCollisionCategoryAll,然后在方法中检查其他类型的位掩码.那不是我的问题,我的问题是在那之前,我从未见过此日志语句,这是我的didBeginContact委托方法的第一行:

Note I am aware that I am using SCNPhysicsCollisionCategoryAll and then checking for a different kind of bitmask in the method. That is not my problem, my problem is before that, I never see this log statement, which is the first line in my didBeginContact delegate method:

NSLog(@"in didBeginContact");

为什么我的方法不触发?我想我正确设置了代表.谢谢.

Why isn't my method firing? I think I set the delegate correctly. Thanks.

更新 根据评论者的建议,我的viewDidLoad现在看起来像这样:

UPDATE My viewDidLoad looks like this now, per commenter's suggestion:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Create a new scene
    SCNScene* scene = [[SCNScene alloc] init];
    scene.physicsWorld.contactDelegate = self;
    self.sceneView.scene = scene;
    // Set the view's delegate
    self.sceneView.delegate = self;

    SCNPlane* paddlePlane = [SCNPlane planeWithWidth:0.067056 height:0.138176];
    self.paddleNode = [SCNNode nodeWithGeometry:paddlePlane];
    self.paddleNode.geometry.firstMaterial.diffuse.contents = [UIColor colorWithRed:133.0/255.0f green:158.0/255.0f blue:122.0/255.0f alpha:0.8];
    self.paddleNode.simdTransform = matrix_identity_float4x4;
    self.paddleNode.name = @"paddle";
    [self.sceneView.scene.rootNode addChildNode:self.paddleNode];

    SCNPhysicsBody* paddlePhys = [[SCNPhysicsBody alloc] init];
    paddlePhys.type = SCNPhysicsBodyTypeDynamic;
    paddlePhys.physicsShape = [SCNPhysicsShape shapeWithGeometry:self.paddleNode.geometry options:@{SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeBoundingBox}];
    //paddlePhys.affectedByGravity = FALSE;
    paddlePhys.categoryBitMask = SCNPhysicsCollisionCategoryAll;
    paddlePhys.collisionBitMask = SCNPhysicsCollisionCategoryAll;
    paddlePhys.contactTestBitMask = SCNPhysicsCollisionCategoryAll;
    //paddlePhys.usesDefaultMomentOfInertia = TRUE;
    self.paddleNode.physicsBody = paddlePhys;

    SCNNode* ball = [[SCNNode alloc] init];
    [self.sceneView.scene.rootNode addChildNode:ball];

    SCNPhysicsBody* phys = [[SCNPhysicsBody alloc] init];
    phys.type = SCNPhysicsBodyTypeDynamic;
    SCNSphere* sphere = [SCNSphere sphereWithRadius:0.067f];
    phys.physicsShape = [SCNPhysicsShape shapeWithGeometry:sphere options:@{SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeConvexHull}];
    ball.geometry = sphere;
    ball.geometry.firstMaterial.diffuse.contents = [UIColor yellowColor];
    //phys.affectedByGravity = FALSE;
    phys.categoryBitMask = SCNPhysicsCollisionCategoryAll;
    phys.collisionBitMask = SCNPhysicsCollisionCategoryAll;
    phys.contactTestBitMask = SCNPhysicsCollisionCategoryAll;
    phys.usesDefaultMomentOfInertia = TRUE;
    phys.velocityFactor = SCNVector3Make(10.0, 10.0, 10.0);
    ball.physicsBody = phys;
    ball.physicsBody.continuousCollisionDetectionThreshold = 0.134f;
    ball.simdPosition = simd_make_float3(0.0, 0.27, -0.27);
    ball.name = @"ball";

    //phys.velocityFactor = SCNVector3Make(10, 10, 10);

    // Show statistics such as fps and timing information
    self.sceneView.showsStatistics = YES;

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingHeading];

    while(!(self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 358)) {

        NSLog(@"heading: %f", self.locationManager.heading.trueHeading);

        if (self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 358) {
            break;
        }
    }

    [self.sceneView setPreferredFramesPerSecond:60];

    self.lastRender = nil;
    self.accelX = 0.0;
    self.accelY = 0.0;
    self.accelZ = 0.0;
    self.isLooping = TRUE;
    self.tripWire = TRUE;
    self.lastPaddleNode = [[SCNNode alloc] init];

    [self startUpdates];
}

我确实同意评论者的意见,这可能是这里的订购方式存在问题,我只是看不到它是什么... helllppp,我是droowwnnninng ...

I do agree with the commenter that this is probably a problem with how things are ordered here, I just can't see what it is...helllppp, I'm droowwnnninng...

更新 我按如下方式更改了按位掩码,因为我只有两个对象,所以未使用自定义枚举类型,因此我认为我只能使用...All...Default,但它不能像这样工作.当我了解按位AND运算时,如果有人可以向我解释左手/右手部分,以及如何进行操作,我将尝试自定义枚举类型.

UPDATE I changed my bitwise masks as follows, I didn't use a custom enum type because I only have two objects, so I think I can just use ...All and ...Default, but it isn't working like this. I will try custom enum type when I understand the bitwise AND operation, if someone could explain to me the left handed/right handed part, and how to do the operation?

//Paddle
paddlePhys.categoryBitMask = SCNPhysicsCollisionCategoryDefault;
paddlePhys.collisionBitMask = SCNPhysicsCollisionCategoryAll;
paddlePhys.contactTestBitMask = SCNPhysicsCollisionCategoryAll;

...

//Ball
phys.categoryBitMask = SCNPhysicsCollisionCategoryAll;
phys.collisionBitMask = SCNPhysicsCollisionCategoryDefault;
phys.contactTestBitMask = SCNPhysicsCollisionCategoryDefault;

这行得通吗?我现在还设置了这样的桨板:

Should this work? I also have my paddle set like this now:

paddlePhys.type = SCNPhysicsBodyTypeKinematic;
paddlePhys.physicsShape = [SCNPhysicsShape shapeWithGeometry:self.paddleNode.geometry options:@{SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeBoundingBox}];

我的球是这个

phys.type = SCNPhysicsBodyTypeDynamic;
phys.physicsShape = [SCNPhysicsShape shapeWithGeometry:sphere options:@{SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeConvexHull}];

我现在在一起:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.sceneView.delegate = self;

    // Show statistics such as fps and timing information
    self.sceneView.showsStatistics = YES;

    SCNScene* scene = [[SCNScene alloc] init];

    // Create a new scene
    SCNPlane* paddlePlane = [SCNPlane planeWithWidth:0.067056 height:0.138176];
    paddlePlane.firstMaterial.doubleSided = YES;
    self.paddleNode = [SCNNode nodeWithGeometry:paddlePlane];
    self.paddleNode.geometry.firstMaterial.diffuse.contents = [UIColor colorWithRed:133.0/255.0f green:158.0/255.0f blue:122.0/255.0f alpha:0.8];
    self.paddleNode.simdTransform = matrix_identity_float4x4;
    self.paddleNode.name = @"paddle";

    SCNPhysicsBody* paddlePhys = [[SCNPhysicsBody alloc] init];
    paddlePhys.type = SCNPhysicsBodyTypeKinematic;
    paddlePhys.physicsShape = [SCNPhysicsShape shapeWithGeometry:self.paddleNode.geometry options:@{SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeBoundingBox}];
    //paddlePhys.affectedByGravity = FALSE;
    paddlePhys.categoryBitMask = SCNPhysicsCollisionCategoryDefault;
    paddlePhys.collisionBitMask = SCNPhysicsCollisionCategoryAll;
    paddlePhys.contactTestBitMask = SCNPhysicsCollisionCategoryAll;
    //paddlePhys.usesDefaultMomentOfInertia = TRUE;
    self.paddleNode.physicsBody = paddlePhys;

    self.paddleNode.simdPivot = [self makeTranslationMatrix:0 ty: 0 tz:0.1];

    SCNNode* ball = [[SCNNode alloc] init];

    SCNPhysicsBody* phys = [[SCNPhysicsBody alloc] init];
    SCNSphere* sphere = [SCNSphere sphereWithRadius:0.067f];
    phys.type = SCNPhysicsBodyTypeDynamic;
    phys.physicsShape = [SCNPhysicsShape shapeWithGeometry:sphere options:@{SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeConvexHull}];
    ball.geometry = sphere;
    ball.geometry.firstMaterial.diffuse.contents = [UIColor yellowColor];
    //phys.affectedByGravity = FALSE;
    phys.categoryBitMask = SCNPhysicsCollisionCategoryAll;
    phys.collisionBitMask = SCNPhysicsCollisionCategoryDefault;
    phys.contactTestBitMask = SCNPhysicsCollisionCategoryDefault;
    phys.usesDefaultMomentOfInertia = TRUE;
    phys.velocityFactor = SCNVector3Make(10.0, 10.0, 10.0);
    ball.physicsBody = phys;
    ball.physicsBody.continuousCollisionDetectionThreshold = 0.134f;
    ball.simdPosition = simd_make_float3(0.0, 0.27, -0.27);
    ball.name = @"ball";

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingHeading];

    while(!(self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 358)) {

        NSLog(@"heading: %f", self.locationManager.heading.trueHeading);

        if (self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 358) {
            break;
        }
    }

    [self.sceneView setPreferredFramesPerSecond:60];

    self.lastRender = nil;
    self.accelX = 0.0;
    self.accelY = 0.0;
    self.accelZ = 0.0;
    self.isLooping = TRUE;
    self.tripWire = TRUE;
    self.lastPaddleNode = [[SCNNode alloc] init];

    [scene.rootNode addChildNode:ball];
    [scene.rootNode addChildNode:self.paddleNode];

    scene.physicsWorld.contactDelegate = self;
    self.sceneView.scene = scene;

    [self startUpdates];
}

我还想知道问题是否可能出在CMDeviceMotion事件的块中,这是:

I am also wondering if the problem might be in the block for the CMDeviceMotion events, here is that:

- (void)startUpdates {
    //dispatch_queue_t myQueue = dispatch_queue_create("com.eamon.corona_pong", DISPATCH_QUEUE_SERIAL);
    // Determine the update interval.
    NSTimeInterval updateInterval = 1.0/60.0;
    // Create a CMMotionManager object.
    CMMotionManager *mManager = [(AppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
    if ([mManager isDeviceMotionAvailable] == YES) {
        [mManager setDeviceMotionUpdateInterval:updateInterval];
        // do something appropriate here
        if ([CMMotionManager availableAttitudeReferenceFrames] & CMAttitudeReferenceFrameXTrueNorthZVertical) {

            [mManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical toQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error) {
                //[self handleMotionWrapper:motion];
                [SCNTransaction begin];
                [SCNTransaction setAnimationDuration:0];
                //simd_float4x4 rotateY = [self makeYRotationMatrix:270.0];
                //simd_float4x4 rotate = [self makeXRotationMatrix:270.0];

                simd_float4x4 cameraTrans = self.sceneView.session.currentFrame.camera.transform;

                simd_float4x4 temp = simd_mul(cameraTrans, [self makeYRotationMatrix:270.0]);

                //simd_float4x4 rotated = simd_mul(temp, [self makeYRotationMatrix:135]);

                simd_float4x4 transMatrixMotion = [self makeTranslationMatrix:self.lastPaddleNode.simdPosition.x ty:self.lastPaddleNode.simdPosition.y - 0.1 tz:self.lastPaddleNode.simdPosition.z];

                self.paddleNode.simdPosition = simd_make_float3(simd_mul(simd_make_float4(temp.columns[3][0], temp.columns[3][1], temp.columns[3][2], 1.0), transMatrixMotion));

                self.paddleNode.simdTransform = temp;
                [SCNTransaction commit];

                self.lastPaddleNode = self.paddleNode;
                self.tripWire = FALSE;
            }];
        }
    }
}

我仍在制定运动代码,但是我认为碰撞应该可以进行,即使我还没有完全按照我想要的方向(我只需要将其绕y轴旋转90度,轴,但事实证明这很烦人,但对于碰撞检测来说应该没关系,对吧?)

I'm am still working out the motion code, but I figure the collision should work, even though I don't have the paddle oriented exactly how I want yet (I just need to rotate it 90 degrees around the y-axis, but it is proving to be annoying, but shouldn't matter for collision detection, right?)

另外,关于SCNPlane,我还用firstMaterial属性的doubleSided属性使SCNPlane(桨)变成了双面,但这没有帮助,也许我需要使用浅SCNBox?我之前曾尝试过,但是也许我所做的一些更改意味着如果我用桨和SCNBox而不是双面的SCNPlane进行操作,它将可以正常工作?

Also, what about SCNPlane, I also made my SCNPlane (the paddle) double-sided with the doubleSided attribute of the firstMaterial attribute but it did not help, maybe I need to use a shallow SCNBox? I have tried it before, but maybe some of the changes I have made would mean it would work if I make my paddle and SCNBox instead of a double-sided SCNPlane?

谢谢!

更新 我以为我会分享我的最新尝试,但没有用,但我认为它可能更近,更容易发现问题:

UPDATE I thought I would share my latest attempt, doesn't work but I think it might be closer, might be easier to spot the problem:

typedef NS_OPTIONS(NSUInteger, CollisionCategory)
{
    CollisionCategoryPaddle = 1 << 0,
    CollisionCategoryBall = 1 << 1,
};

- (void)viewDidLoad {
    [super viewDidLoad];

    self.sceneView.delegate = self;

    // Show statistics such as fps and timing information
    self.sceneView.showsStatistics = YES;

    SCNScene* scene = [[SCNScene alloc] init];
    self.sceneView.scene = scene;
    self.sceneView.scene.physicsWorld.contactDelegate = self;
    // Create a new scene
    SCNBox* paddlePlane = [SCNBox boxWithWidth:0.067056 height:0.138176 length:0.01 chamferRadius:0.0];
    paddlePlane.firstMaterial.doubleSided = YES;
    self.paddleNode = [SCNNode nodeWithGeometry:paddlePlane];
    self.paddleNode.geometry.firstMaterial.diffuse.contents = [UIColor colorWithRed:133.0/255.0f green:158.0/255.0f blue:122.0/255.0f alpha:0.8];
    self.paddleNode.simdTransform = matrix_identity_float4x4;
    self.paddleNode.name = @"paddle";

    [self.sceneView.scene.rootNode addChildNode:self.paddleNode];

    SCNPhysicsBody* paddlePhys = [[SCNPhysicsBody alloc] init];
    paddlePhys.type = SCNPhysicsBodyTypeKinematic;
    paddlePhys.physicsShape = [SCNPhysicsShape shapeWithGeometry:self.paddleNode.geometry options:nil];
    //paddlePhys.affectedByGravity = FALSE;
    paddlePhys.categoryBitMask = CollisionCategoryPaddle;
    paddlePhys.collisionBitMask = CollisionCategoryBall;
    paddlePhys.contactTestBitMask = CollisionCategoryBall;
    //paddlePhys.usesDefaultMomentOfInertia = TRUE;
    self.paddleNode.physicsBody = paddlePhys;

    SCNPhysicsBody* phys = [[SCNPhysicsBody alloc] init];
    SCNSphere* sphere = [SCNSphere sphereWithRadius:0.067f];
    self.ballNode = [[SCNNode alloc] init];
    self.ballNode.name = @"ball";
    self.ballNode.geometry = sphere;
    self.ballNode.geometry.firstMaterial.diffuse.contents = [UIColor yellowColor];
    //self.ballNode.physicsBody.continuousCollisionDetectionThreshold = (CGFloat)0.134f;
    self.ballNode.simdPosition = simd_make_float3(0.0, 0.27, -0.27);

    [self.sceneView.scene.rootNode addChildNode:self.ballNode];

    phys.type = SCNPhysicsBodyTypeDynamic;
    phys.physicsShape = [SCNPhysicsShape shapeWithGeometry:self.ballNode.geometry options:nil];
    phys.categoryBitMask = CollisionCategoryBall;
    phys.collisionBitMask = CollisionCategoryPaddle;
    phys.contactTestBitMask = CollisionCategoryPaddle;
    //phys.usesDefaultMomentOfInertia = TRUE;
    //phys.velocityFactor = SCNVector3Make(10.0, 10.0, 10.0);
    self.ballNode.physicsBody = phys;

    //phys.affectedByGravity = FALSE

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingHeading];

    while(!(self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 358)) {

        NSLog(@"heading: %f", self.locationManager.heading.trueHeading);

        if (self.locationManager.heading.trueHeading <= 360 && self.locationManager.heading.trueHeading >= 358) {
            break;
        }
    }

    [self.sceneView setPreferredFramesPerSecond:60];

    self.lastRender = nil;
    self.accelX = 0.0;
    self.accelY = 0.0;
    self.accelZ = 0.0;
    self.isLooping = TRUE;
    self.tripWire = TRUE;
    self.lastPaddleNode = [[SCNNode alloc] init];

    [self startUpdates];
}

我也尝试过这种方法,尽管我不确定我是否使用正确:

I tried this way too, althought I'm not sure if I am using it right:

phys.physicsShape = [SCNPhysicsShape shapeWithGeometry:self.ballNode.geometry options:@{SCNHitTestOptionCategoryBitMask:[NSNumber numberWithUnsignedInt:CollisionCategoryBall], SCNPhysicsTestCollisionBitMaskKey:[NSNumber numberWithUnsignedInt:CollisionCategoryPaddle]}];

推荐答案

1.)将scene添加到sceneView

2.)声明将要用于物理的物体的节点.

2.) Declare the nodes you will be using for the objects you will be giving physics too.

3.)对实例化的对象(颜色等)进行必要的修改.

3.) Make necessary modifications to instantiated objects (color, etc.).

-ATTN STEP 4非常重要-

4.)仅在上述步骤(1、2和3)之后,才将physicsBody详细信息添加到对象! (也称为node.physicsBody.xxx)

4.) Only after above steps (1, 2, and 3) do you add the physicsBody details to the object! (a.k.a node.physicsBody.xxx)

  1. 将节点添加到场景中.

在我看来,SceneKit处理这部分事情的方式很荒谬,需要修改.在尚未将SCNNode添加到场景中的情况下,由于您实例化其属性的顺序而导致花费过多时间:(

In my opinion the way that SceneKit handles this part of things is ridiculous and needs revision. Too many hours spent in a situation where an SCNNode that hasn't even been added to scene yet, is causing problems because of the order your are instantiating it's attributes :(

这篇关于didBeginContact委托方法未触发以进行ARKit冲突检测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆