Render.ru

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

Erik_945

Знаток
Рейтинг
36
#1
Задача состоит в следующем - я указываю точку в трехмерном пространстве и радиус, описывающий сферу вокруг нее. Мне нужно выделить все объекты сцены, у которых хотя-бы одна из вершин попала в эту сферу.
Самый тупой вариант - перебрать все вершины всех объектов, но это долго, нудно и некрасиво. Нет ли более эффективного решения, вроде деревьев поиска или чего-нибудь в том-же ключе, в конце концов, мышкой мы примерно так и выделяем области мышью?
 

Erik_945

Знаток
Рейтинг
36
#3
Нет. Вариант вполне нормальный, только, как сказано в описании - это " make a sub-object selection of vertices or faces ", а мне нужны сами объекты (меши), а не их элементы.
 

igorznag

Мастер
Рейтинг
103
#4
Пример:
В новой сцене создаем один объект 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
 
Сверху