私のサイトで必要なインポートと動作デモのビデオを表示するには、ここをクリックしてください。
上のビデオに表示されているように、DAE クラスとは対照的に、Collada クラスを使用していることに気付きました。どちらも動作が少し異なります。
これを正しく行っている可能性が非常に高く、モデルまたはテクスチャに問題がある可能性があることに注意することも重要です。テクスチャがロードされていない場合は、コンソールからすぐにわかるはずです。ColorMaterial を作成してみて、「all」プロパティを作成した ColorMaterial に設定する MaterialsList オブジェクトを作成します。最後に、インスタンス化またはロード メソッドを介して、リストを Collada または DAE クラスのインスタンス化に渡します。また、カメラがズームインして閉じていないことを確認してください。3D オブジェクトが背後に残る可能性があります。すべてのモデルが同じスケールになるわけではなく、DAE とは対照的に、Collada クラスを使用すると、上のビデオ リンクに示されているように、モデルがかなり大きくなるようです。
最近、Tony Hawk XI Web サイトの準備のために、FlarToolkit / Papervision3D / Collada のパートナーシップで遊ぶ時間がたくさんありました。
-何が必要
- IDE、私は FlashDevelop3 RC2 を使用していますが、Flex Builder またはお好みの IDE で動作します。
- Papervision3D 2.0 Whiteshark (最新ビルド)
- Flex 3.3 SDK
- 忍耐
-モデルの検索と準備
- Collada ファイルにGoogle 3D Warehouseを使用します。
- 次に、「.skp」スケッチアップ ファイルを Google Sketchup に取り込みます。
- スケッチアップ ウィンドウにフォーカスがあることを確認し、CTRL と A を同時に押します。(すべて選択)
- 編集に向かい、ドロップダウン リストの一番下に移動すると、通常、選択したグループの数が表示されます。
- 爆発を選択します。
- 爆発しなくなるまで繰り返します。(想定どおりにローポリ モデルを使用している場合、これにはそれほど時間はかかりません。)
- CTRL + A でもう一度すべてを選択します。
- [ファイル] > [エクスポート] > [3D モデル] に移動し、".dae" を選択します //Sketchup を所有していない場合、拡張子 .dae は利用できません。回避策を調べてください :) (基本的に、.dae は ".skp" でラップされています)
- これで、.dae ファイルと、同じ正確な名前のフォルダーが作成され、その中にモデルに関連するテクスチャーが含まれます。
- モデルのインポート/解析と表示
package
{
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.media.Camera;
import flash.media.Video;
import flash.utils.ByteArray;
import org.libspark.flartoolkit.core.FLARCode;
import org.libspark.flartoolkit.core.param.FLARParam;
import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData;
import org.libspark.flartoolkit.core.transmat.FLARTransMat;
import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector;
import org.libspark.flartoolkit.pv3d.FLARBaseNode;
import org.libspark.flartoolkit.pv3d.FLARCamera3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.LazyRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.parsers.Collada;
import org.papervision3d.objects.parsers.DAE;
/**
* ...
* @author Brian Hodge
*/
public class Main extends Sprite
{
[Embed(source="../lib/camera_para.dat", mimeType="application/octet-stream")]
private var CameraParameters:Class;
[Embed(source="../lib/collada.pat", mimeType="application/octet-stream")]
private var MarkerPattern:Class;
private var cameraParameters:FLARParam;
private var markerPattern:FLARCode;
private var raster:FLARRgbRaster_BitmapData;
private var detector:FLARSingleMarkerDetector;
private var cam:Camera;
private var vid:Video;
private var capture:BitmapData;
private var cam3D:FLARCamera3D;
private var scene3D:Scene3D;
private var viewPort:Viewport3D;
private var mainContainer:FLARBaseNode;
private var renderer:LazyRenderEngine;
private var trans:FLARTransMatResult;
private var prevSet:Boolean = false;
private var prevZ:Number = 0;
private var _collada:Collada;
private var _dae:DAE;
public function Main():void
{
cameraParameters = new FLARParam();
cameraParameters.loadARParam(new CameraParameters() as ByteArray);
markerPattern = new FLARCode(16, 16);
markerPattern.loadARPatt(new MarkerPattern());
cam = Camera.getCamera();
cam.setMode(640, 480, 30);
vid = new Video();
vid.width = 640;
vid.height = 480;
vid.attachCamera(cam);
addChild(vid);
capture = new BitmapData(vid.width, vid.height, false, 0x0);
capture.draw(vid);
raster = new FLARRgbRaster_BitmapData(capture);
detector = new FLARSingleMarkerDetector(cameraParameters, markerPattern, 80);
cam3D = new FLARCamera3D(cameraParameters);
scene3D = new Scene3D();
mainContainer = new FLARBaseNode();
scene3D.addChild(mainContainer);
viewPort = new Viewport3D(vid.width, vid.height);
viewPort.scaleX = viewPort.scaleY = 2;
addChild(viewPort);
renderer = new LazyRenderEngine(scene3D, cam3D, viewPort);
_dae = new DAE();
_dae.load("assets/dae/apc.dae");
_dae.rotationZ -= 90;
mainContainer.addChild(_dae);
/*
_collada = new Collada("assets/dae/apc.dae");
_collada.scale = 0.05;
_collada.rotationZ -= 90;
mainContainer.addChild(_collada);
*/
trans = new FLARTransMatResult();
this.addEventListener(Event.ENTER_FRAME, mainEnter);
}
private function mainEnter(e:Event):void
{
capture.draw(vid);
if (detector.detectMarkerLite(raster, 80) && detector.getConfidence() > 0.5)
{
detector.getTransformMatrix(trans);
mainContainer.setTransformMatrix(trans);
mainContainer.visible = true;
renderer.render();
}
else
{
mainContainer.visible = false;
renderer.render();
}
}
}
}
うまくいけば、これらすべてがあなたの役に立てば幸いです。ただ、このゲームで遊んで、慣れ親しんでいくことをお勧めします。