« FlexとPV3D その3 | トップページ | フラクタル »

2008年6月20日 (金)

Box2DとPV3Dを合わせる

P_12






















タイトル通りです。

こんな感じです。

Box2Dのワールドを作成して、その座標をPV3Dに反映させているだけ。

PV3Dは、オブジェクトがぴったり合わさるとレンダリングがうまくいかない気がします。







以下、ソースです。

バージョンは2.0.0を利用しています。

(2009/3 ソース書き直しました。)

package
{
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Collision.b2AABB;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2World;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;

import org.papervision3d.cameras.Camera3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;

[SWF(backgroundColor="#ffffff")]

public class Box2D_PV3D1 extends Sprite
{
  // PV3D用基本変数
  private var viewport:Viewport3D;
  private var scene:Scene3D;
  private var camera:Camera3D;
  private var renderer:BasicRenderEngine;
  private var rootNode:DisplayObject3D;

  // Box2D用基本変数
  private var m_world:b2World;
  private var m_iterations:int;
  private var m_timeStep:Number;
  private var m_physScale:Number;

  // Box用変数
  private var BoxBodyArray:Array=new Array();
  private var boxN:int=30;

  // 床用変数
  private var floorBody1:b2Body;
  private var floor:Cube;

  // コンストラクタ
  public function Box2D_PV3D1()
  {
   // 全体の初期設定
   stage.frameRate=60;
   stage.quality=StageQuality.MEDIUM;
   stage.scaleMode=StageScaleMode.NO_SCALE;
   stage.align=StageAlign.TOP_LEFT;

   // PV3Dの初期設定
   viewport=new Viewport3D(0, 0, true, true);
   scene=new Scene3D();
   camera=new Camera3D();
   renderer=new BasicRenderEngine();
   rootNode=scene.addChild(new DisplayObject3D("rootNode"));
   camera.zoom=30;
   camera.focus=30;
   camera.x=-400;
   camera.y=400;
   camera.target=DisplayObject3D.ZERO;
   addChild(viewport);
   addEventListener(Event.ENTER_FRAME, onFrame);

   // Box2Dの初期設定
   m_iterations=30;
   m_timeStep=1 / 60;
   m_physScale=30;
   var worldAABB:b2AABB=new b2AABB;
   worldAABB.lowerBound.Set(-1000.0, -1000.0);
   worldAABB.upperBound.Set(1000.0, 1000.0);
   var gravity:b2Vec2=new b2Vec2(0.0, 10.0);
   var doSleep:Boolean=true;
   m_world=new b2World(worldAABB, gravity, doSleep);

   // Box2Dの床の設定
   var floorDef1:b2PolygonDef=new b2PolygonDef;
   floorDef1.SetAsBox(500 / m_physScale, 5 / m_physScale);
   floorDef1.density=1000.0;
   floorDef1.friction=1.0;
   var floorBD1:b2BodyDef=new b2BodyDef;
   floorBD1.position.Set(250 / m_physScale, 500 / m_physScale);
   floorBody1=m_world.CreateStaticBody(floorBD1);
   floorBody1.CreateShape(floorDef1);
   floorBody1.SetMassFromShapes();

   // PV3Dの床の設定
   var boxcolor:Array=new Array();
   for(var i:int=0; i < 6; i++)
   {
    boxcolor[i]=new ColorMaterial(Math.floor(Math.random() * 0xFFFFFF), 0.6);
   }
   var materials:MaterialsList=new MaterialsList({front:boxcolor[0], back:boxcolor[1], right:boxcolor[2], left:boxcolor[3], top:boxcolor[4], bottom:boxcolor[5]});
   floor=new Cube(materials, 1000, 100, 10, 4, 4);
   rootNode.addChild(floor);

   // Box2DのCubeの設定
   for(var i:int=0; i < boxN; i++)
   {
    var BoxDef1:b2PolygonDef=new b2PolygonDef;
    BoxDef1.SetAsBox(20 / m_physScale, 20 / m_physScale);
    BoxDef1.density=1.0;
    BoxDef1.friction=1.0;
    BoxDef1.restitution=0.3;
    var BoxBD1:b2BodyDef=new b2BodyDef;
    BoxBD1.position.Set(Math.random() * 600 / m_physScale, Math.random() * 300 / m_physScale);
    var BoxBody1:b2Body=m_world.CreateDynamicBody(BoxBD1);
    BoxBody1.CreateShape(BoxDef1);
    BoxBody1.SetMassFromShapes();

    BoxBodyArray[i]=BoxBody1;
   }

   // PV3DのCubeの設定
   for(var i:int=0; i < boxN; i++)
   {
    boxcolor=new Array();
    for(var j:int=0; j < 6; j++)
    {
     boxcolor[j]=new ColorMaterial(Math.floor(Math.random() * 0xFFFFFF), 0.6);
    }
    materials=new MaterialsList({front:boxcolor[0], back:boxcolor[1], right:boxcolor[2], left:boxcolor[3], top:boxcolor[4], bottom:boxcolor[5]});
    var cube:Cube=new Cube(materials, 40, 40, 40, 4, 4);
    rootNode.addChild(cube, "cube" + i.toString());
   }
  }

  // レンダリング用関数
  public function onFrame(e:Event):void
  {
   m_world.Step(m_timeStep, m_iterations);
   for(var bb:b2Body=m_world.m_bodyList; bb; bb=bb.m_next)
   {
    if (bb == floorBody1)
    {
     floor.x=(bb.GetPosition().x) * m_physScale - 200;
     floor.y=-(bb.GetPosition().y) * m_physScale + 300;
     floor.rotationZ=-bb.GetAngle() * (180 / Math.PI);
    }
    for(var i:int=0; i < boxN; i++)
    {
     var boxboy:b2Body=BoxBodyArray[i]as b2Body;
     if (bb == boxboy)
     {
      var cube:Cube=rootNode.getChildByName("cube" + i.toString())as Cube;
      cube.x=(bb.GetPosition().x) * m_physScale - 200;
      cube.y=-(bb.GetPosition().y) * m_physScale + 300;
      cube.rotationZ=-bb.GetAngle() * (180 / Math.PI);
      break;
     }
    }
   }
   renderer.renderScene(scene, camera, viewport);
  }
}
}

|

« FlexとPV3D その3 | トップページ | フラクタル »

ActionScript」カテゴリの記事

Box2DFlashAS3」カテゴリの記事

Papervision3D」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1040194/21762335

この記事へのトラックバック一覧です: Box2DとPV3Dを合わせる:

» Box2d Bookmarks [Post Saver - Website voting and saving system]
Bookmarked your page with keywords box2d! [続きを読む]

受信: 2008年8月30日 (土) 09時45分

« FlexとPV3D その3 | トップページ | フラクタル »