1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    // Create Parent/Child constraint
    FBConstraintManager             lConstraintManager;
    HFBConstraint   lConstraint = NULL;

    int i, c = lConstraintManager.TypeGetCount();
    for( i = 0; i < c; i++ )
    {
        if( strstr(lConstraintManager.TypeGetName(i), "Parent/Child") )
        {
            lConstraint = lConstraintManager.TypeCreateConstraint(i);
            break;
        }
    }
   
    if (lConstraint){
        lConstraint->ReferenceAdd( 0, lChildModel );    // here you put your constrained model
        lConstraint->ReferenceAdd( 1, lParentModel );   // here you put your source model

        // Activate constraint
        lConstraint->Active = true;
    }
MoBu Snippets: Parent\Child constraint
Метки:                

21 thoughts on “MoBu Snippets: Parent\Child constraint

  • Пятница Август 28, 2009 на 14:22
    Постоянная ссылка

    не очень понял к чему это?
    этож не Питон.

    кстати как раз сейчас бьюсь на тем каким образом создавать констрейны и назначать объекты в них… было бы полезно еслибы был пример для питона билдеровского.

  • Пятница Август 28, 2009 на 17:40
    Постоянная ссылка

    да это не питон, это OpenReality SDK на с++
    на питоне это будет очень похоже:

    from pyfbsdk import *

    lConstraintManager = FBConstraintManager()
    for index in range(lConstraintManager.TypeGetCount()):
    name = lConstraintManager.TypeGetName(index)
    if (name == «Parent/Child»):
    lConstraint = lConstraintManager.TypeCreateConstraint(index)
    print lConstraint.Name
    del( lConstraint )
    del( lConstraintManager )

    данный скрипт создает Parent/Child констрайнт и выводит на консоль его имя

  • Понедельник Август 31, 2009 на 19:45
    Постоянная ссылка

    почему-то в сцене не появился хотя ошибок вроде не было

    возможно здесь не отображаются табулционный отступы, я вот так писал вроде так же

    from pyfbsdk import *
    lConstraintManager = FBConstraintManager()
    for index in range(lConstraintManager.TypeGetCount()):
    name = lConstraintManager.TypeGetName(index)
    if name == «Parent/Child» :
    lConstraint = lConstraintManager.TypeCreateConstraint(index)

    del( lConstraint )
    del( lConstraintManager )

  • Понедельник Август 31, 2009 на 19:49
    Постоянная ссылка

    а даже если создастся, как дальше назначить на него управляющие объекты,
    например:
    кость управляемая через “Parent/Child” маркером

  • Понедельник Август 31, 2009 на 20:16
    Постоянная ссылка

    да с отступами проблема, можно тогда для Питона новой темой оформить информацию и код пометить тегом соответствующим.
    Теперь по поводу назначения объектов. Смотришь какие есть у данного констрейна группы. Наприме, у Parent/Child имеется группа Constrained object(child) и группа Source(Parent). Так вот в каком они порядке находятся на панели Constraint Settings, в таком они и нумеруются (0,1)
    Дальше
    lConstraint.ReferenceAdd( 0, lBone );
    Данный вызов добавит модель lBone в группу 0, следовательно объект будет приконстрейнен
    lConstraintюReferenceAdd( 1, pModel );
    Данный вызов добавит модель pModel в группу 1, т.е. в качестве парента.
    В констрейне Parent/Child может быть только один child и много парентов, следовательно добавление моделей в группу 1 можно делать несколько раз при необходимости.
    Затем констрейн включается путем выставления его состояния активности
    lConstraint.Active = True

  • Понедельник Август 31, 2009 на 20:19
    Постоянная ссылка

    так у тебя не получилось создать констрейн через питон? а какую версию МоБи используешь?

  • Вторник Сентябрь 1, 2009 на 14:07
    Постоянная ссылка

    да, есть такое дело. Есть маленький нюанс, в функция TypeCreateConstraint создает ограничитель, но не помещает его в список навигатора. Это нужно сделать в ручную
    FBSystem().Scene.Constraints.append(lConstraint)

  • Среда Сентябрь 2, 2009 на 15:20
    Постоянная ссылка

    получилось )
    спасибо большое, теперь смогу облегчать себе жизнь )

  • Вторник Март 16, 2010 на 19:12
    Постоянная ссылка

    Привет еще раз :)
    а не подскажешь как такую же задачу реализовать для
    Relation Constraint’a ?
    не очень пока врубаюсь в философию создания в нем Нод
    как выделить FBBox — из объекта и туда вставить
    ну и вобще как создать Sender и Reciever ы и соеденить их вместе по нужным параметрам??

  • Вторник Март 16, 2010 на 20:16
    Постоянная ссылка

    ага :)
    только стоило мне тебе написать, как сразу че-то получилось )

    правда еще не до конца разобрался как соединять нодки :)

  • Вторник Март 16, 2010 на 20:18
    Постоянная ссылка

    это хорошо что получается… если не разберешься с нодами, пиши

  • Вторник Март 16, 2010 на 20:24
    Постоянная ссылка

    а не подскажешь как залинковать, чтоб мне время не терять? :)

  • Вторник Март 16, 2010 на 20:51
    Постоянная ссылка

    сначала находишь две анимационные ноды, одну на выход, другую на вход. ?скать их можно по имени, например

    mAdd2A = mAddBox2->AnimationNodeInGet()->Nodes.Find(«a»);
    mAdd2B = mAddBox2->AnimationNodeInGet()->Nodes.Find(«b»);
    mAdd2R = mAddBox2->AnimationNodeOutGet()->Nodes.Find(«Result»);

    Затем соединяешь источник с приемником, с помощью функции FBConnect, например вот так

    FBConnect( mDamp2R, mAdd2A );

  • Вторник Март 16, 2010 на 21:04
    Постоянная ссылка

    а почему связь в констрейне не отображается и если его удалить кстати так связь не разрывается

  • Вторник Март 16, 2010 на 21:13
    Постоянная ссылка

    должна отображаться, проверь может какой-то из параметров у тебя не найден ?

    Dst = FindAnimationNode(lBox.AnimationNodeInGet(), ‘a’ )
    Src = FindAnimationNode(lBox.AnimationNodeOutGet(), ‘Result’ )
    if Dst and Src:
    FBConnect(Src, Dst)

    здесь
    def FindAnimationNode( pParent, pName ):
    lResult = None
    for lNode in pParent.Nodes:
    if lNode.Name == pName:
    lResult = lNode
    break
    return lResult

    довольно удобная функция с Area портала

  • Среда Март 17, 2010 на 00:29
    Постоянная ссылка

    может быть я как-то неправильно нахожу этим ноды
    если разложить просто то я примерно так делал
    с учетом того что констрейн уже есть и
    Marker — посылатель
    Marker1 — получатель

    constr = GetConstrByName(«Relation») — моя функция выдающая констрейн по имени

    Marker = constr.Boxes[0].Box —по идее это боксы
    Marker1 = constr.Boxes[1].Box

    SendTrs = Marker.AnimationNodeOutGet().Nodes[0] — здесь посылаю только траслейшн
    RecTrs = Marker1.AnimationNodeInGet().Nodes[0]

    FBConnect(SendTrs , RecTrs )

    и линкова происходит но независимая от констрейн почему-то

  • Среда Март 17, 2010 на 01:49
    Постоянная ссылка

    вот рабочий скрипт (в сцене два бокса-модели и один relation constraint c source, constrained boxes

    from pyfbsdk import *

    lConstraint = FBSystem().Scene.Constraints[0]

    if lConstraint:
    print lConstraint.Name

    lSrc = lConstraint.Boxes[0]
    lDst = lConstraint.Boxes[1]

    if lSrc and lDst:
    print lSrc.Name
    print lDst.Name
    lSrcNode = lSrc.AnimationNodeOutGet().Nodes[0]
    lDstNode = lDst.AnimationNodeInGet().Nodes[0]
    FBConnect ( lSrcNode, lDstNode )

    Только в моем случае если вызывать Nodes[0] соединение будет между вращением и перемещением. У них порядок не одинаковый может быть, лучше по индексу никогда не ссылаться… используй поиск по имени, из функции выше — FindAnimationNode

  • Среда Март 17, 2010 на 15:25
    Постоянная ссылка

    о, кажись получилось :) видимо действительно перепутал где-то вход с выходом

    спасибо большое )

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *