Почему мой рендеринг Canvas3D вне экрана не работает?

Я пытался заставить работать внеэкранный рендеринг, используя Java3D 1.5.2. В моем исходном коде я пытался присоединить расширенный Canvas3D, который будет выполнять закадровый рендеринг, к SimpleUniverse, но это нарушит рендеринг:

62.  // FOR SOME REASON THIS BREAKS RENDERING
63.  universe.getViewer().getView().addCanvas3D(canvas);

Полный исходный код слишком велик для вставки в StackOverflow, поэтому я сделал его доступным через Pastie по здесь.

Строка 63 была закомментирована, и обычный Canvas3D выполняет рендеринг на экране. Он отобразит куб и отобразит его в формате JFrame. Однако, если вы удалите комментарий, рендеринг за пределами экрана приведет к тому, что экранный рендеринг не будет отображаться. Также закадровый рендеринг вернет «большое черное ничто» BufferedImage.

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


person Spoike    schedule 28.08.2009    source источник


Ответы (1)


Это может быть неправильное физическое измерение Screen3D. Значение должно быть размером физического экрана в метрах. Вы можете протестировать с помощью:

screen3D.setPhysicalScreenWidth(0.0254/90.0 * destWidth);
screen3D.setPhysicalScreenHeight(0.0254/90.0 * destHeight);

Значения взяты из верхней части javadoc Screen3D. Проблемная строка работала вместе с приведенным выше кодом, по крайней мере, для меня :)

Установка неправильного физического размера также может изменить соотношение сторон визуализируемого изображения.

person Melv    schedule 02.09.2009
comment
Мила, это работает! Кстати, что именно мне нужно сделать, чтобы программа вышла сама. Он все еще работает, даже когда рендеринг завершен, как будто какой-то ресурс все еще работает, и я не могу понять, где он это делает. (Я вызываю Universe.cleanup(), но этого недостаточно). Я приму ответ после этого. - person Spoike; 03.09.2009
comment
Я бы попробовал .dispose() все кадры. Если это не сработает, вызовите System.exit(0), что убьет jvm. Если вам нужно, чтобы jvm продолжал работать, необходимы дополнительные исследования :) - person Melv; 03.09.2009
comment
Да, я решил использовать System.exit(0), но мне не нужно ничего более элегантного, так что все в порядке. Спасибо. - person Spoike; 03.09.2009