Render.ru

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

Александр Андреев

Активный участник
Рейтинг
7
#1
Замучился совсем.
При кое каком условии нужно запомнить положение объекта по оси 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 даже не назначена в скрипте?
 

igorznag

Мастер
Рейтинг
103
#2
При кое каком условии нужно запомнить положение объекта по оси z.
Объясните подробнее. Какое условие? Какой объект? Что вы хотите сделать?
Создаю в position script.
Объясните подробнее. К какому объекту относится контроллер Postion Script?
Тогда так
D=[0,0,object.pos.z]
Объект берёт и сваливает в эту точку, хотя D ни к чему не привязана.
А куда он должен сваливать?
Пробовал делать так.
D=distance a b
Опять эта же ошибка. Unable to convert 88,345 to point3
Что такое a и b? Вам уже ясно: "Тип переменной point3".
Как тогда делался этот урок.
Там же всё написано.
Там переменная x даже не назначена в скрипте?
Переменная x назначена в скрипте.
 

Александр Андреев

Активный участник
Рейтинг
7
#3
Имеется группа маркеров. 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]
Только как? Гуглы нивкакую не хотят помогатть
 

igorznag

Мастер
Рейтинг
103
#4
Пробовал создавать объект проекцию маркера pelvis на земле и расчитывать дистанцию.
Можно создать дополнительные объекты 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]
)
То есть пока работает условие маркеры ступни выше земли, захватывается z.pos маркера таза в переменную Dist (дистанция до земли)
Можно создать глобальные переменные 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]
 

Александр Андреев

Активный участник
Рейтинг
7
#6
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]
Почему-то объект прыгает в ноль по z.
 

Александр Андреев

Активный участник
Рейтинг
7
#8
Нет. Просто переменная не получает данные.
Сделал

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

В max script listener нули

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