【问题标题】:What processing library to use to create simultaneously running renders使用什么处理库来创建同时运行的渲染
【发布时间】:2013-12-24 10:11:14
【问题描述】:

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

【问题讨论】:

    标签: animation processing


    【解决方案1】:

    我不知道 Processing 是否存在这样的库,但是您可以使用以下基于 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);
    }
    //...//
    

    【讨论】:

    • 哦,谢谢。但是我对有公共变量有一个疑问。我想要某种可以在两个绘图函数中访问的变量。但是当我尝试这样做时,会发生两种渲染都发生在同一个窗口中并具有视觉结果。
    • 您可以通过一种绘制方法管理两个窗口(请参阅编辑后的答案)。这不是最有效的方法,但到目前为止,我不知道更好。真正的 Java 程序员可以为您提供更详细的解决方案。
    【解决方案2】:

    这是一个快速而简单的例子:

    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);        
        }
    
    }
    

    有 3 件事要看:

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

    这种方法有点老套,但您使用的是具有相同变量的相同草图,而不是两个 PApplet 实例。

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多