2016-11-30 13 views
5

Я хочу, чтобы получить текущее положение узла образуют анимированный SCNNode Я знаю presentationNode, и я попытался извлечь форму позиции, но не LuckSceneKit не получить текущую форму позиции SCNNode Animated 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; 
} 

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]; 

Анимация событие:

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; 

}

// Вспомогательный метод, чтобы получить представление Node

- (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 :(
} 

ответ

1

Редко найти кого-то, как я, все еще верю в Objective C, а не быстро, поэтому я хотел бы предложить полную помощь.

У меня была эта проблема для анимации, экспортированной из Blender в качестве Collada, но ей удалось получить фактическую позицию после нескольких попыток.

Использование presentationNode является правильным способом, но вам нужно получить его от ребенка, пока вы делаете анимацию, например, это, как запустить анимацию для узла. Вызывается _monkey. Обратите внимание, что в последнем кодексе я получил _present От ребенка .presentationNode не от _monkey.presentationNode Также должны быть получены при перечислении не после того, как

поэтому сначала я должен определить

NSNode * _present; 

тогда я играю анимации

[_monkey enumerateChildNodesUsingBlock:^(SCNNode *child, BOOL *stop) 
    { 
     for(NSString *key in child.animationKeys) 
     {    // for every animation key 
      CAAnimation *animation = [child animationForKey:key]; // get the animation 
      animation.usesSceneTimeBase = NO;      // make it system time based 
      animation.repeatCount = FLT_MAX;      // make it repeat forever 
      animation.speed = 0.2; 
      [child addAnimation:animation forKey:key];   // animations are copied upon addition, so we have to replace the previous animation 
     } 
     _present = child.presentationNode; 
    }]; 

Затем под рендером я могу проверить результаты, которые меняются по мере перемещения анимации (также если вы работали с iOS11, вы можете проверить worldPosition, а не позицию, это дает отличные результаты тоже).

- (void)renderer:(id <SCNSceneRenderer>)renderer didSimulatePhysicsAtTime:(NSTimeInterval)time 
{ 
    NSLog(@" Location X:%f Y:%f Z:%f", _present.position.x, _present.position.y, _present.position.z); 

} 

Наконец вот Результаты

Y:-2.505034 Z:4.426160 
2017-10-11 04:42:19.700435+0200 monkey[547:137368] Location X:-5.266642 Y:-2.480119 Z:4.427162 
2017-10-11 04:42:19.720763+0200 monkey[547:137368] Location X:-5.215315 Y:-2.455228 Z:4.428163 
2017-10-11 04:42:19.740449+0200 monkey[547:137346] Location X:-5.163589 Y:-2.430143 Z:4.429171 
2017-10-11 04:42:19.760397+0200 monkey[547:137368] Location X:-5.112190 Y:-2.405216 Z:4.430173 
2017-10-11 04:42:19.780557+0200 monkey[547:137346] Location X:-5.060925 Y:-2.380355 Z:4.431173 
2017-10-11 04:42:19.800418+0200 monkey[547:137342] Location X:-5.008560 Y:-2.355031 Z:4.432024 

Это дает мне хорошие результаты. Надеюсь, это сработает с тобой.

1

Нет анимации, по крайней мере, не в коде, который вы нам показали. Проверьте позицию узла презентации во время воспроизведения анимации, возможно, в renderer:updateAtTime: (см. SCNRendererDelegate).

+0

Я гарантирую, что эта анимация работает, я сделал SCNAnimationEvent, чтобы получить делегат, когда он близок к концу, - и попытался извлечь позицию из узла представления, но он всегда возвращает SCNVectorZero :-( – ColdSteel

+0

. Измените свой вопрос до покажите нам код, который вы на самом деле используете, в том числе код, запускающий анимацию. Время и последовательность этого материала имеют значение, и вы не дали нам многого для продолжения. –

+0

Г-н Хэл, я отредактировал свой вопрос и добавил почти весь соответствующий код – ColdSteel

 Смежные вопросы

  • Нет связанных вопросов^_^