我希望得到一個當前節點位置形成動畫SCNNode
我知道presentationNode
,我試圖獲取位置的形式存在,但沒有運氣SceneKit獲取當前SCNNode位置形式動畫SCNNode
這裏是我的代碼
SCNNode * pelvis = [_unit childNodeWithName:@"Bip01_Pelvis" recursively:YES];
SCNNode * present = pelvis.presentationNode;
SCNVector3 position = [self convertPosition:present.position toNode:self.parentNode];
我所擁有的位置是SCNNode
在CAAnimation
應用之前的「休息」模式中的位置。
如何從'presentationNode'獲取位置等屬性?
編輯
類本身相關部分:
@interface UndeadSimple : RepresentationNode <CAAnimationDelegate>
{
//Animations
SCNNode * _undead;
CAAnimation * _currentAnimation;
NSString * _currAnimationkey;
CAAnimation * _death1;
...
SCNNode * _audioNode;
SCNAudioSource * _deathSource;
SCNAudioPlayer * _player;
}
初始化:
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];
動畫和事件:
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]];
動畫召喚:
- (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方法獲取呈現節點
- (SCNNode *)getSnapNode
{
SCNNode * repNode = [_undead presentationNode];
_undead.transform = repNode.transform;
repNode = _undead.clone;
return repNode;
}
//回撥電話,並得到位置:
- (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;
//Bip01_Pelvis
SCNNode * deadBody = [_unit getSnapNode];
SCNNode * pelvis = [deadBody childNodeWithName:@"Bip01_Pelvis" recursively:YES];
SCNNode * present = pelvis.presentationNode;
SCNVector3 position = [self convertPosition:present.position toNode:self.parentNode];
NSLog(@"pelvis position %lf,%lf,%lf", present.position.x, present.position.y, present.position.z); //Always {0,0,0}
bloodNode.position = SCNVector3Make(position.x, 0.0001, position.z);
[self.parentNode addChildNode:bloodNode];
[self removeFromParentNode];
}
編輯2
我還試圖簡化它有點:
另一個輔助方法:
//在亡靈/單元類
- (SCNVector3)getPosition
{
SCNNode * repNode = [[_undead childNodeWithName:@"Bip01_Pelvis" recursively:YES] presentationNode];
return repNode.position;
}
在回調:
- (void)finishedDeathAnimation
{
position = [_unit getPosition];
NSLog(@"pelvis position %lf,%lf,%lf", position.x, position.y, position.z); //Alway 0,0,0 as well :(
}
我確保你的動畫正在運行,我做了一個SCNAnimationEvent來獲取委託,當它接近尾聲 - 試圖從演示節點提取posion - 但它總是返回SCNVectorZero :-( – ColdSteel
請編輯你的問題到向我們展示您實際使用的代碼,包括啓動動畫的代碼。這些東西的時間安排和順序很重要,您還沒有給我們太多的幫助。 –
Mr. Hal,我編輯了我的問題,幾乎添加了所有相關的代碼 – ColdSteel