• Games
  • TMNT
  • Игры
  • Игры
Главная
Всё для геймера: Обзоры игр, Игровые новости, Читы, Советы и пр.
Всё о компьютерных и консольных играх.
Приветствую Вас Гость
Меню геймера
Разделы каталога
Общие игровые статьи [177]
Игровая аналитика, обзоры серий игр с разных платформ, анализ игр, игровой индустрии и т.д.
Онлайн игры [244]
Статьи и обзоры онлайновых клиентских и браузерных игр
Флэш игры/Flash [11]
2D/3D игры любого жанра на технологии Adobe Flash для игры в плеере или в браузере.
Браузерные онлайн-игры [72]
Браузере игры разных жанров и типов, индивидуальные, а также для социальных сетей и пр.
Разработка игр [103]
Создание игр, программирование, игровые движки, Языки программирования
Моддинг [8]
Модификация игр, перевод, локализация, русификация, ромхакинг
Эмуляция [7]
Эмуляторы и эмуляция компьютеров, консолей, игровых автоматов и прочих систем
Игровые фанфики [2]
Художественная игровая литература, творчество поклонников игр, игровых систем и платформ.
Настольные игры и игрушки [32]
Настольные игры, карточные игры, игрушки и сувениры
Опрос геймеров
Сколько часов в сутки вы играете в игры?
Всего ответов: 17132
Главная » Статьи » Игровые статьи » Разработка игр

Рендеринг 3D-модели в текстуру для LibGDX
Когда я обдумывал возможные способы создания динамически перевода 2D-спрайтов в LibGDX, то мне порекомендовали один из способов - динамическое преобразование 3D-объекта в 2D-текстуру. Сначала я думал, что это будет сложно, но на самом деле это оказалось очень просто. Собственно, я освоил это решение, поэтому хотел бы поделиться сегодняшним уроком.


Берем 3D-сцену в LibGDX и рендерим в 2D-текстуру. Код является просто модификацией кода "Blender to GDX":

Код
package com.gamefromscratch; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Files.FileType; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.PerspectiveCamera; import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g3d.Environment; import com.badlogic.gdx.graphics.g3d.Model; import com.badlogic.gdx.graphics.g3d.ModelBatch; import com.badlogic.gdx.graphics.g3d.ModelInstance; import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; import com.badlogic.gdx.graphics.g3d.loader.G3dModelLoader; import com.badlogic.gdx.utils.UBJsonReader; import com.badlogic.gdx.graphics.g3d.utils.AnimationController; import com.badlogic.gdx.graphics.g3d.utils.AnimationController.AnimationDesc; import com.badlogic.gdx.graphics.g3d.utils.AnimationController.AnimationListener; import com.badlogic.gdx.graphics.glutils.FrameBuffer; public class ModelTest implements ApplicationListener, InputProcessor { private PerspectiveCamera camera; private ModelBatch modelBatch; private Model model; private ModelInstance modelInstance; private Environment environment; private AnimationController controller; private boolean screenShot = false; private FrameBuffer frameBuffer; private Texture texture = null; private TextureRegion textureRegion; private SpriteBatch spriteBatch; @Override public void create() { // Create camera sized to screens width/height with Field of View of 75 degrees camera = new PerspectiveCamera( 75, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); // Move the camera 5 units back along the z-axis and look at the origin camera.position.set(0f,0f,7f); camera.lookAt(0f,0f,0f); // Near and Far (plane) represent the minimum and maximum ranges of the camera in, um, units camera.near = 0.1f; camera.far = 300.0f; // A ModelBatch is like a SpriteBatch, just for models. Use it to batch up geometry for OpenGL modelBatch = new ModelBatch(); // Model loader needs a binary json reader to decode UBJsonReader jsonReader = new UBJsonReader(); // Create a model loader passing in our json reader G3dModelLoader modelLoader = new G3dModelLoader(jsonReader); // Now load the model by name // Note, the model (g3db file ) and textures need to be added to the assets folder of the Android proj model = modelLoader.loadModel(Gdx.files.getFileHandle("data/benddemo.g3db", FileType.Internal)); // Now create an instance. Instance holds the positioning data, etc of an instance of your model modelInstance = new ModelInstance(model); //move the model down a bit on the screen ( in a z-up world, down is -z ). modelInstance.transform.translate(0, 0, -2); // Finally we want some light, or we wont see our color. The environment gets passed in during // the rendering process. Create one, then create an Ambient ( non-positioned, non-directional ) light. environment = new Environment(); environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.8f, 0.8f, 0.8f, 1.0f)); // You use an AnimationController to um, control animations. Each control is tied to the model instance controller = new AnimationController(modelInstance); // Pick the current animation by name controller.setAnimation("Bend",1, new AnimationListener(){ @Override public void onEnd(AnimationDesc animation) { // this will be called when the current animation is done. // queue up another animation called "balloon". // Passing a negative to loop count loops forever. 1f for speed is normal speed. controller.queue("Balloon",-1,1f,null,0f); } @Override public void onLoop(AnimationDesc animation) { // TODO Auto-generated method stub } }); frameBuffer = new FrameBuffer(Format.RGB888,Gdx.graphics.getWidth(),Gdx.graphics.getHeight(),false); Gdx.input.setInputProcessor(this); spriteBatch = new SpriteBatch(); } @Override public void dispose() { modelBatch.dispose(); model.dispose(); } @Override public void render() { // You've seen all this before, just be sure to clear the GL_DEPTH_BUFFER_BIT when working in 3D Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // When you change the camera details, you need to call update(); // Also note, you need to call update() at least once. camera.update(); // You need to call update on the animation controller so it will advance the animation. Pass in frame delta controller.update(Gdx.graphics.getDeltaTime()); // If the user requested a screenshot, we need to call begin on our framebuffer // This redirects output to the framebuffer instead of the screen. if(screenShot) frameBuffer.begin(); // Like spriteBatch, just with models! pass in the box Instance and the environment modelBatch.begin(camera); modelBatch.render(modelInstance, environment); modelBatch.end(); // Now tell OpenGL that we are done sending graphics to the framebuffer if(screenShot) { frameBuffer.end(); // get the graphics rendered to the framebuffer as a texture texture = frameBuffer.getColorBufferTexture(); // welcome to the wonderful world of different coordinate systems! // simply put, the framebuffer is upside down to normal textures, so we have to flip it // Use a TextureRegion to do so textureRegion = new TextureRegion(texture); // and.... FLIP! V (vertical) only textureRegion.flip(false, true); } // In the case that we have a texture object to actually draw, we do so // using the old familiar SpriteBatch to do so. if(texture != null) { spriteBatch.begin(); spriteBatch.draw(textureRegion,0,0); spriteBatch.end(); screenShot = false; } } @Override public void resize(int width, int height) { } @Override public void pause() { } @Override public void resume() { } @Override public boolean keyDown(int keycode) { // TODO Auto-generated method stub return false; } @Override public boolean keyUp(int keycode) { // TODO Auto-generated method stub return false; } @Override public boolean keyTyped(char character) { // If the user hits a key, take a screen shot. this.screenShot = true; return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { // TODO Auto-generated method stub return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { // TODO Auto-generated method stub return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { // TODO Auto-generated method stub return false; } @Override public boolean mouseMoved(int screenX, int screenY) { // TODO Auto-generated method stub return false; } @Override public boolean scrolled(int amount) { // TODO Auto-generated method stub return false; } }


Вот и всё.

Запустите код, и вы получите те же результаты:

рендер


Однако, если вы нажмете любую клавишу, текущий кадр будет сохранен в виде текстуры, которая вместо этого будет отображаться на экране. Нажмите клавишу еще раз, чтобы обновить до текущего кадра:

скрин


Конечно, цвет фона отличается, потому что мы не задали его неявно. Вышеупомянутый объект a представляет собой объект текстуры LibGDX, который теперь можно рассматривать как 2D-спрайт, используемый как карта текстуры.

Код очень простой. У нас есть переключаемая переменная screenShot, которая устанавливается, если пользователь нажимает клавишу. Фактический процесс рендеринга в текстуру выполняется с помощью волшебства FrameBuffersl. Думайте о фреймбуфере как о месте, где OpenGL может что-то рендерить – рисовать графику не на экране, а в буфере памяти. Затем мы получаем этот буфер памяти как текстуру, используя getColorBufferTexture(). Единственная сложность заключается в том, что буфер кадра отображается в перевернутом виде. Это легко исправить, поместив текстуру в TextureRegion и обратив координату Y. Наконец, мы отображаем нашу недавно сгенерированную текстуру, используя нашего старого друга SpriteBatch.

Хорошо, когда что-то, что вы ожидаете сложным, на деле оказывается чем-то сверхлегким.


Если вы занимаетесь разработкой игр, рисованием в Photoshop или моделированием в 3D-редакторах, типа Blender 3, 3D Coat 2022, Modo или Autodesk 3ds Max, то вы нуждаетесь в качественных текстурах и материалах. Скачать бесплатно бесшовные PBR-текстуры в различных популярных форматах для игровых движков Unity, Godot, Cry Engine 5 или Unreal Engine 4/5 вы можете через базу https://pbr-textures.com, где представлены разномастные PBR-материалы для разработки игр, архитектурного проектирования, 2D-дизайна и создания 3D-сцен, а также наборы бесшовных текстур высокого разрешения.
Категория: Разработка игр | Добавил: Robot (24.06.2022) | Автор: Игродел
Просмотров: 895 | Рейтинг: 5.0/4 |
Вы можете отправить сообщение на e-mail друга:

Интересное геймерам:

Смотрите другие материалы по темам: UNREAL ENGINE, Cry Engine, Unity, blender, 3D-Coat, Разработка игр, 3DS Max, 3D-редакторы, Создание игр, Photoshop, libgdx, PBR, Modo, textures, 3D, Autodesk 3Ds Max, бесплатно, free, PBR textures, Текстуры.

Также вам предлагаются схожие с «Рендеринг 3D-модели в текстуру для LibGDX» материалы:

Если понравился материал «Рендеринг 3D-модели в текстуру для LibGDX» и вы можете обсудить его ниже.

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск информации
Игровые братья
Создание игр, Конструкторы игр, Игровые движки Перевод консольных игр Разработка игр в СНГ Пранк - телефонные шутки
10 новых описаний
Satan Claus [SMD]
Покупка купонов, игровых валют для Nintendo Switch, Twitch и пр.
Краткий обзор популярной онлайн игры Palworld
Увеличьте доходы от рекламы с помощью оптимизации контента
Для чего вам нужен виртуальный номер телефона
Обзор новой экшен РПГ «Zenless Zone Zero» от miHoYo
Игра «Alien Fish Finger» v1.31 на Amiga
Обзор смартфона Xiaomi 14
Игровая индустрия ориентируется уже на всех
Где покупать и/или продавать свои скины CS2, Dota 2, RUST?
Повысьте качество обслуживания пользователей и прибыль
Решающее значение для сайта - Domain Authority (DA)
Компания MAN-MADE показала компьютер, вдохновленный игрой «Метро 2033»
Почему ПО для колл-центров востребовано компаниями
Сколько стоит предметная съёмка товаров для интернет-магазина
Все права сохранены за сайтом GFAQ.ru © 2024. Games Frequently Asked Questions
Полные прохождения, Секреты, Коды, Пароли, Советы, Уловки, Читы, Описания для Компьютерных и Консольных Игр. Хостинг от uCoz
Обращаем особое внимание на то, что при цитировании и размещении данных текстовых материалов, обязательно прикрепляйте ссылку на официальный сайт "GFAQ.ru".