Java3D读取3DMax模型并实现鼠标拖拽、旋转、滚轮缩放等功能
/**-------------------------------------------------代码区--------------------------------------------------------**/
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模型并实现鼠标拖拽、旋转、滚轮缩放等功能的更多相关文章
- vue 图片拖拽和滚轮缩放
这里注意如果自己的页面有滚动条,一定阻止滚动事件的默认行为,否则缩放图片的时候,页面会跟着滚动@mousewheel.prevent 阻止默认行为 <div ref="imgWrap& ...
- 鼠标拖拽移动Java界面组件
默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能. 只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖 ...
- CSharpGL(20)用unProject和Project实现鼠标拖拽图元
CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...
- JavaScript鼠标拖拽特效及相关问题总结
#div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;bac ...
- 一款基于jQuery的支持鼠标拖拽滑动焦点图
记得之前我们分享过一款jQuery全屏广告图片焦点图,图片切换效果还不错.今天我们要分享另外一款jQuery焦点图插件,它的特点是支持鼠标拖拽滑动,所以在移动设备上使用更加方便,你只要用手指滑动屏幕即 ...
- 【狼】unity 鼠标拖拽物体实现任意角度自旋转
主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长 ...
- NGUI对象跟随鼠标拖拽移动
public Camera WNGUICamera; Vector3 _WoldPosition;//指针的初始位置 // Vector3 _WoldAng; Vector3 WscreenSpace ...
- 鼠标拖拽定位和DOM各种尺寸详解
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Arcgis for qml - 鼠标拖拽移动
以实现鼠标拖拽文本图层为例 GitHub:ArcGIS拖拽文本 作者:狐狸家的鱼 目的是利用鼠标进行拖拽. 实现两种模式,一种是屏幕上的拖拽,第二种是地图上图层的挪动. 屏幕上的拖拽其实跟ArcGIS ...
随机推荐
- 12-THREE.JS 自然光
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- cocos2d-html5 中的性能优化
游戏开发中,难免会遇到性能瓶颈.图片一多,渲染批次就会直线上升,任何动画都会变得闪动. OpenGL ES优化的问题,主要考虑两个方面:内存存储和运行速度. 2D游戏中的最占内存的就是图片资源,一张图 ...
- Mac安装SSHFS挂载远程服务器上的文件夹到本地
一.安装SSHFUS sshfs依赖于fuse,所以需要先安装fuse,这两个软件都可以在https://osxfuse.github.io/下载到. 注意安装顺序. 二.挂载文件夹到本地 输入一下命 ...
- CANopenSocket 测试
/************************************************************************* * CANopenSocket 测试 * 说明: ...
- 机器学习(六)— logistic回归
最近一直在看机器学习相关的算法,今天学习logistic回归,在对算法进行了简单分析编程实现之后,通过实例进行验证. 一 logistic概述 个人理解的回归就是发现变量之间的关系,也就是求回归系数, ...
- secret CRT 会话光标不闪烁问题
点击 选项->会话选项 然后在取消即可,就有了闪烁的光标,应该是个bug.
- BZOJ1370:[Baltic2003]团伙
浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...
- Oracle导出导入
导出 exp 用户名/密码 file=文件名.dmp full=y; 导入 imp 用户名/密码 file=文件名.dmp full=y; 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP ...
- Nginx解决错误413 Request Entity Too Large
最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报 ...
- 经典SQL问题: 行转列,列转行
情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有 ...