1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Как задать переменную float в position script controller?

Тема в разделе "MAXScript", создана пользователем Александр Андреев 125275, 17 май 2015.

Модераторы: Savin Denis
  1. Александр Андреев

    Александр Андреев Активный участник

    С нами с:
    29.12.2010
    Сообщения:
    56
    Симпатии:
    2
    Баллы:
    7
    Замучился совсем.
    При кое каком условии нужно запомнить положение объекта по оси z.
    Для этого надо создать переменную. Например D.
    Создаю в position script.
    Далее
    D=object.pos.z
    В итоге Ошибка
    Unable to convert 88,345 to point3
    Ага ясно. Тип переменной point3.
    Тогда так
    D=[0,0,object.pos.z]
    Объект берёт и сваливает в эту точку, хотя D ни к чему не привязана.

    Пробовал делать так.
    D=distance a b
    Опять эта же ошибка. Unable to convert 88,345 to point3

    Как тогда делался этот урок. http://www.render.ru/books/show_book.php?book_id=2167
    Там переменная x даже не назначена в скрипте?
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Объясните подробнее. Какое условие? Какой объект? Что вы хотите сделать?
    Объясните подробнее. К какому объекту относится контроллер Postion Script?
    А куда он должен сваливать?
    Что такое a и b? Вам уже ясно: "Тип переменной point3".
    Там же всё написано.
    Переменная x назначена в скрипте.
     
  3. Александр Андреев

    Александр Андреев Активный участник

    С нами с:
    29.12.2010
    Сообщения:
    56
    Симпатии:
    2
    Баллы:
    7
    Имеется группа маркеров. Mocap снимался не на полу а на неровной земле. Иногда маркер пятки и носка проваливаются ниже уровня пола. Задача задать контроллерами положение ступни выше уровня земли, чтобы когда эти маркеры уходили ниже пола, ступня уверенно стояла. Для этого я создал таргеты для этих маркеров. И залинковал кости ступни на них.
    Таргеты повторяют движения маркеров, но не уходят под землю.
    Скрипт таргетов работает хорошо

    if Foot.pos.z>Ground.pos.z
    then
    [Foot.pos.x,Foot.pos.y,Foot.pos.z]
    else
    [Foot.pos.x,Foot.pos.y,Ground.pos.z]

    Однако, на костях ноги висят контроллеры look at на маркеры колена и ноги. То есть при поднятии пола выравнивается ступня, а нога не поднимается. Так как ямки небольшие, это можно компенсировать поднятием левой и правой стороны таза.
    Поэтому таргеты таза должны повторять движения маркеров таза, если пятка и носок ноги не уходит под пол.
    В итоге я написал такой скрипт в script position controller таргета таза.


    f (FootB.pos.z>Ground.pos.z) and (FootF.pos.z>Ground.pos.z)
    then
    ([Pelvis.pos.x,Pelvis.pos.y,Pelvis.pos.z]
    Dist=Pelvis.pos.z)


    else
    [Pelvis.pos.x,Pelvis.pos.y,Dist]


    То есть пока работает условие маркеры ступни выше земли, захватывается z.pos маркера таза в переменную Dist (дистанция до земли)

    Как только маркеры опускаются под пол. Dist уже не расчитывается, а таргет таза замирает в позиции z и двигается только по xy.

    Проблема только в том что макс на меня орёт в строчке.
    Dist=Pelvis.pos.z (переменная не типа point3)
    Пробовал создавать объект проекцию маркера pelvis на земле и расчитывать дистанцию.
    Dist=Pelvis projrction.
    Всё равно орёт.
    Что я делаю не так?

    Зы я так думаю можно сделать по другому после else прописать что-то в духе.
    [Pelvis.pos.x,Pelvis.pos.y,CURRENT.pos.z]
    Только как? Гуглы нивкакую не хотят помогатть
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Можно создать дополнительные объекты dummy с уникальными названиями. Пример:
    Код:
    if (FootB.pos.z>Ground.pos.z) and (FootF.pos.z>Ground.pos.z) then
    (
    dist=getnodebyname "igorznag_dist_dummy";
    if dist==undefined then (dist=dummy(); dist.name="igorznag_dist_dummy")
    dist.pos.z=Pelvis.pos.z
    [Pelvis.pos.x,Pelvis.pos.y,Pelvis.pos.z]
    )
    else
    (
    dist=getnodebyname "igorznag_dist_dummy";
    if dist!=undefined then [Pelvis.pos.x,Pelvis.pos.y,dist.pos.z]
    else [Pelvis.pos.x,Pelvis.pos.y,Pelvis.pos.z]
    )
    Можно создать глобальные переменные persistent с уникальными названиями. Пример:
    Код:
    if (FootB.pos.z>Ground.pos.z) and (FootF.pos.z>Ground.pos.z) then
    (
    persistent global Dist=Pelvis.pos.z
    [Pelvis.pos.x,Pelvis.pos.y,Pelvis.pos.z]
    )
    else if Dist!=undefined then [Pelvis.pos.x,Pelvis.pos.y,Dist]
    else [Pelvis.pos.x,Pelvis.pos.y,Pelvis.pos.z]
     
    Александр Андреев 125275 нравится это.
  5. Александр Андреев

    Александр Андреев Активный участник

    С нами с:
    29.12.2010
    Сообщения:
    56
    Симпатии:
    2
    Баллы:
    7
    Спасибо завтра попробую. Второй вариант выглядит более симпотично. Как проверю отпишусь.
     
  6. Александр Андреев

    Александр Андреев Активный участник

    С нами с:
    29.12.2010
    Сообщения:
    56
    Симпатии:
    2
    Баллы:
    7
    Почему-то объект прыгает в ноль по z.
     
  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Когда объект прыгает в ноль по z?
    Макс выдает какую-нибудь ошибку?
     
  8. Александр Андреев

    Александр Андреев Активный участник

    С нами с:
    29.12.2010
    Сообщения:
    56
    Симпатии:
    2
    Баллы:
    7
    Нет. Просто переменная не получает данные.
    Сделал

    persistent global Dist=Pelvis.pos.z-Ground.pos.z
    print Dist

    В max script listener нули

    Когда маркеры уходят под пол таргет таза сваливает на 0 по z
     
  9. Александр Андреев

    Александр Андреев Активный участник

    С нами с:
    29.12.2010
    Сообщения:
    56
    Симпатии:
    2
    Баллы:
    7
    Удалил переменную из списка вроде заработало. Спасибо большущее.
     
Модераторы: Savin Denis

Поделиться этой страницей