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

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

Тема в разделе "MAXScript", создана пользователем scrat15, 16 дек 2012.

Модераторы: Savin Denis
  1. scrat15

    scrat15 Активный участник

    С нами с:
    27.02.2011
    Сообщения:
    318
    Симпатии:
    0
    Баллы:
    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

    )
     
  2. Goryhater

    Goryhater Активный участник

    С нами с:
    20.07.2008
    Сообщения:
    283
    Симпатии:
    0
    Баллы:
    14
    Я код не проверял, но первое то бросается в глаза это тут :
    Код:
    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 всегда остаётся первым индексом массива так как она не переназначается, то что в цикле переменной а добавляются единички никак не влияет на то что уже записано выше по коду :)
     
  3. scrat15

    scrat15 Активный участник

    С нами с:
    27.02.2011
    Сообщения:
    318
    Симпатии:
    0
    Баллы:
    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.
     
  4. scrat15

    scrat15 Активный участник

    С нами с:
    27.02.2011
    Сообщения:
    318
    Симпатии:
    0
    Баллы:
    13
    Уже мысли такие чтобы написать свой LookAt и работать с ним. =((
     
  5. Goryhater

    Goryhater Активный участник

    С нами с:
    20.07.2008
    Сообщения:
    283
    Симпатии:
    0
    Баллы:
    14
    оно ругается на свойство getUpNode которого не существует, ну по крайней мере я его найти в хелпе или ещё где-то не могу) может имеется ввиду свойство pickUpNode ?

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

    scrat15 Активный участник

    С нами с:
    27.02.2011
    Сообщения:
    318
    Симпатии:
    0
    Баллы:
    13
    Да, похоже оно. Я исправил, только скрипт все-равно слетает. Если бы работало, то хотя бы LookAt назначалась бы, но ее нет.
     
  7. Goryhater

    Goryhater Активный участник

    С нами с:
    20.07.2008
    Сообщения:
    283
    Симпатии:
    0
    Баллы:
    14
    LookAt будет назначаться, если ты appendTarget перенесёшь ниже чем само назначение LookAt
     
  8. Goryhater

    Goryhater Активный участник

    С нами с:
    20.07.2008
    Сообщения:
    283
    Симпатии:
    0
    Баллы:
    14
    Но если ты и это сделаешь то у тебя появятся проблемы с добавлением целей для 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 на самый первый
     
  9. scrat15

    scrat15 Активный участник

    С нами с:
    27.02.2011
    Сообщения:
    318
    Симпатии:
    0
    Баллы:
    13
    О, спасибо большое, заработало.:) Только почему-то, не назначается целевая ось, но это ладно поправлю. Да и, в предпоследней строки мне кажется так нужно:

    arr.rotation.controller.pickUpNode = arr[target]
     
Модераторы: Savin Denis

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