Render.ru
Поддержать

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

scrat15

Активный участник
Рейтинг
13
Блин...Что-то не то с кодом, не работает... Может кто-нибудь, если не трудно, посмотреть что не так?
Смысл в том чтобы согнуть ленту по сплайну, но при этом не использовать параметр 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
Я код не проверял, но первое то бросается в глаза это тут :
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
Да, и правда, мой косяк. =)

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

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
Уже мысли такие чтобы написать свой LookAt и работать с ним. =((

Goryhater

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

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

scrat15

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

Goryhater

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

Goryhater

Активный участник
Рейтинг
17
Но если ты и это сделаешь то у тебя появятся проблемы с добавлением целей для 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
О, спасибо большое, заработало.🙂 Только почему-то, не назначается целевая ось, но это ладно поправлю. Да и, в предпоследней строки мне кажется так нужно:

arr.rotation.controller.pickUpNode = arr[target]