永发信息网

java环境下,如何实现3D图形的自动旋转?

答案:2  悬赏:60  手机版
解决时间 2021-02-13 05:02
java环境下,如何实现3D图形的自动旋转?
最佳答案
程序实现思路: 在javafx中Node对象有一个effect属性,可以用于实现各种特效。PerspectiveTransform特效可以使Node对象实现透视变换。因此我们可以通过计算透视变换中每个点的位置来实现3D翻转特效。

实现步骤: 1、定义FlipView对象。包含以下属性:
复制代码 代码如下:

//正面视图
public Node frontNode;
//反面视图
public Node backNode;
//是否翻转
boolean flipped = false;
//翻转角度
DoubleProperty time = new SimpleDoubleProperty(Math.PI / 2);
//正面翻转特效
PerspectiveTransform frontEffect = new PerspectiveTransform();
//反面翻转特效
PerspectiveTransform backEffect = new PerspectiveTransform();

create方法返回需要显示的内容:
复制代码 代码如下:

private void create() {
time.addListener(new ChangeListener() {
@Override
public void changed(ObservableValue arg0,
Number arg1, Number arg2) {
setPT(frontEffect, time.get());
setPT(backEffect, time.get());
}
});
anim.getKeyFrames().addAll(frame1, frame2);
backNode.visibleProperty().bind(
Bindings.when(time.lessThan(0)).then(true).otherwise(false));

frontNode.visibleProperty().bind(
Bindings.when(time.lessThan(0)).then(false).otherwise(true));
setPT(frontEffect, time.get());
setPT(backEffect, time.get());
frontNode.setEffect(frontEffect);
backNode.setEffect(backEffect);
getChildren().addAll(backNode, frontNode);
}

以上代码需要注意的是: 随着time值的变化frontEffect和backEffect的值也会随着变换。 2、PerspectiveTransform特效的实现使用了Math.sin()和Math.cos()方法模拟3D角度变换。 具体实现如下:
复制代码 代码如下:

private void setPT(PerspectiveTransform pt, double t) {
double width = 200;
double height = 200;
double radius = width / 2;
double back = height / 10;
pt.setUlx(radius - Math.sin(t) * radius);
pt.setUly(0 - Math.cos(t) * back);
pt.setUrx(radius + Math.sin(t) * radius);
pt.setUry(0 + Math.cos(t) * back);
pt.setLrx(radius + Math.sin(t) * radius);
pt.setLry(height - Math.cos(t) * back);
pt.setLlx(radius - Math.sin(t) * radius);
pt.setLly(height + Math.cos(t) * back);
}

3、角度变换在1秒的时间内从3.14/2变换到-3.14/2。
复制代码 代码如下:

KeyFrame frame1 = new KeyFrame(Duration.ZERO, new KeyValue(time,
Math.PI / 2, Interpolator.LINEAR));
KeyFrame frame2 = new KeyFrame(Duration.seconds(1),
new EventHandler() {
@Override
public void handle(ActionEvent event) {
flipped = !flipped;
}
}, new KeyValue(time, -Math.PI / 2, Interpolator.LINEAR));

4、FlipView对象的创建:通过构造函数可以很方便的创建FlipView对象.
复制代码 代码如下:

ImageView image1 = new ImageView(new Image(getClass()
.getResourceAsStream("lion1.png")));
ImageView image2 = new ImageView(new Image(getClass()
.getResourceAsStream("lion2.png")));
FlipView flip = new FlipView(image1, image2);
全部回答
java 3d,java(现在oracle)官网下载,里面有例子
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我的电脑打不开了,用u盘重装系统,装不起,b
乔森怎么去啊,有知道地址的么
国外最火的网红猫,猫咪长出人手是什么样的
祥顺合全羊馆在哪里啊,我有事要去这个地方
我喝多了,回家倒头就睡,在卧室脱的外衣,但
人类和野生动物能否和谐相处?如何才能和谐相
汽车空调制冷的原理是凝固吸热还是凝固放热还
BoBi卤肉面地址在什么地方,想过去办事
校园网IPV6突然用不了了
周口职业技术学院3年过后发的是中专还是大专?
弯弯的月亮像什么请列出30个不管多少 能写几
男人到50岁为何不愿跟老婆在一起睡,是不是男
餐厅里顾客刁难服务员.顾客用八宝饭换绿茶之
桦甸市图书馆地址在哪,我要去那里办事
前杨红木厂在什么地方啊,我要过去处理事情
推荐资讯
电视剧里吻戏是真吻吗?
大师好,雪佛来景程更换门把手,怎么拆?
橙子生产于什么地方(选填南方和北方)
【西游记梗概】西游记全文概括800字
一个分数,分子与分母之和是80,如果分子加22,
体育彩票(贤官街桥西路南90米体育彩票)地址在
爱奇艺中能相互传视频吗
佳源公寓城南店地址在什么地方,想过去办事
为什么很少人用毛妹大招加半藏大招
咸阳颐福阁老年公寓在哪里啊,我有事要去这个
女朋友跟我说她去聚会,她在想什么 我该给她说
【希望之翼】希望之翼的英语怎么写有的给我说
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?