Render.ru

Как задать видимость только ближайшего к камере обьекта?

Zahar Zaharov

Пользователь сайта
Рейтинг
2
#1
Доброго времени суток.
Задача такая, есть несколько обьектов-планов расположенных кольцом. Эта конструкция анимирована. Если быть точным она жёстко привязанна к одной кости скелета. При помощи которого уже и воспроизводится анимация.
bilbording idea.jpg


Нужно написать скрипт, делающий видимым только тот план, который в данный момент "смотрит" ровнее других в камеру, а остальные делающий невидимыми. Кроме того, этот скрипт должен обновлять результат для каждого кадра. т.к. конструкция анимированна, в разное время, разные планы будут "смотреть" в камеру ровнее.
Не совсем уверен будет ли "смотрит ровнее других" здесь эквивалентно "находится ближе других" но кажется да, эквивалентно.

В скриптах я новичок но стараюсь сильно не тупить. Помогут любые советы/ссылки с полезной информацией. В частности советы как бы вы решили такую задачу. Путём измерения расстояния от плана к камере или есть более удачные мысли? Не станет ли привязка к скелету проблемой, не будет ли вносить погрешности в такие расчёты?
 

maiden666

Мастер
Рейтинг
112
#2
измерение расстояния тут совершенно не нужно, если я правильно понял твою задачу, потребуется Dot Product, то есть в данном случае, измерение угла между нормалью плоскости, и вектором, соединяющим камеру с её таргетом...хотя в Максе нормаль конструировать замучаешься...Может быть и правда - расстояние до центра, не корректный, но наиболее простой результат
Это можно сделать и без скриптов, привязав видимость к этому самому расстоянию
 

Zahar Zaharov

Пользователь сайта
Рейтинг
2
#3
Это можно сделать и без скриптов, привязав видимость к этому самому расстоянию
А можете подсказать слегка поточнее как это можно сделать. Хотя бы направление в котором гуглить.
 

maiden666

Мастер
Рейтинг
112
#4
А можете подсказать слегка поточнее как это можно сделать. Хотя бы направление в котором гуглить.
ох, не уверен, что смогу тебе это обьяснить...
1.есть камера, обьект(бокс), хэлпер ExposeTM, в котором как Нод указываем камеру, как Референс - Бокс (можно и наоборот), нас интересует параметр distanse, то-есть расстояние между ними
2. Добавляем Боксу трек Видимости. Для этого включаем Автокей, ПКМ по обьекту, анимируем Visibility, после этого ключи можно удалить, клавное, что появился трек
3. В курвоэдиторе ПКМ по треку ->Assign Controller --> Float Expression
4. в окне контроллера сначала создаём переменную (у меня dist), то есть вписываем имя -> Create, затем Assign to Controller, и в открывшемся списке находим ExposeTM, параметр distance, он присваивается переменной dist
5. И теперь самое простое - вписываем выражение if(dist<100,1,0), это значит, если дистанция меньше 100, обьект будет виден (1), если больше (0) - не будет, нажимаем Evaluate
Можно просто подвигать кубик к камере и обратно, чтобы убедиться в этом
Теперь чтобы повторить это для нескольких обьектов, не обязательно проделывать всё заново - просто создаёшь у всех сразу трек видимости, и тупо копируешь копипастом контроллер на все другие
Муторно? Соглашусь, но в реальности, это дело заняло у меня в 3 раза меньше времени, чем писать этот пост, при том, что я в Максе уже года 3 не работаю, и многое позабыл, он убог для такого рода задач
1.jpg
3.jpg
4.jpg
5.jpg
 

igorznag

Мастер
Рейтинг
103
#5
Попробуйте такой вариант.
Конвертируем объекты-планы в Editable Poly.
Устанавливаем нужную камеру для активного вида.
Выделяем объекты-планы.
Запускаем скрипт и в новом окне нажимаем кнопку.
Создаем копию сцены перед тем, как использовать скрипт.

 

Вложения

Zahar Zaharov

Пользователь сайта
Рейтинг
2
#6
Огромнейшее спасибо за советы и особенно за этот скрипт. Работает идеально, именно так, как нужно.
Теперь буду сидеть разбираться, как вы это сделали.
 
Сверху