Render.ru

Нужен скрипт: удалить полигоны (Backfacing) из сцены.

nat79

Пользователь сайта
Рейтинг
4
#1
Понадобился скрипт, удаляющий все полигоны в сцене, которые отвёрнуты нормалями от точки обзора. Для наглядности, набросал поясняющий скрин:

Script3DMAX_Backfacing_.jpg


Единственное требование: скрипт должен быть максимально элементарный. Сцены будут тяжёлые, с достаточно большим числом полигонов. Хочется, чтобы не зависал надолго.

Заказывал тут уже скрипты Igorznag и Royal Ghost. Не знаю, активны ли ещё эти люди, поэтому не отписал в личку (скрипт нужен срочно). Но, если отпишутся в теме, наряду с другими - предпочтение этим товарищам.

Оплата: 2000 руб. Скину на карту (РФ), ЯД, Альфа, ВТБ.
 

LastJedi

Знаток
Рейтинг
27
#3
Да, в общем-то, совсем простая задача)
Код:
pointOfView = $PointOfView.position

for obj in geometry do
(
    convertToMesh obj
   
    facesToDelete = #()
   
    for f = 1 to obj.numfaces do
    (
        faceNormal = getFaceNormal obj f

        faceVertices = getFace obj f
       
        firstVertexPosition = getVert obj faceVertices[1]
           
        viewVector = pointOfView - firstVertexPosition
       
        if ((dot viewVector faceNormal) <= 0.0) then append facesToDelete f
    )

    meshop.deleteFaces obj facesToDelete

    update obj
)
 
Симпатии: nat79

nat79

Пользователь сайта
Рейтинг
4
#6
Да, не за что :)
К слову сказать, если сцены РЕАЛЬНО тяжёлые, то лучше сделать тоже на C++. Будет существенно быстрее.
Ок. Если не устроит вариант Royal Ghost, закажу у вас за отдельную плату. Ваш код, кстати не пошёл, ошибку выдаёт.

upd. Royal Ghost сделал скрипт, доработал его, оплату получил. Вопрос снят.
LastJedi тоже большое спасибо!
 
Последнее редактирование:

LastJedi

Знаток
Рейтинг
27
#7
Ваш код, кстати не пошёл, ошибку выдаёт.
А как Вы запускали? Скрипт максимально простой. Без UI.

Первая строчка (pointOfView = $PointOfView.position) выбирает в сцене «точку обзора» — объект с именем "PointOfView". Если объекта с таким именем в сцене нет, то, конечно, будет ошибка.

Сделайте объект с таким именем в сцене, или замените строчку в скрипте на
Код:
pointOfView = $.position
Тогда в качестве «точки обзора» будет использован любой объект, который вы выберете перед запуском скрипта.
 
Последнее редактирование:
Симпатии: nat79
Сверху