JavaFx 3D文件导入

3d文件转换工具Jar下载地址 :jfx3dimporter

package com.tdmodel;

import java.io.IOException;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.SubScene;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;

/**
 *
 * @author zhuqing
 */
public class Import3dModel extends Application {

    private final Rotate cameraXRotate = new Rotate(-20, 0, 0, 0, Rotate.X_AXIS);
    private final Rotate cameraYRotate = new Rotate(-20, 0, 0, 0, Rotate.Y_AXIS);
    private final Translate cameraPosition = new Translate(0, 0, -20);

    private double scaleFactor = 1;

    private double dragStartX, dragStartY, dragStartRotateX, dragStartRotateY;

    @Override
    public void start(Stage primaryStage) throws IOException {

        BorderPane borderPane = new BorderPane();

        borderPane.setCenter(load3DModel());

        Scene scene = new Scene(borderPane, 800, 600);
        initMouseDrag(scene);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * 导入3d模型
     *
     * @return
     * @throws IOException
     */
    private Group load3DModel() throws IOException {

        /**
         * 创建摄像头
         */
        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll(cameraXRotate, cameraYRotate, cameraPosition);

        /**
         * 导入3d模型
         */
        Group groupRoot = Importer3D.load("C:\\Users\\zhuqing.BJGOODWILL\\Documents\\NetBeansProjects\\3dModel\\src\\resources\\hands.3DS");
        groupRoot.getChildren().add(camera);

        /**
         * 创建SubScene
         */
        SubScene subScene = new SubScene(groupRoot, 800, 600, true, SceneAntialiasing.BALANCED);
        subScene.setCamera(camera);
        Group group = new Group();
        group.getChildren().add(subScene);

        return group;
    }

    private void initMouseDrag(Scene scene) {
        /**
         * 鼠标事件
         */
        scene.addEventFilter(MouseEvent.ANY, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {

                if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {
                    dragStartX = event.getSceneX();
                    dragStartY = event.getSceneY();
                    dragStartRotateX = cameraXRotate.getAngle();
                    dragStartRotateY = cameraYRotate.getAngle();
                } else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
                    double xDelta = event.getSceneX() - dragStartX;
                    double yDelta = event.getSceneY() - dragStartY;
                    cameraXRotate.setAngle(dragStartRotateX - (yDelta * 0.3));
                    cameraYRotate.setAngle(dragStartRotateY + (xDelta * 0.3));
                }

            }
        });

        /**
         * 滚轮滚动数据
         */
        scene.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent event) {
                double z = cameraPosition.getZ() - (event.getDeltaY() * 0.1 * scaleFactor);
                z = Math.min(z, 0);
                cameraPosition.setZ(z);
            }
        });

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

package com.tdmodel;

import com.interactivemesh.jfx.importer.ModelImporter;
import com.interactivemesh.jfx.importer.stl.StlMeshImporter;
import com.interactivemesh.jfx.importer.tds.TdsModelImporter;
import com.interactivemesh.jfx.importer.x3d.X3dModelImporter;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;

import java.io.IOException;

/**
 *3d模型导入工具
 */
public final class Importer3D {

    /**
     * 导入3d模型文件
     * @param fileUrl
     */
    public static Group load(final String fileUrl) throws IOException {

        final int dot = fileUrl.lastIndexOf('.');
        if (dot <= 0) {
            throw new IOException("Unknown 3D file format, url missing extension [" + fileUrl + "]");
        }
        final String extension = fileUrl.substring(dot + 1, fileUrl.length()).toLowerCase();

        switch (extension) {
            case "3ds":
                ModelImporter tdsImporter = new TdsModelImporter();
                tdsImporter.read(fileUrl);
                final Node[] tdsMesh = (Node[]) tdsImporter.getImport();
                tdsImporter.getNamedMaterials();
                return new Group(tdsMesh);
            case "stl":
                StlMeshImporter stlImporter = new StlMeshImporter();
                stlImporter.read(fileUrl);
                TriangleMesh cylinderHeadMesh = stlImporter.getImport();
                stlImporter.close();
                MeshView cylinderHeadMeshView = new MeshView();
                cylinderHeadMeshView.setMaterial(new PhongMaterial(Color.GRAY));
                cylinderHeadMeshView.setMesh(cylinderHeadMesh);
                stlImporter.close();
                return new Group(cylinderHeadMeshView);
            case "x3d":

                X3dModelImporter x3dModel = new X3dModelImporter();
                x3dModel.read(fileUrl);
                
                final Node[] x3dMesh = x3dModel.getImport();
                x3dModel.close();
                return new Group(x3dMesh);

            default:
                throw new IOException("Unsupported 3D file format [" + extension + "]");
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,688评论 19 139
  • [cp]“ 可以不光芒万丈,但不能停止自己发光 ” ​​​[/cp]
    chde我阅读 174评论 0 0
  • 在所有困难前 必须先有耐心 时光总会匆匆而过 而心却需要沉淀 对的错的 热闹的安静的 有的人在承担 有的人尝试 却...
    天籁村阅读 323评论 0 0
  • 一场酣梦,梦一生 庄周化蝶,蝶成庄 情迷蝶意,蒙双眼 酒香远闻,已成醉 醉生梦死,孰是非 西下光辉,红似天 双色景...
    21e87e7c9a8c阅读 215评论 0 1
  • 每周二、周四下午八九节课都有第二课堂活动(兴趣小组),赶上运动会在即,体育场上都是锻炼的人。今天,体育委员邵威组织...
    白骨精的优雅阅读 280评论 0 3

友情链接更多精彩内容