/**-------------------------------------------------代码区--------------------------------------------------------**/

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import com.sun.j3d.loaders.Scene;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.pickfast.behaviors.PickRotateBehavior;
import com.sun.j3d.utils.pickfast.behaviors.PickTranslateBehavior;
import com.sun.j3d.utils.pickfast.behaviors.PickZoomBehavior;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.javax.media.j3d.*;
import com.sun.javax.vecmath.*;
import com.microcrowd.loader.java3d.max3ds.Loader3DS;
/**
* 3DMax文件加载测试
* @author luo
*
*/
public class M3DMax3dsfileLoader extends Applet {
  BranchGroup scenceBranchGroupRoot =null;
  BoundingSphere bounds=null;
  TransformGroup sceneTG=null;
  TransformGroup objTG=null;
  Transform3D t3d1 =null;
  TransformGroup tg1=null;
  BranchGroup loaderBG =null;

  public M3DMax3dsfileLoader(){
    this.setLayout(new BorderLayout());
    GraphicsConfiguration gc = SimpleUniverse.getPreferredConfiguration();
    Canvas3D canvas = new Canvas3D(gc);
    this.add("Center",canvas);
    //this.addMouseWheelListener(this);
    BranchGroup scence = createScenceGraph(canvas);
    SimpleUniverse u = new SimpleUniverse(canvas);
    u.getViewingPlatform().setNominalViewingTransform();
    u.addBranchGraph(scence);
  }

  /**
  * 创建场景
  * @return
  */
  public BranchGroup createScenceGraph(Canvas3D canvas){
    //创建BranchGroup
    scenceBranchGroupRoot = new BranchGroup();
    //创建球形范围、背景、光源
    bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);
    sceneTG = new TransformGroup();
    sceneTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    scenceBranchGroupRoot.addChild(sceneTG);

    //定义鼠标旋转功能
    MouseRotate mouserotate = new MouseRotate();
    mouserotate.setTransformGroup(sceneTG);
    scenceBranchGroupRoot.addChild(mouserotate);
    mouserotate.setSchedulingBounds(bounds);

    //定义鼠标缩放功能
    MouseWheelZoom mouseWheelZoom = new MouseWheelZoom();
    mouseWheelZoom.setTransformGroup(sceneTG);
    scenceBranchGroupRoot.addChild(mouseWheelZoom);
    mouseWheelZoom.setSchedulingBounds(bounds);

    //定义鼠标拖拽功能
    MouseTranslate mouseTranslate = new MouseTranslate();
    mouseTranslate.setTransformGroup(sceneTG);
    scenceBranchGroupRoot.addChild(mouseTranslate);
    mouseTranslate.setSchedulingBounds(bounds);

    //定义背景色
    Color3f bgColor = new Color3f(1.0f,1.0f,1.0f);
    Background bg = new Background(bgColor);
    bg.setApplicationBounds(bounds);
    scenceBranchGroupRoot.addChild(bg);

    //定义两个平行光源的颜色及照射方向,一个环境光源的颜色
    Color3f light1Color = new Color3f(1.0f,1.0f,1.0f);
    Vector3f light1Direction = new Vector3f(4.0f,-7.0f,-12.0f);
    Color3f light2Color = new Color3f(1.0f,1.0f,1.0f);
    Vector3f light2Direction = new Vector3f(-6.0f,-2.0f,-1.0f);
    Color3f ambientColor = new Color3f(1.0f,1.0f,1.0f);

    //用前面定义的颜色定义环境光
    AmbientLight ambientLight = new AmbientLight(ambientColor);
    ambientLight.setInfluencingBounds(bounds);
    scenceBranchGroupRoot.addChild(ambientLight);

    //用前面定义的照射方向与颜色定义两个平行光
    DirectionalLight light1 = new DirectionalLight(light1Color,light1Direction);
    light1.setInfluencingBounds(bounds);
    scenceBranchGroupRoot.addChild(light1);

    DirectionalLight light2 = new DirectionalLight(light2Color,light2Direction);
    light2.setInfluencingBounds(bounds);
    scenceBranchGroupRoot.addChild(light2);
    /**
    * TransformGroup特点:
    * 1.在三维空间中放置任何形体,灯光,声音都要要到该对象。
    * 2.该对象用来定义一个通过设置,可以移动、旋转和放大缩小的局部坐标系。
    * 3.该对象有两个flags,其中ALLOW_TRANSFORM_WRITE用来将最新的数据(即坐标变化后的数据写入到数据结构中),
    * 允许程序在运行的时候修改该节点上的场景。ALLOW_TRANSFORM_READ用来读取位置变化前的数据,从而进行判断和处理。
    * 允许程序在运行的时候读取该节点上的场景。
    * 4.通过设置ALLOW_TRANSFORM_WRITE来使坐标系运动(此时在不要读取值时使用,如读取移动的距离,选旋转的角度,
    * 缩放的比例等值。若要读取这些值,则要再使用ALLOW_TRANSFORM_READ)
    * 5.要在程序中通过鼠标,移动、旋转、比例放大所指定的局部坐标系,则需要同时设置ALLOW_TRANSFORM_WRITE和ALLOW_TRANSFORM_READ。
    * 6.Java虚拟机会为这两个flags创建单独的线程(或者进程)来负责接收场景的反馈,在控制场景,避免了用户不必要的开销。
    */
    objTG = new TransformGroup();
    sceneTG.addChild(objTG);

    //定义存放3DMax文件的TransformGroup
    tg1 = new TransformGroup();
    /**
    * Transform3D的特点
    * 1.表示所指定的坐标的坐标变换,如旋转、放大缩小、平移等
    * 2.Quat4f(x,y,z,w)的参数介绍:x:x坐标 y:y坐标 z:z坐标 w:物体旋转的角度 如:
    * Quat4f(0.0f,1.0f,0.0f,1.57f) 表示物体绕Y轴旋转90度,当Y轴的只越大则旋转的幅度越大。
    * 当x,y,z的值不为0时,其值的大小即表示转动幅度的大小,值越大,表示向该方向转动的幅度也越大。
    * 3.Transform3D有四个方法rotx(),roty(), rotz(),setTranslation().当这四个方法一起使用的时候,只有最后一个有作用。
    * 为了能够让rotx,roty, rotz都显示出来,则可以使用setRotation(new Quat4())来代替,
    * 此时不论setTranslation()在setRotation(new Quat4())前还是后,都可以显示出效果
    */
    t3d1 = new Transform3D();
    t3d1.setScale(0.005);//初始化大小

    t3d1.setTranslation(new Vector3f(0.0f,0.0f,-0.4f));
    tg1 = new TransformGroup(t3d1);

    //定义3dmax文件以及所有相关材质文件及所在目录。
    String modelDir = "";
    String fileName = "car.3DS";
    loaderBG = new BranchGroup();
    try{
        Loader3DS modelLoader = new Loader3DS();
        Scene loaderScene = modelLoader.load(modelDir+fileName);
        if(loaderScene!=null){
            loaderBG = loaderScene.getSceneGroup();
        }
    }catch(Exception e){
        e.printStackTrace();
    }

    tg1.addChild(loaderBG);
    objTG.addChild(tg1);

    return scenceBranchGroupRoot;
  }

  public static void main(String[] args){
    new MainFrame(new M3DMax3dsfileLoader(), 900,720);
  }

}

/**-------------------------------------------------代码区 end--------------------------------------------------------**/

运行效果:

Java3D读取3DMax模型并实现鼠标拖拽、旋转、滚轮缩放等功能的更多相关文章

  1. vue 图片拖拽和滚轮缩放

    这里注意如果自己的页面有滚动条,一定阻止滚动事件的默认行为,否则缩放图片的时候,页面会跟着滚动@mousewheel.prevent 阻止默认行为 <div ref="imgWrap& ...

  2. 鼠标拖拽移动Java界面组件

    默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能. 只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖 ...

  3. CSharpGL(20)用unProject和Project实现鼠标拖拽图元

    CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...

  4. JavaScript鼠标拖拽特效及相关问题总结

    #div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;bac ...

  5. 一款基于jQuery的支持鼠标拖拽滑动焦点图

    记得之前我们分享过一款jQuery全屏广告图片焦点图,图片切换效果还不错.今天我们要分享另外一款jQuery焦点图插件,它的特点是支持鼠标拖拽滑动,所以在移动设备上使用更加方便,你只要用手指滑动屏幕即 ...

  6. 【狼】unity 鼠标拖拽物体实现任意角度自旋转

    主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长 ...

  7. NGUI对象跟随鼠标拖拽移动

    public Camera WNGUICamera; Vector3 _WoldPosition;//指针的初始位置 // Vector3 _WoldAng; Vector3 WscreenSpace ...

  8. 鼠标拖拽定位和DOM各种尺寸详解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Arcgis for qml - 鼠标拖拽移动

    以实现鼠标拖拽文本图层为例 GitHub:ArcGIS拖拽文本 作者:狐狸家的鱼 目的是利用鼠标进行拖拽. 实现两种模式,一种是屏幕上的拖拽,第二种是地图上图层的挪动. 屏幕上的拖拽其实跟ArcGIS ...

随机推荐

  1. 用echarts绘制中国地图

    在项目中运用到图形展示数据太常见了,echarts是一款使用率非常高的插件工具,很多大平台都是使用echarts: 一般运用到条形.折线.扇形图,今天说一说在中国地图上展示各地数据: 首先要准备中国地 ...

  2. 使用smart-npm和npm安装完毕之后发现 不是内部命令和外部命令!

    我明明记得加入过path环境变量.我想一定是什么原因 一查bing.com然后发现没有在全局环境  .所以 只需要过npm install -g gulp 一句执行cmd这样就好 $ gulp提示gu ...

  3. java学习笔记 --- IO(1)

    1.File类:文件和目录(文件夹)路径名的抽象表示形式,把文件或者目录(文件夹)都封装成File对象 1.构造方法 File(String pathname):根据一个路径得到File对象 File ...

  4. yeomen/bower/grunt

    yeomen: npm install yo angular-in-action project npm install -g generator-angular npm install -g gen ...

  5. MongoDB shell基本操作

    shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的.使用shell 命令,需要启动mongo.exe.mongodb百科 常用shel ...

  6. Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(一)

    最近用vue2做了一个微信商城项目,因为做的比较仓促,所以一边写一下整个流程,一边稍做优化. 项目github地址:https://github.com/seven9115/vue-fullstack ...

  7. Jenkins之构建触发器配置(转载)

    构建触发器配置,当你在文本框中输入配置的时间后,文本框下方会有时间解释,这样可以很好的看到自己配置的时间对不对. 可以清晰看到我的配置第一个运行时间是周五上午10点执行,第二次是星期六上午10点.   ...

  8. Too Rich(贪心加搜索)

    个人心得:10月份月赛题目,很low,就过了一道水题而且是把所有猜测都提交才过的.这段时间不知道忙什么去了, 也没怎么刷题感觉自己越来越差,还不如新来的大一学弟呢,别人起码天天刷代码到半夜,比起刚在区 ...

  9. Catch That Cow(广搜)

    个人心得:其实有关搜素或者地图啥的都可以用广搜,但要注意标志物不然会变得很复杂,想这题,忘记了标志,结果内存超时: 将每个动作扔入队列,但要注意如何更简便,更节省时间,空间 Farmer John h ...

  10. BZOJ5206: [Jsoi2017]原力

    BZOJ5206: [Jsoi2017]原力 https://lydsy.com/JudgeOnline/problem.php?id=5206 分析: 比较厉害的三元环问题. 设立阈值,当点的度数大 ...