Render.ru

Constrain point - "замирание" обьекта между двумя управляющими обьектами

moris

Активный участник
Рейтинг
10
#1
Есть у меня два куба и одна сфера, которой по очереди управляют эти кубы через контсрейн поинт - сфера наследует движение то одного куба, то другого. Все сделано по правилам - сфера заключена в группу и именно на группу назначен констрейн. Можно ли сделать так, что когда я переключаю управление одного куба на другой, то сфера не перемещалась? Как это сделать?
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#2
Чисто констрейнтами, я думаю, не получится.. Надо МЕЛ юзать или другие методы
 

Denzil

Мастер
Рейтинг
353
#3
1. создаешь еще одну пустую группу (локотор) под каждым кубиком
2. поит констрейнт этих групп к сфере. Их tx, ty,tz будут давать абсолютный оффсет для поинт констрейнов (основных, между кубиками и группой сферы).
3. остается только их корректно переключать.
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#4
Denzil, если не сложно, выложите, пожалуйста, сценку, я посмотреть хочу
 

alex_alv

Активный участник
Рейтинг
11
#5
Если эти объекты называются pCube1, pCube2 и pSphere1 и все они находятся в мировых координатах (не внутри группы), то можно решить следующим образом:

1) У сферы сделать аттрибут switch типа float. Когда он равен 0 или меньше, сфера повторяет движение первого куба. Когда он равен 1 или больше, то второго. В промежуточных положениях движения усредняются с учетом значения.

2) Для сферы создать экспрешн (как и любое другое решение данной проблемы, будет работать только при анимации вперед, every frame, начиная с первого кадра):

global float $_prevCoordinates[6];
float $sw1,$sw2,$x1,$y1,$z1,$x2,$y2,$z2,$x,$y,$z;

$sw2=clamp(0,1,pSphere1.switch);
$x1=pCube1.translateX;
$y1=pCube1.translateY;
$z1=pCube1.translateZ;
$x2=pCube2.translateX;
$y2=pCube2.translateY;
$z2=pCube2.translateZ;
$x=pSphere1.translateX;
$y=pSphere1.translateY;
$z=pSphere1.translateZ;


$sw1=1.0-$sw2;
if(frame==1)
{
$x=$sw1*$x1+$sw2*$x2;
$y=$sw1*$y1+$sw2*$y2;
$z=$sw1*$z1+$sw2*$z2;
}else
{
$x+=($x1-$_prevCoordinates[0])*$sw1+($x2-$_prevCoordinates[3])*$sw2;
$y+=($y1-$_prevCoordinates[1])*$sw1+($y2-$_prevCoordinates[4])*$sw2;
$z+=($z1-$_prevCoordinates[2])*$sw1+($z2-$_prevCoordinates[5])*$sw2;
}
$_prevCoordinates[0]=$x1;
$_prevCoordinates[1]=$y1;
$_prevCoordinates[2]=$z1;
$_prevCoordinates[3]=$x2;
$_prevCoordinates[4]=$y2;
$_prevCoordinates[5]=$z2;


pSphere1.translateX=$x;
pSphere1.translateY=$y;
pSphere1.translateZ=$z;
 

Denzil

Мастер
Рейтинг
353
#6
Denzil, если не сложно, выложите, пожалуйста, сценку, я посмотреть хочу
Да, без скрипта не обойтись... На нодах - cycle....
Нужно переключать одновременно с подставлением офсетов, а это возможно только через скриптджоб.
на всякий кидаю сценку. сохранить и переименовать в rar.
 

moris

Активный участник
Рейтинг
10
#7
Круто, Denzil! Начал недавно осваивать mel и попытался написать нечто подобное, но результат получился не совсем таким, какой я ожидал - в результате я мог двигать сферу обеими кубами без переключателя вообще.
 

Denzil

Мастер
Рейтинг
353
#8
Круто, Denzil! Начал недавно осваивать mel и попытался написать нечто подобное, но результат получился не совсем таким, какой я ожидал - в результате я мог двигать сферу обеими кубами без переключателя вообще.
Ну а я наоборот....
мелить начал давно, но понял, что это не совсем "правильное" решение. Ноды - рулят!
 
Сверху