用于创建同时运行的渲染的处理库

时间:2013-07-11 10:03:28

标签: animation processing

我最近正在处理(http://processing.org/),并希望找出是否有一个库可以帮助我创建两个不同的窗口,这两个窗口渲染同一场景的两个视图。还有任何方法可以直接从一个切换到另一个。

2 个答案:

答案 0 :(得分:1)

我不知道处理中是否存在此类库,但您可以使用基于a recent Processing forum thread的以下代码轻松创建两个窗口

import java.awt.Frame;
import java.awt.MouseInfo;
import java.awt.Point;
PFrame f;
secondApplet s;

void setup () {
  size(500, 500);
  PFrame f = new PFrame();
  frame.setTitle("first window");
}


void draw () {
  background(255);
  s.background(0); // Second window background method

// .... //

}

public class PFrame extends Frame {
  public PFrame() {
    setBounds(0, 0, 500, 500);
    s = new secondApplet();
    setResizable(false);
    add(s); 
    s.init(); 
    show();
    setTitle("second window");
  }
}

public class secondApplet extends PApplet {
  public void setup() {
    size(500, 500);
  }
  public void draw() {
  }
}

然后,您可以根据常见的数据和方法来创建每个窗口中的图形。 我不是专家,但我希望这可以帮助你开始你的项目。

请注意,G4P等GUI库也支持创建多个窗口。

编辑:评论相关代码:

//...//
int x=50;
void draw () {
rect(width/2,0,x,x);
s.rect(s.width/2,0,x+10,x+10);
}
//...//

答案 1 :(得分:1)

这是一个快速而又狡猾的例子:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.*;

ImagePanel view2;
PImage viewport2 = new PImage(400,400,RGB);

void setup(){
  size(800,400,P3D);
  noStroke();

  frame.setSize(400,400);
  frame.setTitle("view 1");

  view2 = new ImagePanel((BufferedImage)viewport2.getNative());
  JFrame v2 = new JFrame("view 2");
  v2.setSize(400,400);
  v2.add(view2);
  v2.show();
}
void draw(){
  background(0);
  lights();
  //view1
  pushMatrix();
    translate(200,200,0);
    rotateX(45);
    rotateY(map(mouseX,0,height,-PI,PI));
    renderScene();
  popMatrix();
  //view2
  pushMatrix();
  translate(600,200,0);
  rotateY(45);
  rotateX(map(mouseX,0,height,-PI,PI));
  renderScene();
  popMatrix();
  viewport2 = get(400,0,400,400);//fetch a screenshot from the invisible side (right side);
  view2.setImage((BufferedImage)viewport2.getNative());
}
void renderScene(){
  pushMatrix();
  box(100);//and other elements here
  popMatrix();
}

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel(BufferedImage img) {
       setImage(img);
    }
    public void setImage(BufferedImage img){
      image = img;
      this.repaint();
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);        
    }

}

有三件事要看:

  1. 生成单独的视图 - 注意草图大小实际上是双倍的,我使用push / pop调用来隔离变换并呈现相同的数据。您也可以使用camera()perspective()功能。
  2. 生成框架。注意Processing使用了一个java.awt.Frame,我使用frame.setSize()调整了大小,并扩展了一个JPanel,以便我可以绘制到Graphics对象中。
  3. 更新图像:我使用get(x,y,width,height)来获取绘制/渲染循环结束时渲染场景的快照PImage。 PImage提供了一个返回BufferedImage表示的getNative()方法。这可以绘制到java.awt.Graphics实例中。我告诉自定义JPanel组件重绘以更新像素。
  4. 这种方法有点苛刻,但你使用相同的草图而不是两个PApplet实例。