在Java 3D中载入外部3D模型文件

Java 3D虽然能支持众多的外部3D模型文件,但能支持被Java 3D使用的外部模型文件仅为.obj和.lwd两种;分别对应ObjectFile类和Lw3dLoader类。相比之下几款主流的3D建模软件都能生成.obj格式的文件,因此本文主要介绍使用ObjectFile类载入.obj文件的方法。

 

ObjectFile类有三个构造方法,分别为:
ObjectFile()
ObjectFile(int flags)
ObjectFile(int flags, float radians)
其中flags为一个整型的常量参数,用于决定载入的3D模型以什么方式生成。
参数radians用于决定载入模型的可显示半径。

 

flags参数可在以下四个值之间任取一个或者用逻辑或("|")将几个参数组合使用。
ObjectFile.RESIZE:忽略被载入的模型大小,直接把载入的模型放在一个范围在(1,1,1)到(-1,-1,-1)之间的立方体空间内,并把坐标原点设为(0,0,0)。
ObjectFile.REVERSE:反转载入的外部模型,即可能看模型的后面。
ObjectFile.TRIANGULATE:将模型的面以三角形方式显示,此参数主要便于观察模型凹凸面。
ObjectFile.STRIPIFY:以模型文件内模型的实际情况显示,此参数也是默认参数。

 

当初始化了ObjectFile对象后就可以用load方法载入.obj格式的文件,如果模型中已包含了贴图和光照的话也将一起被载入。load方法需要一个参数用于指出.obj格式文件所在的路径,load方法有多个重载方法可以使参数即可以接受String类的值也可以接受Url类的值或者从输入法流读入,如果模型载入成功将返回一个Scene类的对象,如果载入失败将抛异常。Java 3D针对load方法定义了三个异常类:
FileNotFoundException类:表示文件未找到。
IncorrectFormatException类:表示文件格式不正确。
ParsingErrorException类:装载器解析文件时出错。

 

下面的代码用以演示如何用load方法将一个模型载入到Scene类的实例:

虽然至此我们已经载入了一个.obj格式文件的3D模型,但把它载入到场景后我们却模型并没有按我们想像的那么显示。对比在3D建模工具中看到模型的样子,我们的模型被绕X轴逆时针的旋转了90度,这主要是Java 3D的坐标系和大多数的3D建模工具的坐标系不同。我们假设用户的显示器是垂直于桌面上,那么在Java 3D中显示器的宽代表X轴,显示器的高代表Y轴,显示器垂直朝向用户的方法为Z轴(此方向也是Z轴的正数方向)。而多数的建模工具使用的是世界坐标系,即将显示器的高代表Z轴。

 

因此我们需要在程序将模型绕X轴顺时针旋转90度,旋转轴坐标的方法是使用Transform3D类的rotX方法,相应的还有rotY和rotZ方法。

注意:这里有一个容易混淆的概念,就是我们刚才的步骤是旋转的坐标系,而不是模型,模型是附加在坐标系的上,没有法被旋转。而在刚才的步骤完成后就是将Z轴转向了上方(即显示器的高),而此时场中如还有其它的模型的话,它们的坐标未受影响,仍是Java 3D的坐标系。

通常情况下我们载入的模型大小并不是我们所要的,我们必须要在场景中对模型进行缩放操作。Java 3D中对模型进行缩放需要用到Transform3D的setScale方法,方法可以接收一个double值或一个Vector3d对象的实例,当使用double值做参数时模型将在XYZ轴上使用同样的比例因子进行缩放,而Vector3d实例则可以分别为XYZ轴指定不同的比例因子,比例因子越接近0,模型就越小,当设为0时模型即小的不可见了。
t3d.setScale(0.05d);

t3d.setScale(new Vector3d(0.01d,0,02d,0.03d));

 

好了,现在我将代码整理如下:

Gamemain.java 程序主入口

ScreenManager.java 窗口框架类

LoadModelDemo.java 演示载入一个外部3D模型文件

ColourTile.java 实现一个平面用于地面中的单块地砖

CheckedFloor.java 实现场景中的地面

 

GameMain.java

 

ScreenManager.java

 

LoadModelDemo.java

 

ColouredTile.java

 

CheckedFloor.java

以上程序皆来本人研究国外书籍中的代码而来,故有些说法会有不正确的地方还请指教

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greentea107

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值