Cocos3D - Делайте различные снимки экрана в фоновом режиме.

Можно ли с помощью Cocos3D сделать скриншот 3D-модели в фоновом режиме без ведома пользователя?

Для целей предварительной обработки и других целей я хочу сделать скриншоты 3D-модели под разными углами. Следуя возможности Render-To-Texture, я заметил, что когда моя сцена не видна, метод drawSceneContentWithVisitor: выполняется только один раз, а не в каждом цикле рендеринга. По очевидной причине CC3GLFramebuffer* не будет обновляться новыми данными, поэтому я могу сделать только начальный снимок экрана.

Спасибо.


person Loc Pham    schedule 18.12.2014    source источник


Ответы (1)


В Cocos3D вы можете визуализировать свою 3D-сцену на поверхность за пределами экрана. См. методы CC3DemoMashUp addTelevision и drawSceneContentWithVisitor: в качестве примера того, как это сделать.

Что важно, так это то, что среда трехмерного рисования была установлена, когда вы выполняете свой рисунок. Самое безопасное место для этого — внутри вашего метода drawSceneContentWithVisitor:. Но если вы хотите выполнить рендеринг в другом месте, вам нужно вызвать методы CC3Scene open3DWithVisitor: и CC3Scene close3DWithVisitor: до и после рендеринга. См. реализации методов CC3Scene processInitializeScene и open для примеров того, как это сделать.

Чтобы визуализировать вашу сцену с нескольких точек обзора, вам нужно добавить несколько камер в вашу сцену и установить свойство camera вашего посетителя чертежа соответствующим образом, чтобы выбрать камеру перед визуализацией. Посмотрите, как это делается в методах CC3DemoMashUpScene addTelevision и drawToTVScreen. Метод drawToTVScreen также показывает, как обрабатывать очистку буферов цвета и глубины поверхности.

person Bill Hollings    schedule 19.12.2014
comment
Извините, я не очень ясно выразил свой вопрос, и вы правы, мы можем визуализировать текстуру с нескольких точек зрения, используя несколько камер. Что я действительно пытаюсь сделать, так это визуализировать анимированную 3D-модель с разницей во времени, а не статическую 3D-модель. То есть в течение 5 секунд 3D-модель может анимироваться, и будет захвачено x количество изображений. Поскольку drawSceneContentWithVisitor: выполняется только один раз при работе в фоновом режиме, я не могу анимировать 3D-персонажа. - person Loc Pham; 19.12.2014
comment
Если я правильно понимаю, вы хотите создать серию анимированных снимков... что-то вроде флип-анимации? И я думаю, вы хотели бы сохранить изображения в словарь или файлы? Взгляните на метод CC3DemoMashUpScene saveTVImage. Он создает CGImageRef из текущего содержимого ТВ-текстуры (которая является визуализированной текстурой) и сохраняет ее в файл. Пример запускается событием касания, но, выполняя его в вашем методе drawSceneContentWithVisitor: (сразу после рендеринга текстуры), вы можете делать эти снимки столько раз, сколько захотите, пока ваша сцена анимируется. - person Bill Hollings; 22.12.2014
comment
На самом деле, анимация происходит в фоновом режиме для целей предварительной обработки. Поскольку он находится в фоновом режиме, метод drawSceneContentWithVisitor: выполняется только ОДИН РАЗ, а не в каждом цикле рендеринга. - person Loc Pham; 23.12.2014
comment
Билл, как мне создать изображения с прозрачным фоном? Я следовал за saveTVImage:, но фон моих изображений либо имеет исходный фон, либо ЧЕРНЫЙ цвет. - person Loc Pham; 29.12.2014
comment
Я читал другие ваши сообщения, но, к сожалению, у меня нет особого понимания извлечения прозрачности в файл CGImageRef и PNG. Проблема, по-видимому, заключается в установке спецификаций CGImageRef в вариациях методов createCGImageFrom: и saveTVImage. Вы можете найти дополнительную информацию на общем форуме по обработке изображений iOS или в документации Apple по обработке изображений. - person Bill Hollings; 31.12.2014
comment
Я боялся, что ты это скажешь. Как вы думаете, возможно ли использовать cocos2D CCRenderTexture в качестве альтернативы? Здесь есть сообщение с разделом, в котором рассказывается, как сделать снимок экрана, но ничего не упоминается о прозрачности. learn-cocos2d .com/2011/12/ - person Loc Pham; 31.12.2014
comment
В качестве догадки... я бы сказал, что сомневаюсь, что это поможет, потому что механизмы рендеринга текстур похожи (но никогда не говори никогда, если хочешь попробовать!). Как я уже упоминал, я думаю, что проблема заключается в том, как CGImageRef создается и управляется из содержимого текстуры. - person Bill Hollings; 02.01.2015