
正文
旋转视频java代码 javafx 旋转
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
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? extends Number 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);
相关问答
Q1: 利用java实现图片翻转的代码
重载渲染控件的paintComponent(Graphics
g)方法.
设你当前图像实例为img,已初始化,需要旋转的角度为ang
public
void
paintComponent(Graphics
g){
super.paintCompoent(g);
Graphics2D
g2d
=
(Graphics2D)g;
g2d.rotate(-angle);
g2d.drawImage(img,0,0,this.getWidth(),this.getHeight(),null);
}
Graphics,Graphics2D
类中有对当前描绘环境进行仿射变换的方法,包括translate,scale,rotate,也可以直接设置仿射变换矩阵,利用这点就可以根据所需要的实现方式来进行描绘.
Q2: 求java做动画代码
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class TestImage extends Frame
{
private static final long serialVersionUID = 1L;
private static boolean PRESSED = false;
private static int pointX = 0;
private static int pointy = 200;
private static int RIGHT_GO = 0;
private static int LEFT_GO = 0;
private static int DIR = 0;
private static int ANGLE = 0;
private static int W = 50;
private static int H = 60;
private _Canvas canvas = null;
public TestImage ()
{
add (canvas = new _Canvas ());
setIgnoreRepaint (true);
requestFocus ();
}
public class _Canvas extends Canvas implements Runnable
{
private static final long serialVersionUID = 1L;
private BufferedImage bi = null;
private Image bufferedImage = null;
private Thread thread = null;
private long sleepTime = 10;
public _Canvas ()
{
try
{
bi = ImageIO.read (new File ("go.png"));
}
catch (IOException e)
{}
setBackground (Color.BLACK);
requestFocus ();
addKeyListener (new KeyListener ()
{
@Override
public void keyTyped ( KeyEvent e )
{}
@Override
public void keyReleased ( KeyEvent e )
{
RIGHT_GO = 0;
PRESSED = false;
}
@Override
public void keyPressed ( KeyEvent e )
{
// 38 40 37 39上下左右
DIR = e.getKeyCode ();
PRESSED = true;
}
});
}
@Override
public void paint ( Graphics g )
{
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint (RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.drawImage (rotateImage (bi.getSubimage (RIGHT_GO, LEFT_GO, W, H), ANGLE, true), pointX, pointy, W, H,
this);
g2d.dispose ();
}
@Override
public void update ( Graphics g )
{
if (null == bufferedImage)
{
bufferedImage = createImage (getWidth (), getHeight ());
}
Graphics bufferedG = bufferedImage.getGraphics ();
bufferedG.clearRect (0, 0, getWidth (), getHeight ());
paint (bufferedG);
bufferedG.dispose ();
g.drawImage (bufferedImage, 0, 0, this);
g.dispose ();
}
public void start ()
{
thread = new Thread (this);
thread.setName ("TestImage");
thread.setPriority (Thread.MIN_PRIORITY);
thread.start ();
}
public synchronized void stop ()
{
thread = null;
notify ();
}
@Override
public void run ()
{
Thread me = Thread.currentThread ();
while (thread == me !isShowing () || getSize ().width == 0)
{
try
{
Thread.sleep (555);
}
catch (InterruptedException e)
{
return;
}
}
while (thread == me isShowing ())
{
if (PRESSED)
{
try
{
if (DIR == 39)
{
RIGHT_GO = RIGHT_GO + 50;
LEFT_GO = 0;
pointX = pointX + 1;
if (pointX 420)
{
ANGLE = 90;
pointX--;
pointy--;
W = 60;
H = 50;
}
if (RIGHT_GO 50)
{
RIGHT_GO = 0;
}
}
else if (DIR == 37)
{
pointX = pointX - 1;
RIGHT_GO = RIGHT_GO + 50;
LEFT_GO = 60;
if (pointX 0)
{
ANGLE = -90;
pointX++;
pointy--;
W = 60;
H = 50;
}
if (RIGHT_GO 50)
{
RIGHT_GO = 0;
}
}
else if (DIR == 38)
{
W = 50;
H = 60;
pointy = 150;
ANGLE = 0;
RIGHT_GO = 100;
}
else if (DIR == 40)
{
W = 50;
H = 60;
ANGLE = 0;
pointy = 200;
RIGHT_GO = 0;
}
Thread.sleep (sleepTime);
repaint ();
}
catch (InterruptedException e)
{
break;
}
}
else
{
RIGHT_GO = RIGHT_GO + 50;
LEFT_GO = 0;
pointX = pointX + 1;
if (RIGHT_GO 50)
{
RIGHT_GO = 0;
}
if (pointX 500)
{
pointX = 0;
}
try
{
Thread.sleep (sleepTime);
repaint ();
}
catch (InterruptedException e)
{
break;
}
}
}
thread = null;
}
}
/**
* 旋转图像为指定角度
*
* @param degree
* @return
*/
public static BufferedImage rotateImage ( final BufferedImage image, final int angdeg, final boolean d )
{
int w = image.getWidth ();
int h = image.getHeight ();
int type = image.getColorModel ().getTransparency ();
BufferedImage img;
Graphics2D graphics2d;
( graphics2d = ( img = new BufferedImage (w, h, type) ).createGraphics () ).setRenderingHint (
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.rotate (d ? -Math.toRadians (angdeg) : Math.toRadians (angdeg), w / 2, h / 2);
graphics2d.drawImage (image, 0, 0, null);
graphics2d.dispose ();
return img;
}
public static void main ( String[] args )
{
EventQueue.invokeLater (new Runnable ()
{
@Override
public void run ()
{
final TestImage ti = new TestImage ();
ti.setSize (new Dimension (500, 300));
ti.setLocationRelativeTo (null);
ti.addWindowListener (new WindowAdapter ()
{
@Override
public void windowClosing ( WindowEvent e )
{
System.exit (0);
}
@Override
public void windowDeiconified ( WindowEvent e )
{
ti.canvas.start ();
}
@Override
public void windowIconified ( WindowEvent e )
{
ti.canvas.stop ();
}
});
ti.setResizable (false);
ti.canvas.start ();
ti.setVisible (true);
}
});
}
}
Q3: Java代码如何实现炮台旋转,求代码例子
实现方式有很多如果你用我提供给你的估计到时候你的绘制或者碰撞可能也要改
我用的方法是用一个矩阵存旋转角度以及当前位置等相关信息 可能有点复杂
/** 设置朝向为指定弧度 */
public void setOrientation(double orientation) {
if (this.orientation == orientation) {
return;
}
if (points != null) {
double x, y;
double sin = Math.sin(orientation - this.orientation);
double cos = Math.cos(orientation - this.orientation);
for (int i = 1; i points.length; i += 2) {
x = points[i - 1] - gravity.x;
y = points[i] - gravity.y;
points[i - 1] = x * cos - y * sin + gravity.x;
points[i] = x * sin + y * cos + gravity.y;
}
setBounds();
}
matrix.translate(center.x, center.y);
matrix.rotate(orientation - this.orientation);
matrix.translate(-center.x, -center.y);
this.orientation = orientation;
}
public void paint(World world, Graphics2D g2d, AffineTransform at) {
at.setTransform(matrix.m00, matrix.m10, matrix.m01, matrix.m11, matrix.m02, matrix.m12);
g2d.drawRenderedImage(image, at);
at.setTransform(head.matrix.m00, head.matrix.m10, head.matrix.m01, head.matrix.m11, head.matrix.m02,
head.matrix.m12);
g2d.drawRenderedImage(head.image, at);
}
public void move() {
double x = Camera.getXOnWorld();
double y = Camera.getYOnWorld();
Vector.VECTOR.set(head.gravity.x, head.gravity.y);
head.matrix.transform(Vector.VECTOR);
head.setOrientation(Math.atan2(y - Vector.VECTOR.y, x - Vector.VECTOR.x));
move(SystemEvent.VK_W, SystemEvent.VK_S, SystemEvent.VK_A, SystemEvent.VK_D);
}
你如果只要求看起来是旋转的效果且炮台不再移动的话建议你用Graphics2D的下面这个方法用完之后麻烦再调用一次方向前面加个负号转回去就没啥问题了
public abstract void rotate(double theta,
double x,
double y)
将当前的 Graphics2D Transform 与平移后的旋转转换连接。后续呈现的变换如下:平移到指定位置,旋转指定弧度,然后向回平移相同的距离。这等同于以下调用序列: translate(x, y);
rotate(theta);
translate(-x, -y);
使用正角度 theta 进行旋转,可将正 x 轴上的点转向正 y 轴。
参数:theta - 旋转的角度,以弧度为单位x - 旋转原点的 x 坐标y - 旋转原点的 y 坐标
Q4: Java的Graphics2D的rotate这函数来旋转图片,转动后导致锯齿
用原始图旋转各个角度旋转视频java代码,而不用旋转后旋转视频java代码的已损图再转..
可以避免。。通常就够旋转视频java代码了。
实在效果不好可以放大八倍再转再缩小....
Q5: 这是个旋转正方体的java代码,请高手添加注释和必要的说明
import java.awt.*;
import java.applet.*;
public class Wuerfel extends Applet {
double p[][] = new double[9][4]; //绘制正方体旋转视频java代码的顶点的数组
int x=1, y=2, z=3;
public void init() {
setSize(600, 480);
setBackground(new Color(255,255,255)); //背景色设置为白色
p[1][x] = -100; p[1][y] = -100; p[1][z] = -100; //下列数组为正方体的各个边
p[2][x] = +100; p[2][y] = -100; p[2][z] = -100;
p[3][x] = +100; p[3][y] = -100; p[3][z] = +100;
p[4][x] = -100; p[4][y] = -100; p[4][z] = +100;
p[5][x] = -100; p[5][y] = +100; p[5][z] = -100;
p[6][x] = +100; p[6][y] = +100; p[6][z] = -100;
p[7][x] = +100; p[7][y] = +100; p[7][z] = +100;
p[8][x] = -100; p[8][y] = +100; p[8][z] = +100;
}
double angle_x = 0.01; //X轴旋转速度旋转视频java代码,参数越大,转速越大
double angle_y = 0.0075; //Y轴旋转速度旋转视频java代码,参数越大,转速越大
double angle_z = 0.005; //Z轴旋转速度旋转视频java代码,参数越大,转速越大
Image buffer;
Graphics2D gBuffer;
public void paint(Graphics g) { //绘图方法
if (buffer==null) {//判定程序是否为初始化,即正方体是否已经被绘制
buffer=createImage(this.getSize().width, this.getSize().height);
//获取关于Image的Graphics2D对象旋转视频java代码,用于绘图
gBuffer=(Graphics2D)buffer.getGraphics();
}
//清空绘图区域
gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);
//设置图像的表现模式,此处设置图形抗锯齿
gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//以下为汇整整个正方体
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[2][x])+200,(int)(p[2][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[3][x])+200,(int)(p[3][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[4][x])+200,(int)(p[4][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[1][x])+200,(int)(p[1][y])+200);
gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[6][x])+200,(int)(p[6][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[7][x])+200,(int)(p[7][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
gBuffer.drawLine((int)(p[8][x])+200,(int)(p[8][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,(int)(p[8][x])+200,(int)(p[8][y])+200);
g.drawImage (buffer, 0, 0, this);//完成整个空间的绘制
try {
//线程休眠10毫秒,此处的作用相当于给旋转正方体一个时间间隔,若不休眠,正方体的旋转式不容易看出的
Thread.sleep(10);
} catch (InterruptedException e) {}
double px, py, pz; //正方体顶点旋转后坐标
for (int i=1;i9;i++) {
px = p[i][x]; //顶点旋转前X坐标
py = p[i][y]; //顶点旋转前Y坐标
pz = p[i][z]; //顶点旋转前Z坐标
//X轴旋转变换
p[i][y] = py*Math.cos(angle_x)-pz*Math.sin(angle_x);
p[i][z] = py*Math.sin(angle_x)+pz*Math.cos(angle_x);
py = p[i][y]; //X轴变换后坐标
pz = p[i][z];
//Y轴旋转变换
p[i][x] = px*Math.cos(angle_y)+pz*Math.sin(angle_y);
p[i][z] =-px*Math.sin(angle_y)+pz*Math.cos(angle_y);
px = p[i][x]; //变换后坐标
//Z轴旋转变换
p[i][x] = px*Math.cos(angle_z)-py*Math.sin(angle_z);
p[i][y] = py*Math.cos(angle_z)+px*Math.sin(angle_z);
}
repaint(); //重绘,即重新调用paint方法
}
public void update(Graphics g) {paint(g);}
}
这个类最核心的地方还是在paint方法,paint中最核心的部分又是关于坐标的旋转变换和sleep休眠,整个程序看下来还是不难理解的.
程序通过二维数组存储正方体的顶点坐标,初次绘制,然后调用线程重复旋转变换顶点坐标,然后重绘变换后的顶点坐标.因为有sleep,所以每次时间间隔后重绘的图像会和前一图像连续形成整体旋转动画。
关于旋转速度参数很重要,整个程序可以通过改变它来控制转速。
旋转视频java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于javafx 旋转、旋转视频java代码的信息别忘了在本站进行查找喔。







