Render.ru

Проблема с кодом назначение LookAt Constraint на мн

scrat15

Активный участник
Рейтинг
13
#1
Блин...Что-то не то с кодом, не работает... Может кто-нибудь, если не трудно, посмотреть что не так?
Смысл в том чтобы согнуть ленту по сплайну, но при этом не использовать параметр follow, так как при некоторых изгибах сплайна поворот звеньев ведет себя неадекватно. Первое звено ленты выходит из минигана под одним углом, а входит в ящик под углом 90 гр. (по локальной оси z) Для этого сделана первая часть кода(первый цикл), второй цикл должен назначить контроллер LookAt на звено, а как цель выбрать следующее и т.д.

ang = 1.125 --угол поворота для каждого звена
per = 0


for i = 1 to 80 do
(
per+=1.2
copy $
$.pos.controller.percent = per --положение нового звена

in coordsys local rotate $ (angleaxis ang [0,0,1]) --вращаем новое звено вдоль локальной оси z


)

max select all --выделяем все

arr = $ as array --заносим выделенное в массив
a = 1
b = arr[a]



c = LookAt_constraint () --создаем контроллер LookAt

clearSelection ()
for i in arr do

(
a+=1


c.appendTarget b 1.0 --добавляем цель к lookAt

i.rotation.controller = c --назначаем ранее созданный контроллер текущему звену

i.rotation.controller.StoUP_axis = 1
i.rotation.controller.upnode_world = off
i.rotation.controller.getUpNode = b

)
 

Goryhater

Активный участник
Рейтинг
17
#2
Я код не проверял, но первое то бросается в глаза это тут :
Код:
arr = $ as array --заносим выделенное в массив
a = 1
b = arr[a]



c = LookAt_constraint () --создаем контроллер LookAt

clearSelection ()
for i in arr do

(
a+=1


c.appendTarget b 1.0 --добавляем цель к lookAt

i.rotation.controller = c --назначаем ранее созданный контроллер текущему звену

i.rotation.controller.StoUP_axis = 1
i.rotation.controller.upnode_world = off
i.rotation.controller.getUpNode = b

)
переменная b всегда остаётся первым индексом массива так как она не переназначается, то что в цикле переменной а добавляются единички никак не влияет на то что уже записано выше по коду :)
 

scrat15

Активный участник
Рейтинг
13
#3
Да, и правда, мой косяк. =)

Но так все-равно не работает.

ang = 1.125
per = 0


for i = 1 to 80 do
(
per+=1.2
copy $
$.pos.controller.percent = per

in coordsys local rotate $ (angleaxis ang [0,0,1])


)

max select all

arr = $ as array
a = 1



c = LookAt_constraint ()

clearSelection ()
for i in arr do

(
a+=1


c.appendTarget arr[a] 1.0

i.rotation.controller = c

i.rotation.controller.StoUP_axis = 1
i.rotation.controller.upnode_world = off
i.rotation.controller.getUpNode = arr[a]

)


Получаю : -- Error occurred in i loop; filename: C:\Users\SCRAT1995\Documents\3dsMax\sceneassets\Rukav.ms; position: 748; line: 38
-- Frame:
-- i: $Rukav3
-- Unknown property: "getUpNode" in Controller:LookAt_Constraint


Что за бред?
Тут еще проблема: если у первого звена имя Rukav01, то после копирования, оно не остается вначале сплайна, а в конце, а вначале сплайна находится уже Rukav02. P.S. Копируемому звену назначен контроллер Path Constraint.
 

scrat15

Активный участник
Рейтинг
13
#4
Уже мысли такие чтобы написать свой LookAt и работать с ним. =((
 

Goryhater

Активный участник
Рейтинг
17
#5
оно ругается на свойство getUpNode которого не существует, ну по крайней мере я его найти в хелпе или ещё где-то не могу) может имеется ввиду свойство pickUpNode ?

И ещё одно, сейчас у тебя в цикле пропускается первый индекс массива, то есть действия вешаются не на первый обьект, а на второй, так как в начале цикла переменная а (которая равна 1) сразу увеличивается на 1
 

scrat15

Активный участник
Рейтинг
13
#6
Да, похоже оно. Я исправил, только скрипт все-равно слетает. Если бы работало, то хотя бы LookAt назначалась бы, но ее нет.
 

Goryhater

Активный участник
Рейтинг
17
#7
LookAt будет назначаться, если ты appendTarget перенесёшь ниже чем само назначение LookAt
 

Goryhater

Активный участник
Рейтинг
17
#8
Но если ты и это сделаешь то у тебя появятся проблемы с добавлением целей для LookAt , потому я бы сделал как то так в последнем твоём цикле
Код:
for i=2 to arr.count do
(
target= i-1
c = LookAt_constraint();
arr[i].rotation.controller = c
arr[i].rotation.controller.appendTarget arr[target] 1.0
arr[i].rotation.controller.StoUP_axis = 1
arr[i].rotation.controller.upnode_world = off
arr[i].rotation.controller.pickUpNode = arr[1]
i+=1
)
тут LookAt_constraint добавляется начиная со второго по счёту обьекта в массиве, а pickUpNode на самый первый
 

scrat15

Активный участник
Рейтинг
13
#9
О, спасибо большое, заработало.:) Только почему-то, не назначается целевая ось, но это ладно поправлю. Да и, в предпоследней строки мне кажется так нужно:

arr.rotation.controller.pickUpNode = arr[target]
 
Сверху