Для данного урока я создал простенькую 3D модель и текстуру для нее, используя бесплатную версию очень удобной программы SketchUp 2013. Одно из удобств которой это возможность экспорта моделей в формат 3DS и OBJ, оба этих формата поддерживаются JPCT.
Вот код данного примера Код import com.threed.jpct.FrameBuffer; import com.threed.jpct.IRenderer; import com.threed.jpct.Loader; import com.threed.jpct.Matrix; import com.threed.jpct.Object3D; import com.threed.jpct.SimpleVector; import com.threed.jpct.Texture; import com.threed.jpct.TextureManager; import com.threed.jpct.World; import java.awt.Color;
/** * * @author Ruslan Nevedomy */ public class Main { private World world; private FrameBuffer buffer; private Object3D model; public static void main(String[] args) throws Exception{ new Main().loop(); } public Main() throws Exception { world = new World(); world.setAmbientLight(200, 200, 200); //загрузка текстуры TextureManager.getInstance().addTexture("Water_Sp.jpg", new Texture(".\\res\\Water_Sp.jpg")); TextureManager.getInstance().addTexture("Wood_Che.jpg", new Texture(".\\res\\Wood_Che.jpg")); //загрузка модели model = loadModelfrom3DS(".\\res\\infopole.3ds", 0.5f); model.build(); world.addObject(model); world.getCamera().setPosition(0, 0, -20); world.getCamera().lookAt(model.getTransformedCenter()); } private void loop() throws Exception { buffer = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL); buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE); buffer.enableRenderer(IRenderer.RENDERER_OPENGL);
while (!org.lwjgl.opengl.Display.isCloseRequested()) { model.rotateY(0.01f); buffer.clear(java.awt.Color.BLUE); world.renderScene(buffer); world.draw(buffer); buffer.update(); buffer.displayGLOnly(); Thread.sleep(10); } buffer.disableRenderer(IRenderer.RENDERER_OPENGL); buffer.dispose(); System.exit(0); } private Object3D loadModelfrom3DS(String filename, float scale) { Object3D[] file = Loader.load3DS(filename, scale); Object3D ret = new Object3D(0); Object3D temp = null; for (int i = 0; i < file.length; i++) { temp = file[i]; temp.setCenter(SimpleVector.ORIGIN); temp.rotateX((float)( -.5*Math.PI)); temp.rotateMesh(); temp.setRotationMatrix(new Matrix()); ret = Object3D.mergeObjects(ret, temp); ret.build(); } return ret; } } Рассмотрим функцию загрузки 3D объектов из 3DS файлов Код private Object3D loadModelfrom3DS(String filename, float scale) { Object3D[] file = Loader.load3DS(filename, scale); Object3D ret = new Object3D(0); Object3D temp = null; for (int i = 0; i < file.length; i++) { temp = file[i]; temp.setCenter(SimpleVector.ORIGIN); temp.rotateX((float)( -.5*Math.PI)); temp.rotateMesh(); temp.setRotationMatrix(new Matrix()); ret = Object3D.mergeObjects(ret, temp); ret.build(); } return ret; } Объект выгруженный из редактора может состоят из нескольких(обычно один объект это 1 сетка точек иногда именуемая мешем от английского слова Mesh) поэтому мы последовательно перебираем содержимое файла и соединяем его содержимое в единый 3D объект. Далее мы загружаем текстуры, в этом процессе главное чтобы имена текстур в 3DS файле совпадали с именами текстур которые задаются при загрузке. Если они не будут совпадать то текстура не будет отображаться на объекте. Также важно загружать текстуры до моделей. Код //загрузка текстур TextureManager.getInstance().addTexture("Water_Sp.jpg", new Texture(".\\res\\Water_Sp.jpg")); TextureManager.getInstance().addTexture("Wood_Che.jpg", new Texture(".\\res\\Wood_Che.jpg")); //загрузка модели model = loadModelfrom3DS(".\\res\\infopole.3ds", 0.5f); //собираем объект model.build(); Цикл отрисовки практически не отличается от урока Первый шаг с JPCT единственная разница это то что мы вращаем объект загруженный из 3DS файла. Проект NetBeans со всеми моделями и текстурами находится тут
|