2016-03-22 15 views
0

ShiffmanチュートリアルのProcessing用にbox2dを使用しています。私がしたいのは、ボックスが特定のx座標になると、ボックスの位置を変更することだけです。これは、ボックスクラスのx座標がbox2Dワールドから変換され、下の関数wrapで操作され、次にbox2dワールドに戻されなければならないため、簡単ではありません。box2dシェイプの位置を変更する方法

以下のコードを作成しました。私が持っている問題は、ボックスの位置を変更するために返されたx座標を適用する方法、またはボックスを定義するボディです。私はMCVEを提供しようとしましたが、box2dはコードを拡張します。もし誰かがそれを知っていれば完全なスケッチを投稿する場所があれば素晴らしいだろう。あなたの窓の世界の境界外

import controlP5.*; 
import shiffman.box2d.*; 
import org.jbox2d.collision.shapes.*; 
import org.jbox2d.common.*; 
import org.jbox2d.dynamics.*; 
import org.jbox2d.particle.*; 
import org.jbox2d.pooling.*; 
import javax.swing.*; 
import java.awt.Frame; 
import java.awt.MouseInfo; 
import java.awt.Point; 
//import org.jbox2d.p5.*; 
PApplet s; 
// A reference to our box2d world 
Box2DProcessing box2d; 
ControlP5 cp5; 
Body tbb; 
// A list we'll use to track fixed objects 
ArrayList<Boundary> boundaries; 
// A list for all of our rectangles 
ArrayList<Box> boxes; 
ArrayList<Box> boxes_Clone1; 
ArrayList<Box> boxes_Clone2; 
ArrayList<Box> boxes_Clone3; 
ArrayList<Box> boxes_Clone4; 
PFont f; 
String str; 
float num; 


void setup() { 
    size(840,860); 
    f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on 

    cp5 = new ControlP5(this); 

box2d = new Box2DProcessing(this); 
    box2d.createWorld(); 
    // We are setting a custom gravity 
    box2d.setGravity(0, + 0.1); 
} 

void draw() { 
box2d.step(); 

for (int i = boxes.size()-1; i >= 0; i--) { 
    Box b = boxes.get(i); 
    //b.scale(2); 
    b.wrap(); 
    if (b.done()) { 
     //boxes.remove(i); 
    } 
    // 
    } 

class Box { 

    // We need to keep track of a Body and a width and height 
    Body body; 

    float w; 
    float h; 

    public color col; 
    public float den; 
    public float rest; 
    public float fric; 
public float linVecx; 
public float linVecy; 
    // Constructor 
    Box(float x, float y,color col,float fric,float rest,float den,float linVecx,float linVecy) { 
    this.w = 8; 
    this.h = 8; 
    this.col = col; 
    this.fric=fric; 
    this.rest=rest; 
    this.den=den; 
    this.linVecx=linVecx; 
    this.linVecy=linVecy; 

    // Add the box to the box2d world 
    makeBody(new Vec2(x, y), w, h); 
    } 
void display() { 
    // We look at each body and get its screen position 
    Vec2 pos = box2d.getBodyPixelCoord(body); 
    // Get its angle of rotation 
    float a = body.getAngle(); 
    rectMode(CENTER); 
    pushMatrix(); 
    translate(pos.x, pos.y); 
    rotate(-a); 
    fill(col); 
    noStroke(); 
    //strokeWeight(2); 
    ellipse(0, 0, w, h); 
    popMatrix(); 
    } 

    // This function adds the rectangle to the box2d world 
    void makeBody(Vec2 center, float w_, float h_) { 

    // Define a polygon (this is what we use for a rectangle) 
    PolygonShape sd = new PolygonShape(); 
    float box2dW = box2d.scalarPixelsToWorld(w_/2); 
    float box2dH = box2d.scalarPixelsToWorld(h_/2); 
    sd.setAsBox(box2dW, box2dH); 

    // Define a fixture 
    FixtureDef fd = new FixtureDef(); 
    fd.shape = sd; 
    // Parameters that affect physics 
    fd.density = den; 
    fd.friction = fric; 
    fd.restitution = rest; 

    // Define the body and make it from the shape 
    BodyDef bd = new BodyDef(); 
    bd.type = BodyType.DYNAMIC; 
    bd.linearDamping = 3.0f; 
    bd.position.set(box2d.coordPixelsToWorld(center)); 

    body = box2d.createBody(bd); 
    body.createFixture(fd); 

    // Give it some initial random velocity 
    body.setLinearVelocity(new Vec2(linVecx, linVecy)); 
    body.setAngularVelocity(random(-5, 5)); 

    } 
    float wrap(){ 
    Vec2 pos = box2d.getBodyPixelCoord(body); 
    if (pos.x > 590) { 
     pos.x = 300; 
     return box2d.scalarPixelsToWorld(pos.x); 
     //bd.position = box2d.coordPixelsToWorld(pos.x,pos.y); 

    } 
    return 0; 
} 

答えて

0

図。私が意味することにより、見つける以下:

  • オブジェクトは、それが世界にある左上のウィンドウで(位置0,0)、ですか?
  • オブジェクトがウィンドウ内の右上隅(位置width,0)にある場合、そのオブジェクトは世界でどこにありますか?
  • オブジェクトがウィンドウ内の左下隅(位置0,height)にある場合、その場所はどこですか?
  • オブジェクトがウィンドウ内の右下隅(位置width,height)にある場合、その場所はどこですか?

これらの値がある場合、ワールド空間ですべての境界チェックを実行できます。

Box2Dは初心者のためのものではありませんでした。 Box2Dの準備が整う前に、OOPやデータ構造に精通している必要があります。 Daniel Shiffmanは非常に優れた教師ですが、物理ライブラリを使用する前に戻って少し簡単に試してみてください。

+0

こんにちはケビン。私はそれが、私の物体が世界との関係にあるかどうかを調べることだと思います。それは私が求めていたものではありません。私はボックスのx座標を取得する方法を尋ねていた。 –

+0

@SebastianZekiあなたはすでにこのコードを使っていませんか? 'Vec2 pos = box2d.getBodyPixelCoord(body); if(pos.x> 590){' –

+0

これはボディのx座標です。はい、ボックスがどこにあるかを定義しますが、pos.xをボックスの位置に変換するにはどうすればよいですか? –

関連する問題