THREE.js Ортогональный аспект камеры должен соответствовать аспекту окна просмотра?

Пожалуйста, может ли кто-нибудь подтвердить правильность следующего предполагаемого ограничения? ...

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

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

//Orthographic Camera

ocWidth  = 99000; //... World Units
ocHeight = 33000; //... World Units

var myCamera = new THREE.OrthographicCamera( 
   ocWidth  / - 2, ocWidth  / 2, 
   ocHeight / 2, ocHeight / - 2,
   NEAR = 1, FAR = 1000 );
 
oc_aspect_ratio = ocWidth / ocHeight; 

//Viewport

vp_aspect_ratio = oc_aspect_ratio; 
vpXwidth = 800; //... pixels
vpYheight =  vpXwidth /vp_aspect_ratio;  //... pixels, to ensure no distortion

vpXmin = -vpXwidth  /2; vpXmax = vpXwidth  /2; //... pixels
vpYmin = -vpYheight /2; vpYmax = vpYheight /2; //... pixels
        
myRenderer.setViewport( vpXmin, vpYmin, vpXwidth, vpYheight );  

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

я учусь


person steveOw    schedule 14.03.2015    source источник
comment
Сначала см. stackoverflow.com/questions/17558085/ и убедитесь, что вы понимаете, что представляют собой ортогональные параметры камеры. Мировые единицы - это не пиксели, если вы не выполняете рендеринг в текстуру.   -  person WestLangley    schedule 15.03.2015
comment
@WestLangley. Да, я видел эти вопросы и ответы. Я ясно понимаю разницу между мировыми единицами и пикселями. Ваш ответ гласит: ‹*** Чтобы предотвратить искажение, вам обычно требуется, чтобы соотношение сторон ортогональной камеры (ширина / высота) соответствовало соотношению сторон холста рендера ›››. Но нет информации о Viewports (которые могут иметь другое соотношение сторон к рендереру).   -  person steveOw    schedule 16.03.2015
comment
В вашем случае единицы измерения равны X_Width пикселям? Если да, то почему вы передаете пиксели конструктору камеры? Вы визуализируете сцену или полноэкранный квад? Каковы мировые единицы вашей сцены?   -  person WestLangley    schedule 16.03.2015
comment
@WestLangley. А, я вижу, что мой пример кода был неоднозначным. Я переписал текст и пример кода, чтобы уточнить. Я визуализирую небольшое окно просмотра на большом полном экране, в котором будут отображаться другие окна просмотра различных прямоугольных форм и размеров (с отчетом о разных сценах / камерах). Все окна просмотра используют одно и то же средство визуализации. Единицы измерения сцены / мира - метры, километры, фарлонги (не пиксели!)   -  person steveOw    schedule 16.03.2015


Ответы (1)


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

person WestLangley    schedule 16.03.2015