Box2D for Processing 및 Video 라이브러리로 스케치를 만들려고합니다.
몇 개의 상자가 움직이고 서로 충돌하고 있습니다.이 상자를 비디오로 텍스처링하고 싶습니다.
그러나 사용하려는 비디오 파일을 처리하는 코드 줄을 입력하자마자 긴 오류 메시지가 표시됩니다.
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) : 확인 false- pollPeriod 6, 블로킹 true-> res false, 기다린 1002/1000-main-FPSAWTAnimator # 00-Timer0
-com.jogamp.opengl.util.FPSAnimator [started true, animating true, paused false, drawable 1, totals [dt 0, 프레임 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 (알 수없는 소스)
[9] : processing.video.Movie. (알 수없는 소스)
[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와 비디오를 별도로 성공적으로 사용했지만 동일한 스케치에 두는 것이 문제인 것 같습니다.
저는 100 %는 아니지만 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();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다