Processing 在同一处理草图中使用Box2D和视频发布

Processing 在同一处理草图中使用Box2D和视频发布,processing,box2d,Processing,Box2d,我正在尝试使用用于处理的Box2D和视频库创建草图。 我有一些盒子四处移动并相互碰撞,我想用一些视频对这些盒子进行纹理处理。 然而,当我输入一行代码告诉处理我想要使用哪个视频文件时,我会收到一条很长的错误消息 import processing.video.*; import shiffman.box2d.*; import org.jbox2d.collision.shapes.*; import org.jbox2d.common.*; import org.jbox2d.dynamics.

我正在尝试使用用于处理的Box2D和视频库创建草图。
我有一些盒子四处移动并相互碰撞,我想用一些视频对这些盒子进行纹理处理。
然而,当我输入一行代码告诉处理我想要使用哪个视频文件时,我会收到一条很长的错误消息

import processing.video.*;
import shiffman.box2d.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;


Box2DProcessing box2d;

int no_boxes = 7;

//All of our boxes
Box[] boxes = new Box[no_boxes];

//Boundry sides
Boundry[] boundry = new Boundry[4];

float angle = -PI/2;
float grav_rad = 30;

float boundr = 260;
float boundw = 30;

PVector direction = new PVector();

Movie mouth;


void setup() {
  size(800,800,P3D);
  frameRate(60);
  colorMode(HSB,360,100,100);
  noStroke();

  //Load the movie
  mouth = new Movie(this,"mouth1.mov");
  mouth.play();

  // Initialize box2d physics and create the world
  box2d = new Box2DProcessing(this);
  box2d.createWorld();

  //Create the boxes
  for (int n=0;n<no_boxes; n++) {
    boxes[n] = new Box(random(200,600), random (200,600));
  }

  //Create the boundries
  boundry[0] = new Boundry(400+boundr,400,boundw,2*boundr+boundw);
  boundry[1] = new Boundry(400-boundr,400,boundw,2*boundr+boundw);
  boundry[2] = new Boundry(400,400+boundr,2*boundr+boundw, boundw);
  boundry[3] = new Boundry(400,400-boundr,2*boundr+boundw, boundw);



}

void movieEvent (Movie m) {
  m.read();
}


void draw() {

  background(200,50,80);
  image(mouth,0,0);

  angle+= radians(0.3);

  direction.x = grav_rad*cos(angle);
  direction.y = grav_rad*sin(angle);

  box2d.setGravity(-direction.x, direction.y);

  camera(width/2.0, height/2.0, (height/2.0) / tan(PI*30.0 / 180.0), width/2.0, height/2.0, 0, 0-map(direction.x,-10,10,-1,1), 0-map(direction.y,-10,10,-1,1), 0);   //x, y, z -> need to change between x and y

  box2d.step();

  // Display all the boxes
  for (Box b: boxes) {
    b.display();
  }

  //display the boundries
  boundry[0].display();
  boundry[1].display();
  boundry[2].display();
  boundry[3].display();

}
导入处理。视频。*;
导入shiffman.box2d.*;
导入org.jbox2d.collision.shapes.*;
导入org.jbox2d.common.*;
导入org.jbox2d.dynamics.*;
box2d处理box2d;
int no_Box=7;
//我们所有的箱子
方框[]方框=新方框[无方框];
//边界边
边界[]边界=新边界[4];
浮动角度=-PI/2;
浮子重力半径=30;
浮动边界=260;
浮动边界w=30;
PVector方向=新PVector();
电影嘴;
无效设置(){
尺寸(800800,P3D);
帧率(60);
彩色模式(HSB,360100100);
仰泳();
//加载电影
mouth=新电影(这是“mouth1.mov”);
嘴。玩();
//初始化box2d物理并创建世界
box2d=新的box2d处理(此);
box2d.createWorld();
//创建框
对于(int n=0;n需要在x和y之间变化
box2d.step();
//显示所有框
用于(框b:框){
b、 显示();
}
//显示边界
边界[0]。显示();
边界[1]。显示();
边界[2]。显示();
边界[3]。显示();
}
以下是我收到的错误消息:

finishLifecycleAction(com.jogamp.opengl.util.FPSAnimator$3):+timeout已达到+main FPSAWTAnimator#00-Timer0
finishLifecycleAction(com.jogamp.opengl.util.FPSAnimator$3):OK false-轮询周期6,阻塞true->res false,等待1002/1000-主FPSAWTAnimator#00-Timer0
-FPSAWTAnimator[开始为真,动画为真,暂停为假,可绘制1,总计[dt 0,第0帧,fps 0.0],模式位1,初始为真,animThread Thread[main FPSAWTAnimator#00-Timer0-FPSAWTAnimator#00-Timer1,5,main],不包括线程假(null)]
[2] :com.jogamp.opengl.util.AnimatorBase.finishLifecycleAction(AnimatorBase.java:634)
[3] :com.jogamp.opengl.util.FPSAnimator.stop(FPSAnimator.java:326)
[4] :processing.opengl.PSurfaceJOGL.stopThread(PSurfaceJOGL.java:722)
[5] :processing.core.PApplet.dispose(PApplet.java:3830)
[6] :processing.core.PApplet.die(PApplet.java:3741)
[7] :processing.core.PApplet.die(PApplet.java:3751)
[8] :processing.video.Movie.initGStreamer(未知源)
[9] :处理。视频。电影。(未知来源)
[10] :旋转_嘴_盒_100620.设置(旋转_嘴_盒_100620.java:58)
[11] :processing.core.PApplet.handleDraw(PApplet.java:2432)
[12] :processing.opengl.PSurfaceJOGL$DrawListener.display(PSurfaceJOGL.java:866)
[13] :jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:692)
[14] :jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:674)
[15] :jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:443)
[16] :jogamp.opengl.gldrawableheloper.invokeGLImpl(gldrawableheloper.java:1293)
[17] :jogamp.opengl.gldrawableheloper.invokeGL(gldrawableheloper.java:1147)
[18] :com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:782)
[19] :com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:81)
[20] :com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:453)
[21]:com.jogamp.opengl.util.FPSAnimator$mainstask.run(FPSAnimator.java:178)
[22]:java.util.TimerThread.mainLoop(Timer.java:555)
[23]:java.util.TimerThread.run(Timer.java:505)


有什么想法吗?我已经成功地分别使用了Box2D和video,但是将它们放在同一个草图中似乎是一个问题。

我不是100%同意这一点,但它看起来像是
P3D
(OpenGL)渲染器需要在一个时间范围内完成初始化,而且有些东西延迟得太久以至于超时

有一个镜头加载电影可能是个问题

如果可以使用默认软件渲染器,请尝试:

size(800,800,JAVA2D);
然后卸下
摄像头()
。希望这在视觉上仍然正常

我现在想不出一个干净的解决办法

另一个解决方法是在
P3D
渲染器准备就绪后初始化电影。例如,如果电影加载已触发,您可以使用额外的布尔变量来跟踪,以确保只发生一次

下面是一个(未经测试的)示例:希望注释能够说明解决方法:

import processing.video.*;
import shiffman.box2d.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;


Box2DProcessing box2d;

int no_boxes = 7;

//All of our boxes
Box[] boxes = new Box[no_boxes];

//Boundry sides
Boundry[] boundry = new Boundry[4];

float angle = -PI/2;
float grav_rad = 30;

float boundr = 260;
float boundw = 30;

PVector direction = new PVector();

Movie mouth;

// keep track if movie load was called
boolean wasMovieLoadCalled = false;

void setup() {
  size(800,800,P3D);
  frameRate(60);
  colorMode(HSB,360,100,100);
  noStroke();

  // Initialize box2d physics and create the world
  box2d = new Box2DProcessing(this);
  box2d.createWorld();

  //Create the boxes
  for (int n=0;n<no_boxes; n++) {
    boxes[n] = new Box(random(200,600), random (200,600));
  }

  //Create the boundries
  boundry[0] = new Boundry(400+boundr,400,boundw,2*boundr+boundw);
  boundry[1] = new Boundry(400-boundr,400,boundw,2*boundr+boundw);
  boundry[2] = new Boundry(400,400+boundr,2*boundr+boundw, boundw);
  boundry[3] = new Boundry(400,400-boundr,2*boundr+boundw, boundw);

}

void movieEvent (Movie m) {
  m.read();
}


void draw() {
  // if load wasn't called
  if(wasMovieLoadCalled == false){

    //Load the movie
    mouth = new Movie(this,"mouth1.mov");
    mouth.play();

    // update the variable so load happens only once
    wasMovieLoadCalled = true;

  }

  background(200,50,80);

  // ensure the movie is loaded before trying to display it
  if(mouth != null){
    image(mouth,0,0);
  }


  angle+= radians(0.3);

  direction.x = grav_rad*cos(angle);
  direction.y = grav_rad*sin(angle);

  box2d.setGravity(-direction.x, direction.y);

  camera(width/2.0, height/2.0, (height/2.0) / tan(PI*30.0 / 180.0), width/2.0, height/2.0, 0, 0-map(direction.x,-10,10,-1,1), 0-map(direction.y,-10,10,-1,1), 0);   //x, y, z -> need to change between x and y

  box2d.step();

  // Display all the boxes
  for (Box b: boxes) {
    b.display();
  }

  //display the boundries
  boundry[0].display();
  boundry[1].display();
  boundry[2].display();
  boundry[3].display();

}
导入处理。视频。*;
导入shiffman.box2d.*;
导入org.jbox2d.collision.shapes.*;
导入org.jbox2d.common.*;
导入org.jbox2d.dynamics.*;
box2d处理box2d;
int no_Box=7;
//我们所有的箱子
方框[]方框=新方框[无方框];
//边界边
边界[]边界=新边界[4];
浮动角度=-PI/2;
浮子重力半径=30;
浮动边界=260;
浮动边界w=30;
PVector方向=新PVector();
电影嘴;
//跟踪是否调用了电影加载
布尔值wasMovieLoadCalled=false;
无效设置(){
尺寸(800800,P3D);
帧率(60);
彩色模式(HSB,360100100);
仰泳();
//初始化box2d物理并创建世界
box2d=新的box2d处理(此);
box2d.createWorld();
//创建框

对于(int n=0;n您的IDE是什么?Ayyy谢谢我整理好了!您对3D渲染器的看法是正确的,当我关闭它时,长长的错误消息消失了。然而,我随后收到另一条错误消息-我忘记将电影文件放在名为“data”的文件夹中,因此代码不知道在哪里可以找到它(!)。这就是它超时的原因,但由于3D渲染器也在其中,它没有给出标准错误消息。无论如何,一旦我将电影放入正确的文件夹中,它现在可以使用3D渲染器和不使用3D渲染器。结果证明这只是一个愚蠢的错误,但感谢您的帮助!!