在Processing中使用Box2D和视频出现问题

3

我想使用Processing和Video库创建一个包含Box2D的草图。
我有一些移动并相互碰撞的盒子,并且我希望使用一些视频来纹理这些盒子。
然而,一旦我加入告诉Processing我要使用哪个视频文件的代码行,就会得到一个很长的错误消息。

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

}

这是我收到的错误信息:

finishLifecycleAction(com.jogamp.opengl.util.FPSAnimator$3): ++++++ 达到超时时间 ++++++ main-FPSAWTAnimator#00-Timer0
finishLifecycleAction(com.jogamp.opengl.util.FPSAnimator$3): OK false- pollPeriod 6, blocking true -> 结果 false,等待了1002/1000 - main-FPSAWTAnimator#00-Timer0
- com.jogamp.opengl.util.FPSAnimator [started true, animating true, paused false, drawable 1, totals[dt 0, frames 0, fps 0.0], modeBits 1, init'ed true, animThread Thread[main-FPSAWTAnimator#00-Timer0-FPSAWTAnimator#00-Timer1,5,main], exclCtxThread false(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(Unknown Source)
[9]: processing.video.Movie.(Unknown Source)
[10]: Rotating_mouth_boxes_100620.setup(Rotating_mouth_boxes_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.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1293)
[17]: jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.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$MainTask.run(FPSAnimator.java:178)
[22]: java.util.TimerThread.mainLoop(Timer.java:555)
[23]: java.util.TimerThread.run(Timer.java:505)

任何想法?我已经成功地分别使用了Box2D和视频,但是将它们放在同一个草图中似乎存在问题。

你用的是什么集成开发环境? - laancelot
1个回答

3

我不能百分之百确定,但似乎P3D(OpenGL)渲染器需要在特定时间内完成初始化,某些延迟导致超时。

加载影片可能是问题所在。

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

size(800,800,JAVA2D);

并删除camera()。希望这样视觉效果仍然不错。

目前我想不到一个简洁的解决方案。

另一个解决方法是在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();

}

1
谢谢,我解决了!你说得对,是3D渲染器的问题,当我关闭它时,那个长错误消息就消失了。 然而,我又遇到了另一个错误消息——我忘记把电影文件放在名为“data”的文件夹中,所以代码不知道在哪里找到它。这就是为什么它会超时,但由于3D渲染器也在其中,它没有给出标准的错误消息。 无论如何,一旦我把电影放在正确的文件夹中,它现在可以使用3D渲染器和不使用3D渲染器都能正常工作了。结果只是一个愚蠢的错误,但还是感谢你的帮助! - Emma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接