Ортографическая проекция — ищу помощь по скрипту

Автор
Сообщение
На сайте c 14.10.2011
Сообщений: 301
Москва

Для определения пиксельных координат 3д точки в сцене существует прекрасно работающая функция pixelpos (код ниже). Простыми словами: функция позволяет определить в какой пиксель на рендере Point2 (x, y) попадёт определённая точка из сцены point3 (x, y, z).

Однако при использовании ортографической проекции (виреевская камера + настройка в общем 3д-максовском свитке камер) функция перестаёт работать корректно (к слову, визуально на вьюпорт тоже не влияет).

Честно говоря, даже не совсем понимаю как подступиться, а писать костыли для конкретного случая себе дороже.

Буду очень рад, если найдутся товарищи с уверенной линейной алгеброй, и мы сможем решить вопрос! )

fn  PixelPos inputPoint3D = (

local  screen_width, screen_height

screen_width=RenderWidth as float

screen_height=RenderHeight  as  float

thePos = inputPoint3D * viewport.getTM()

screen_origin = mapScreenToView [0,0] (thePos.z) [screen_width,screen_height]

end_screen = mapScreenToView [screen_width,screen_height] (thePos.z) [screen_width,screen_height] world_size = screen_origin-end_screen

x_aspect = screen_width/(abs world_size.x)

y_aspect = screen_height/(abs world_size.y)

screen_coords = point2 (x_aspect*(thePos.x-screen_origin.x)) (-(y_aspect*(thePos.y-screen_origin.y)))

return  screen_coords

)

пардон за адский листинг, редактор очень странный, форматирование не даётся…

Куда делся тэг для кода? (

На сайте c 14.10.2011
Сообщений: 301
Москва

Да ) http://pastebin.com/k0BneQY1 

А раньше так удобно было… И синтаксис даже подсвечивался. Ну это в «улучшения сайта» уже…

ps В документации сказано, что viewport.getTM() отдаёт матрицу для неортографических видов, так что конкретизирую вопрос: как получить матрицу в случае именно этого исключения?

На сайте c 14.10.2011
Сообщений: 301
Москва

Работает если вьюпорт ортографический.

А если рендер идёт через v-ray камеру, но в общих настройках изменён её тип, то он так же это не учитывает.

cdd69f97a3cb2c6b8c756f321c9e8fbc.png

Но спасибо за версию.

Попробую реализовать движение камеры через управление вьюпортом…

На сайте c 14.10.2011
Сообщений: 301
Москва

Делаю большой проект по предметной визуализации (двери), на которых используется несколько различных конфигураций фурнитуры, а расположена она в разных местах.

Вот её и дорендериваю регионом. Сначала хардкодил координаты, но потом, когда уже начал путаться в исключениях, добавил функцию, которая выделяла регион, соответствующий положению объекта.

И всё было прекрасно, пока не решил перейти на ортографический вид (чтобы зазоры смотрелись аккуратнее)…

Сейчас пробую последовательность переключить тип вьюпорта на camera поменять положение камеры → переключить тип вьюпорта на orthographic во время рендера.

И да, ваша функция работает более корректно! Премного благодарен! )

На сайте c 07.10.2010
Сообщений: 1709
Минск
А если на скрипт повесить просто выделение объекта и воспользоваться этой опцией:http://take.ms/SncnF  
На сайте c 14.10.2011
Сообщений: 301
Москва
Цитата Sean:
А если на скрипт повесить просто выделение объекта и воспользоваться этой опцией:http://take.ms/SncnF   

Идея хорошая, пробовал, но получается грязь по периметру (тени), потому что в половине случаев нужно отрендерить регион, в котором объект не появляется, а наоборот исчезает. Приходится делать отступ пикселей по 50.

Цитата Jähman':

Вот это оптимизация, вот это хардкор. Круто, снимаю шляпу.

При больших объёмах необходимость. Пять дверей в пяти цветах и с тремя ручками/замками можно рендернуть, и не заметить эти 250% оптимизации, а когда вариантов тысячи, то это уже дни процессорного времени. Ну и увлекательно, конечно ) Строишь производство в каком-то роде…
Читают эту тему: