Render.ru
Поддержать

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

nat79

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

Script3DMAX_Backfacing_.jpg

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

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

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

LastJedi

Знаток
Рейтинг
27
Да, в общем-то, совсем простая задача)
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

Пользователь сайта
Рейтинг
4
Royal Ghost, списались, работаем. Я всё равно оплачу ТЗ. Жду код.
LastJedi, спасибо за участие.

LastJedi

Знаток
Рейтинг
27
nat79LastJedi, спасибо за участие.
Да, не за что 🙂
К слову сказать, если сцены РЕАЛЬНО тяжёлые, то лучше сделать тоже на C++. Будет существенно быстрее.

nat79

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

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

LastJedi

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

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

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