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

Соединения в молекуле.

Тема в разделе "MAXScript", создана пользователем Aleksandr Ryzhov, 11 дек 2008.

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

    Aleksandr Ryzhov Пользователь сайта

    С нами с:
    09.12.2008
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    Здравствуйте! Я новичёк в 3ds Max. Задача создать некую молекулу(необязательно такая в реальности должна существовать). В начале координат находится центральный шар. В пространстве находятся допустим 6 других шаров меньшего радиуса, координаты этих шаров произвольны и должны вводится из текстового файла. Вопросы такие: хочу создать соединения в виде тонких цилиндров, как мне задать положение этих цилиндров, чтобы они соединяли данный шар с центральным? Что нужно сделать чтобы вся молекула воспринималась как целое(наверное аналог group в 3ds Max), чтобы в дальнейшем задать движение и вращение данной молекулы относительно центра? Всё нужно сделать именно в MaxScript(задание в универе такое).
    P.S. Помогите плиз ламеру.
     
  2. kolts

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

    С нами с:
    05.02.2008
    Сообщения:
    448
    Симпатии:
    0
    Баллы:
    17
    А все это анимируется?
     
  3. Aleksandr Ryzhov

    Aleksandr Ryzhov Пользователь сайта

    С нами с:
    09.12.2008
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
  4. Aleksandr Ryzhov

    Aleksandr Ryzhov Пользователь сайта

    С нами с:
    09.12.2008
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    Пиплы неужели никто не знает?
     
  5. Protactinium

    Protactinium Пользователь сайта

    С нами с:
    03.03.2006
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    2
    Если нужно именно цилиндры использовать для соединений в молекуле, то можно сделать так:

    1. Вычислить вектор между центрами двух шаров. v1 = $Sphere02.pos - $Sphere01.pos
    2. Исходный цилиндр должен стоять в начале координат и направлен вверх.
    Тогда вектор его оси будет v2 = [0,0,1]
    3. Итоговая ориентация цилиндра определяется матрицей поворота совмещающей вектора v1 и v2.
    Есть матрица поворота вокруг единичного вектора (оси) на заданный угол. Ее можно найти на
    википедии по запросу "матрица поворота".
    4. Единичный вектор вокруг которого происходит вращение равен векторному произведения векторов
    v1 и v2: a = normalize (cross v1 v2).
    5. Сам угол между векторами не нужен, нужен только его косинус. Косинус этого угла равен скалярному
    произведению этих векторов, при условии что они нормализованны:
    v1 = normalize v1
    v2 = normalize v2
    prod = v1.x*v2.x+v1.y*v2.y+v1.z*v2.z
    cos_ang = prod
    6. понадобится также синус этого угла:
    sin_ang = sqrt(1 - cos_ang*cos_ang)
    7. Матрица ориентации цилиндра будет иметь вид:
    MR = matrix3 0
    MR.row1 = [(cos_ang + (1 - cos_ang)*a.x*a.x), ((1 - cos_ang)*a.x*a.y - sin_ang*a.z), ((1 - cos_ang)*a.x*a.z + sin_ang*a.y)]
    MR.row2 = [((1 - cos_ang)*a.y*a.x + sin_ang*a.z), (cos_ang + (1 - cos_ang)*a.y*a.y), ((1 - cos_ang)*a.y*a.z - sin_ang*a.x)]
    MR.row3 = [((1 - cos_ang)*a.z*a.x - sin_ang*a.y), ((1 - cos_ang)*a.z*a.y + sin_ang*a.x), (cos_ang + (1 - cos_ang)*a.z*a.z)]
    8. Для итоговой матрицы трансформации цилиндра необходимо его положение. Оно совпадает с центром первой сферы:
    MR.row4 = $Sphere01.pos
    9. В итоге нужно просто полученную матрицу использовать в качестве матрицы трансформации цилиндра:
    $Cylinder01.transform = MR

    p.s. Но если не сущесвенно какими будут соединения в молекуле, по-моему, лучще соединить центры сфер сплайнами
    в режиме corner и наложить на них модификатор edit_mesh. Получатся теже цилиндры, но гораздо проще... )
     
  6. Aleksandr Ryzhov

    Aleksandr Ryzhov Пользователь сайта

    С нами с:
    09.12.2008
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    Не существенно какими будут соединения. А как сделать чтобы вся молекула воспринималась как целое, для дальнейшей анимации вращения?
     
  7. kolts

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

    С нами с:
    05.02.2008
    Сообщения:
    448
    Симпатии:
    0
    Баллы:
    17
    Надо все обьекты прилинковать к центральному шару и анимировать только его
     
  8. megavitus

    megavitus Пользователь сайта

    С нами с:
    07.06.2006
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    2
    Ну и ну, нагородили косинусов :) , всё проще

    v1 = $Sphere02.pos - $Sphere01.pos
    c = cylinder()
    c.dir = v1
     
  9. megavitus

    megavitus Пользователь сайта

    С нами с:
    07.06.2006
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    2
    p.s. Забыл добавить: c.height = length v1
     
  10. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
  11. Aleksandr Ryzhov

    Aleksandr Ryzhov Пользователь сайта

    С нами с:
    09.12.2008
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    2
    А как сделать чтобы вся молекула воспринималась как целое, для дальнейшей анимации вращения?
    Надо все обьекты прилинковать к центральному шару и анимировать только его.


    А как это сделать?)))
     
  12. Protactinium

    Protactinium Пользователь сайта

    С нами с:
    03.03.2006
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    2
    Например так:

    s1 = $Sphere01
    s2 = $Sphere02
    s2.parent = s1

    В таком случае s2 будет прилинкована к s1
    Подробнее смотри в разделе справки - General Node Properties.
     
  13. виталий антоновас vip

    виталий антоновас Moderator Команда форума

    С нами с:
    02.11.2006
    Сообщения:
    620
    Симпатии:
    67
    Баллы:
    280
  14. ASK'R

    ASK'R Активный участник

    С нами с:
    18.03.2008
    Сообщения:
    94
    Симпатии:
    0
    Баллы:
    5
    кину свои 5 копеек
    ну с мешем получим 2 точки, что совсем не интересно, но насчет сплайнов это очень правильно - круглый, прямоугольный вид для рендера, через Sweep (или Loft) ещё куча профилей, возможно сделать одним обьектом, возможно оптимизацию для вьюпорта (не показывать во вьюпорте окончательную геометрию)

    можно слинковать, а можно и сгрупить - group $box* name:"boxes", - фломастеры же на вкус разные ;)
     
Модераторы: Savin Denis

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