I want to get the current position shape of the node animated by SCNNode I know presentationNode , and I tried to extract the position shape there, but Luck
Here is my code
SCNNode * pelvis = [_unit childNodeWithName:@"Bip01_Pelvis" recursively:YES]; SCNNode * present = pelvis.presentationNode; SCNVector3 position = [self convertPosition:present.position toNode:self.parentNode];
I have a SCNNode position in rest mode before applying CAAnimation .
How to get properties like position form 'presentationNode'?
Edit
Own sections of the class:
@interface UndeadSimple : RepresentationNode <CAAnimationDelegate> {
Init:
NSString * sceneName = @ZOMBIE; SCNScene *scene2 = [SCNScene sceneNamed:sceneName]; _undead = [SCNNode node]; for(SCNNode * node in scene2.rootNode.childNodes) { [_undead addChildNode:node]; [node removeAllAnimations]; } [_undead setScale:(SCNVector3Make(0.024, 0.02, 0.024))]; [self addChildNode:_undead]; [_undead removeAllAnimations]; _currentAnimation = _idleAnimation; _currAnimationkey = @"resting"; [_undead addAnimation:_currentAnimation forKey:_currAnimationkey];
Animation and event:
SCNAnimationEvent * event2 = [SCNAnimationEvent animationEventWithKeyTime:0.9 block:^(CAAnimation * _Nonnull animation, id _Nonnull animatedObject, BOOL playingBackward) { [self.delegate finishedDeathAnimation]; }]; _death1 = anims.death1.mutableCopy; [_death1 setDelegate:self]; [_death1 setFillMode:kCAFillModeForwards]; _death1.removedOnCompletion = NO; [_death1 setAnimationEvents:@[event2]];
Animation call:
- (void)die { if([_currAnimationkey isEqualToString:@"dead"]) { return; } [_undead removeAllAnimations]; CAAnimation * death = nil; int anim = arc4random_uniform(3); if(anim < 1) { death = _death1; } else if(anim < 2) { death = _death2; } else { death = _death3; } _currAnimationkey = @"dead"; _currentAnimation = death;
}
// Helper Method For Getting A Node Presentation
- (SCNNode *)getSnapNode { SCNNode * repNode = [_undead presentationNode]; _undead.transform = repNode.transform; repNode = _undead.clone; return repNode; }
// When calling the callback and trying to get the position:
- (void)finishedDeathAnimation { SCNPlane * bloodgeometry = [SCNPlane planeWithWidth:4 height:4]; bloodgeometry.firstMaterial.diffuse.contents = [NSImage imageNamed:@"blood"]; SCNNode * bloodNode = [SCNNode node]; [bloodNode setEulerAngles:SCNVector3Make(-M_PI_2, 0, 0)]; bloodNode.geometry = bloodgeometry;
Edit 2
I also tried to simplify it a bit:
another helper method:
// in the undead / unit class
- (SCNVector3)getPosition { SCNNode * repNode = [[_undead childNodeWithName:@"Bip01_Pelvis" recursively:YES] presentationNode]; return repNode.position; }
In callback mode:
- (void)finishedDeathAnimation { position = [_unit getPosition]; NSLog(@"pelvis position %lf,%lf,%lf", position.x, position.y, position.z);