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

Выделение объектов по координатам

Тема в разделе "MAXScript", создана пользователем Erik_945, 28 дек 2014.

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

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

    С нами с:
    22.11.2014
    Сообщения:
    44
    Симпатии:
    6
    Баллы:
    7
    Задача состоит в следующем - я указываю точку в трехмерном пространстве и радиус, описывающий сферу вокруг нее. Мне нужно выделить все объекты сцены, у которых хотя-бы одна из вершин попала в эту сферу.
    Самый тупой вариант - перебрать все вершины всех объектов, но это долго, нудно и некрасиво. Нет ли более эффективного решения, вроде деревьев поиска или чего-нибудь в том-же ключе, в конце концов, мышкой мы примерно так и выделяем области мышью?
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Можно использовать модификатор Volume Select через MaxScript или это тоже тупой вариант?
     
  3. Erik_945

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

    С нами с:
    22.11.2014
    Сообщения:
    44
    Симпатии:
    6
    Баллы:
    7
    Нет. Вариант вполне нормальный, только, как сказано в описании - это " make a sub-object selection of vertices or faces ", а мне нужны сами объекты (меши), а не их элементы.
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Пример:
    В новой сцене создаем один объект Sphere и два объекта Teapot.
    Перемещаем сферу, чтобы "дотронутся" до объекта Teapot1.
    Выделяем сферу. Запускаем скрипт. В новом окне нажимаем кнопку Select.
    Код:
    try(destroyDialog igorznag_test) catch()
    rollout igorznag_test "Select"
    (
        button btn_apply "Select"; on btn_apply pressed do
        (
            try
            (      
                if selection.count==1 then
                (
                    obj=selection[1]
                    if classof obj ==sphere and geometry.count>1 then
                    (
                        objs_to_select=#()
                        for g in geometry  where g!=obj do
                        (
                            vs=volumeselect();vs.level=1;vs.method=1;vs.volume=3;
                            addmodifier g vs; setCommandPanelTaskMode mode:#modify;
                            g.modifiers[1].Node=obj; setCommandPanelTaskMode mode:#create;
                            theMesh = snapshotasmesh g
                            fs_ba=getVertSelection theMesh; delete theMesh;
                            if fs_ba.numberSet!=0 then append objs_to_select g
                            deletemodifier g 1;
                        )--for g in geometry do
                        select objs_to_select
                    )--if classof obj ==sphere and geometry.count>1 then
                )--if selection.count==1 then
            )catch()
        )--on btn_apply pressed do
    ); createdialog igorznag_test 80 30
     
    Erik_945 нравится это.
  5. Erik_945

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

    С нами с:
    22.11.2014
    Сообщения:
    44
    Симпатии:
    6
    Баллы:
    7
    Спасибо!
     
Модераторы: Savin Denis

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