
Berkaitan dengan pekerjaan saya tentang Augmented Reality yang salah satu fiturnya yaitu harus dapat menampilkan objek 3D yang berbeda-beda untuk tiap marker yang berbeda-beda pula, maka saya modifikasi file contoh standar yang awalnya hanya menampilkan satu objek COLLADA pada marker menggunakan FLARManager v1.1, FLARToolkit, dan Away3D (FLARManagerTutorial_Collada_Away3D.as). Metode untuk melakukannya saya adaptasikan dari kode milik lOOney dOOdle pada link ini yang masih menggunakan Papervision3D sebagai Flash 3D engine (dan FLARManager versi sebelumnya), sedemikian sehingga file hasil modifikasinya (MultiMarkerMultiCollada.as) menjadi seperti ini:
package examples {
import away3d.animators.Animator;
import away3d.animators.BonesAnimator;
import away3d.containers.ObjectContainer3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.core.utils.Cast;
import away3d.events.Loader3DEvent;
import away3d.lights.DirectionalLight3D;
import away3d.loaders.AbstractParser;
import away3d.loaders.Collada;
import away3d.loaders.Loader3D;
import away3d.loaders.utils.AnimationLibrary;
import away3d.materials.BitmapMaterial;
import com.transmote.flar.FLARManager;
import com.transmote.flar.camera.FLARCamera_Away3D;
import com.transmote.flar.camera.FLARCamera_PV3D;
import com.transmote.flar.marker.FLARMarker;
import com.transmote.flar.marker.FLARMarkerEvent;
import com.transmote.flar.tracker.FLARToolkitManager;
import com.transmote.flar.utils.geom.AwayGeomUtils;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.geom.Vector3D;
import flash.utils.getTimer;
/**
* This file (MultiMarkerMultiCollada.as) is modification of the standard
* example file to display collada-formatted model using FLARManager v1.1,
* FLARToolkit, and Away3D (FLARManagerTutorial_Collada_Away3D.as) authored
* by Eric Socolofsky (http://transmote.com/flar). The collada model used
* for this example (mario_testrun.dae) comes from Away3D's examples.
*
* The method to display multiple colladas on multiple markers is derived
* from a code to display multiple colladas on multiple markers using
* previous version of FLARManager, FLARToolkit, and Papervision3D
* (http://www.looneydoodle.com/MultiMarkerMultiCollada.zip) authored by
* Arunram Kalaiselvan aka lOOney dOOdle (http://www.looneydoodle.com/).
*
* @author Fathah Noor Prawita
* @url http://blog.fathah.net
*/
public class MultiMarkerMultiCollada extends Sprite {
private var flarManager:FLARManager;
private var view:View3D;
private var camera3D:FLARCamera_Away3D;
private var scene3D:Scene3D;
private var light:DirectionalLight3D;
private var activeMarker:FLARMarker;
private var activeMarker1:FLARMarker;
private var activeMarker2:FLARMarker;
private var modelLoader:Loader3D;
private var modelContainer:ObjectContainer3D;
private var modelContainer1:ObjectContainer3D;
private var modelContainer2:ObjectContainer3D;
private var modelAnimator:BonesAnimator;
private var modelAnimator1:BonesAnimator;
private var modelAnimator2:BonesAnimator;
// texture file for mario
[Embed(source="../../resources/assets/mario_tex_red-blue.jpg")]
private var MarioTextureRedBlue:Class;
[Embed(source="../../resources/assets/mario_tex_green-red.jpg")]
private var MarioTextureGreenRed:Class;
[Embed(source="../../resources/assets/mario_tex_blue-green.jpg")]
private var MarioTextureBlueGreen:Class;
// collada file for mario
[Embed(source="../../resources/assets/mario_testrun.dae",mimeType="application/octet-stream")]
private var MarioDae:Class;
public function MultiMarkerMultiCollada () {
this.addEventListener(Event.ADDED_TO_STAGE, this.onAdded);
}
private function onAdded (evt:Event) :void {
this.removeEventListener(Event.ADDED_TO_STAGE, this.onAdded);
// pass the path to the FLARManager xml config file into the FLARManager constructor.
// FLARManager creates and uses a FLARCameraSource by default.
// the image from the first detected camera will be used for marker detection.
// also pass an IFLARTrackerManager instance to communicate with a tracking library,
// and a reference to the Stage (required by some trackers).
this.flarManager = new FLARManager("../resources/flar/flarConfig.xml", new FLARToolkitManager(), this.stage);
// to switch tracking engines, pass a different IFLARTrackerManager into FLARManager.
// refer to this page for information on using different tracking engines:
// http://words.transmote.com/wp/inside-flarmanager-tracking-engines/
// this.flarManager = new FLARManager("../resources/flar/flarConfig.xml", new FlareManager(), this.stage);
// this.flarManager = new FLARManager("../resources/flar/flarConfig.xml", new FlareNFTManager(), this.stage);
// add FLARManager.flarSource to the display list to display the video capture.
this.addChild(Sprite(this.flarManager.flarSource));
// begin listening for FLARMarkerEvents.
this.flarManager.addEventListener(FLARMarkerEvent.MARKER_ADDED, this.onMarkerAdded);
this.flarManager.addEventListener(FLARMarkerEvent.MARKER_UPDATED, this.onMarkerUpdated);
this.flarManager.addEventListener(FLARMarkerEvent.MARKER_REMOVED, this.onMarkerRemoved);
// wait for FLARManager to initialize before setting up Away3D environment.
this.flarManager.addEventListener(Event.INIT, this.onFlarManagerInited);
}
private function onFlarManagerInited (evt:Event) :void {
this.flarManager.removeEventListener(Event.INIT, this.onFlarManagerInited);
this.scene3D = new Scene3D();
this.camera3D = new FLARCamera_Away3D(this.flarManager, new Rectangle(0, 0, this.stage.stageWidth, this.stage.stageHeight));
this.view = new View3D({x:0.5*this.stage.stageWidth, y:0.5*this.stage.stageHeight, scene:this.scene3D, camera:this.camera3D});
this.addChild(this.view);
this.light = new DirectionalLight3D();
this.light.direction = new Vector3D(500, -300, 200);
this.scene3D.addLight(light);
//--------------------------------------3D-Model----
var collada:Collada = new Collada();
collada.scaling = 10;
var model:ObjectContainer3D = collada.parseGeometry(MarioDae) as ObjectContainer3D;
model.materialLibrary.getMaterial("FF_FF_FF_mario1").material = new BitmapMaterial(Cast.bitmap(MarioTextureRedBlue));
model.mouseEnabled = false;
model.rotationX = 90;
this.modelAnimator = model.animationLibrary.getAnimation("default").animator as BonesAnimator;
// create a container for the model, that will accept matrix transformations.
this.modelContainer = new ObjectContainer3D();
this.modelContainer.addChild(model);
this.modelContainer.visible = false;
this.scene3D.addChild(this.modelContainer);
//--------------------------------------3D-Model----
var collada1:Collada = new Collada();
collada1.scaling = 10;
var model1:ObjectContainer3D = collada1.parseGeometry(MarioDae) as ObjectContainer3D;
model1.materialLibrary.getMaterial("FF_FF_FF_mario1").material = new BitmapMaterial(Cast.bitmap(MarioTextureGreenRed));
model1.mouseEnabled = false;
model1.rotationX = 90;
this.modelAnimator1 = model1.animationLibrary.getAnimation("default").animator as BonesAnimator;
// create a container for the model, that will accept matrix transformations.
this.modelContainer1 = new ObjectContainer3D();
this.modelContainer1.addChild(model1);
this.modelContainer1.visible = false;
this.scene3D.addChild(this.modelContainer1);
//--------------------------------------3D-Model----
var collada2:Collada = new Collada();
collada2.scaling = 10;
var model2:ObjectContainer3D = collada2.parseGeometry(MarioDae) as ObjectContainer3D;
model2.materialLibrary.getMaterial("FF_FF_FF_mario1").material = new BitmapMaterial(Cast.bitmap(MarioTextureBlueGreen));
model2.mouseEnabled = false;
model2.rotationX = 90;
this.modelAnimator2 = model2.animationLibrary.getAnimation("default").animator as BonesAnimator;
// create a container for the model, that will accept matrix transformations.
this.modelContainer2 = new ObjectContainer3D();
this.modelContainer2.addChild(model2);
this.modelContainer2.visible = false;
this.scene3D.addChild(this.modelContainer2);
this.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);
}
private function onMarkerAdded (evt:FLARMarkerEvent) :void {
trace("[" + evt.marker.patternId + "] added");
if (evt.marker.patternId == 0) {
markerAdded(0);
this.activeMarker = evt.marker;
}
if (evt.marker.patternId == 1) {
markerAdded(1);
this.activeMarker1 = evt.marker;
}
if (evt.marker.patternId == 2) {
markerAdded(2);
this.activeMarker2 = evt.marker;
}
}
private function onMarkerUpdated (evt:FLARMarkerEvent) :void {
trace("[" + evt.marker.patternId + "] updated");
if (evt.marker.patternId == 0) {
markerAdded(0);
this.activeMarker = evt.marker;
}
if (evt.marker.patternId == 1) {
markerAdded(1);
this.activeMarker1 = evt.marker;
}
if (evt.marker.patternId == 2) {
markerAdded(2);
this.activeMarker2 = evt.marker;
}
}
private function onMarkerRemoved (evt:FLARMarkerEvent) :void {
trace("[" + evt.marker.patternId + "] removed");
if (evt.marker.patternId == 0) {
markerRemoved(0);
}
if (evt.marker.patternId == 1) {
markerRemoved(1);
}
if (evt.marker.patternId == 2) {
markerRemoved(2);
}
this.activeMarker = null;
this.activeMarker1 = null;
this.activeMarker2 = null;
}
private function onEnterFrame (evt:Event) :void {
// apply the FLARToolkit transformation matrix to the Cube.
if (this.activeMarker) {
this.modelContainer.transform = AwayGeomUtils.convertMatrixToAwayMatrix(this.activeMarker.transformMatrix);
}
if (this.activeMarker1) {
this.modelContainer1.transform = AwayGeomUtils.convertMatrixToAwayMatrix(this.activeMarker1.transformMatrix);
}
if (this.activeMarker2) {
this.modelContainer2.transform = AwayGeomUtils.convertMatrixToAwayMatrix(this.activeMarker2.transformMatrix);
}
// update the animation and Away3D view.
if (this.modelAnimator) {
this.modelAnimator.update(getTimer() * .005);
}
if (this.modelAnimator1) {
this.modelAnimator1.update(getTimer() * .005);
}
if (this.modelAnimator2) {
this.modelAnimator2.update(getTimer() * .005);
}
this.view.render();
}
private function markerAdded(markerId:int):void {
switch(markerId) {
case 0: {
if (modelContainer.visible == false) {
modelContainer.visible = true;
break;
} else {
break;
}
}
case 1: {
if (modelContainer1.visible == false) {
modelContainer1.visible = true;
break;
} else {
break;
}
}
case 2: {
if (modelContainer2.visible == false) {
modelContainer2.visible = true;
break;
} else {
break;
}
}
}
}
private function markerRemoved(markerId:int):void {
switch(markerId) {
case 0: {
if (modelContainer.visible == true) {
modelContainer.visible = false;
break;
} else {
break;
}
}
case 1: {
if (modelContainer1.visible == true) {
modelContainer1.visible = false;
break;
} else {
break;
}
}
case 2: {
if (modelContainer2.visible == true) {
modelContainer2.visible = false;
break;
} else {
break;
}
}
}
}
}
}
Untuk langsung mencobanya, silakan print marker-1, marker-2, dan marker3, kemudian buka link ini. Jika Flash meminta izin untuk mengakses webcam, tekan "Allow" saja. Arahkan marker yang tadi telah diprint ke depan webcam.
Bagi yang biasa menggunakan FlashDevelop, file proyeknya dapat dapat didownload di link ini. Semoga bermanfaat.
83 komentar:
haloo mas,
terima kasih buat source codenya.
sudah berhasil saya coba.
sekalian mau tanya nih mas
untuk mendeteksi posisi/coordinat dari tiap marker?
thanks b4
hey man! congrats for your program is the best Augmented reality program that uses Away3D that i found. One question how can i remove the black square in the left corner?
@Basworo: bisa menggunakan class FLARMarker.
untuk langsung mencobanya, silakan paste kode ini pada line 244 di file MultiMarkerMultiCollada.as:
trace(this.activeMarker.centerpoint.x + " | " + this.activeMarker.centerpoint.y + " | " + this.activeMarker.transformMatrix.rawData[14]);
@George: thanks, glad this source code can be useful for you. to remove the thresholdSourceDisplay, please open file flarConfig.xml and in line 46 set its value to "false".
sudah bisa mas, trims.
tanya lg nih mas, untuk buat bayangan pada obyek 3d pad ar berdasar posisi cahaya ?
@Joni: wah kalau itu saya kurang ngerti, cahayanya kan sudah dibuat di kode pada line 126-128 tuh, mungkin biar bayangan dari si mario terlihat mesti kita buat objek 3D lagi sebagai alas tempat jatuhnya bayangan(?), CMIIW.
salam mas fathah,
terima kasih atas source codenya.
awesome, mas fathah menggunakan Away 3D.
saya punya pertanyaan mas, saya punya proyek yang membuat AR yang terdiri 27 dae dan tentu saja 27 marker, jadi setelah jalankan, terjadi error seperti ini:
Attempting to launch and connect to Player using URL J:\PROJECT Road Safety Education2\ROeS\AugmentedReality.swf
[SWF] J:\PROJECT Road Safety Education2\ROeS\AugmentedReality.swf – 542447 bytes after decompression
Error: Error #2032: Stream Error. URL: file:///J|/PROJECT%20Road%20Safety%20Education2/ROeS/./assets/FLAR/flarConfig.xml
at com.transmote.flar::FLARManager/onFlarConfigLoadError()[J:\PROJECT Road Safety Education2\ROeS\FLARToolKit_ver2_5_4\src\com\transmote\flar\FLARManager.as:832]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
saya sudah mempelajari kodenya tapi stack untuk mengerti tentang hal ini, dan saya menemukan sorce code dari mas fathah. dan saya berpikir untuk mencoba SC dari mas, tapi mas menggunakan model mario dengan 2 atau 3 texture, saya ingin bertanya bagaimana menggunakan 27 model dengan texture yang berbeda? apakah sama seperti looney doodeykah?
maaf atas pertanyaan bodoh saya tapi saya baru sekali mempelajari AR ini. mohon bantuannya mas, terima kasih.
Stream error biasanya karena file yang akan diload tidak ditemukan, untuk kasus ini sepertinya path ke file flarConfig.xml kurang lengkap.
Iya, judul blog ini agak rancu juga "Multi Collada" padahal sebenernya saya cuma pake 1 collada dengan 3 tekstur, hehehe... :D
Tapi gak sulit kok untuk modifikasinya. Cukup copy baris 81-82, ubah menjadi seperti kode-kode berikut ini, lalu paste dibawah baris ke-82.
[Embed(source="../../resources/assets/colladaKedua.dae",mimeType="application/octet-stream")]
private var ColladaKeduaDae:Class;
[Embed(source="../../resources/assets/colladaKetiga.dae",mimeType="application/octet-stream")]
private var ColladaKetigaDae:Class;
[Embed(source="../../resources/assets/colladaKeempat.dae",mimeType="application/octet-stream")]
private var ColladaKeempatDae:Class;
[Embed(source="../../resources/assets/colladaSeterusnya.dae",mimeType="application/octet-stream")]
private var ColladaSeterusnyaDae:Class;
Emm, gak cuma itu sih, semua kode dibawahnya harus dimodifikasi juga sesuai dengan jumlah collada yang digunakan. Coba dibaca-baca lagi filenya, polanya kelihatan kok. Silakan dicoba dulu. Btw, biasanya ngoding pake bahasa apa?
waah mas fathah, terima kasih banyak. alhamdulillah sudah berhasil hehehe 27 marker + collada dan ga ada macet pas switchnya .. saya cuma belajar basic java dan c++ saja :D soalnya saya orang multimedia mas . makasi banyak mas :D
saya orang baru dlm menghasilkan aplikasi yg menggunakan augmented reality ini. saya telah pun mendownload project seumpama ini dan saya ingin bertanya bagaimana untuk compile script as3 ini ke fla?
@Peruzz: silakan dibuka tutorial ini
salam mas fathah..
mau nanya, mas udah pernah nyoba augmented reality tangible marker ?
yang seperti di video ini.
http://www.youtube.com/watch?v=zLVWQSdce9o
makasi mas..
Maksutnya tangible marker tuh yg biasa juga disebut "markerless"/natural feature tracking yha? Pernah coba (pake Unifeye Design), tapi masih belum nemu yg free. Jadi si marker tidak harus berbentuk kotak-kotak hitam putih.
terimakasih Source Code nya mas... sangat menarik sekali, menantang untuk dipelajari :).... kalo bisa diperbanyak lagi ya mas... lagi belajar nih..Keep Share,
Mas, saya mau tanya. untuk membuat menjadi file swf dan bisa di publikasikan lewat web caranya gimana? mohon pencerahannya.
@Yogi: sama-sama :) semoga bermanfaat...
@Achmad Ridwan: IDE-nya pake FlashDevelop kan? Di bagian atas ada tombol "Test Project", coba saja jalankan. Lalu lihat di folder "bin" ada file SWF nya dan biasanya sekaligus dengan file "index.html". File tersebut bisa langsung diupload dan dibuka via web.
Mas Fathah terima kasih atas jawabannya. gak nyangka bakal dapet cepet jawabannya. terus terang biasanya saya menggunakan adobe flex atau adobe cs4. untuk flash develop saya baru coba ini. saya sudah cek di folder bin, ada file swfnya. tapi kenapa ya kalo saya pisahkan file swf tersebut dari folder, saat dijalankan muncul security eror? kalo saya jalankan langsung dari flash develop, ada kotak hitam di pinggir atas, cara menghilangkannya bagaimana? sebelumnya saya ucapkan terimakasih atas pencerahan dari mas fathah.
@Achmad Ridwan: errornya seperti ini yha?
Error #2044: Unhandled error:. text=Error #2032: Stream Error. URL: file:///D|/resources/flar/flarConfig.xml
itu karena file flarConfig.xml yang ada di folder resources/flar tidak ikut dicopy :)
untuk menghilangkan kotak hitam di kiri atas, silakan cek komen saya untuk George di bagian awal postingan ini...
wew,, berhasil. trimakasih Mas Fathah. next time bahas AR untuk handheld ya (kalo bisa android).
hayuk atuh post tentang mobile AR di blognya~ ;)
hallo mas fathah....
terima kasih source kodenya... saya mau bertanya nih:
1. bagaimana jika kita ingin membuat bentuk marker sendiri??
2. bagaimana buat AR yang seperti ini http://www.youtube.com/watch?v=HfaGih85ZJg yang menggunakan marker sebagai tombol untuk interaksi user....
maaf pertanyaanya banyak, masih belajar nih hehehe....
mohon bantuanya mas....
1. Untuk membuat marker sendiri, silakan bukan link ini.
2. Inti algoritmanya sih kita definisikan 5 buah marker, tapi hanya 1 buah (yang paling depan) yang "ditempeli" objek 3D. Pastikan 5 buah marker tsb terdeteksi semua, dan ketika salah satu dari 4 marker controllernya tidak terdeteksi, maka lakukan suatu aksi pada objek 3D-nya.
masih kurang ngerti ne mas... hahaha... saya ingin coba zoom out dan zoom in, jadi saya kan harus scale objekny... nah kira2 codingny bagaimana ya?? letakan codingny dmn??..
o iya mas, objek saya rumah ne... dan ad animasiny... dmn bagunan rumah dan atap bisa terbuka sehingga tampak dalam rumah dapat terlihat, nah gimana cara stop n play animasi dengan menggunakan perintah keyboard...
satu lagi ne tanggung... hehehe....
apakah coding ini dapat menampilkan satu objek dengan beberapa marker yang sama, atau hanya bisa 1 objek 1 marker saja??...
tolong pencerahany mas.... saya buta banget tentang action script..... hehehehe...
@Riko saja: Btw dari source code di blog ini sudah bisa bikin apa? Ada SWF atau script yang bisa dishare?
wah... cepet bener replaynya... hahahaha...
saya baru buat objekny mas, belum masuk k testing source codeny... hehehe....
hallo mas.... saya ingin coba Source codeny ne.... apa aj yang dibutuhkan?? dan tolong minta langkah2ny mas.... saya bingung pake ap bukany ne... tolong jawabany mas.... TQ...
install FlashDevelop, download versi terbarunya di sini.
setelah itu download file yang linknya ada di paragraf terakhir blog ini.
sdh saya DL n instal mas, terus langkah selanjutny??
oh iy minta Acount FBny ad mas??? blogny sering error ne.... jadi ssh mw tanya2 lagi.... hehee....
waduh jangan semuanya ditanyain step-by-stepnya dari awal donk, fokus ke topik MultiMarker menggunakan FLARManager :)
di webnya FlashDevelop bagian dokumentasi cukup memadai kok untuk mulai menggunakan FlashDevelop.
sebaiknya artikel-artikel awal di sini dibaca juga sebagai dasar aplikasi AR di Flash.
ok.... Thanx mas..... ntar kalo sdh bisa, saya share dha..... hehehee......
mas saya sudah bisa ne tambah objekny, tapi kenapa texture yang saya buat tidak mau menempel pada objekny?? jadi warna objekny hanya berwarna abu2 saja ne.... oh iy, arti string dari (FF_FF_FF_mario1) d line 145, 147, 169....
tolong arahany mas....
Sip! :)
Kalau aset dae kita embed, materialnya memang perlu ditempelkan secara manual. Nah "FF_FF_FF_mario1" ini adalah nama dari material id yang terkait, pada script saya tempelkan dengan tekstur yang berbeda-beda warna bajunya.
Coba buka file 3D modelnya (*.dae) pake text editor, dan search "material id", perhatikan pada bagian name.
siang mas saya alfin ..
luar biasa mas untuk karyanya..
saya mau nanya mas saya ingin membuat simulator gempa bumi neggunakan teknologi ini mas ,,
rancangan saya saya memiliki 2 buah marker yang masing-masing memiliki satu buah objek dan ketika didekatkan(kedua marker bertemu)maka muncul objek yang lain itu kira2 gmn yam mas :)
trima kasih mas
Wah konsep interaksi markernya persis dengan aplikasi yang sekarang sedang saya buat... :)
Klo menggunakan source code di atas, kita mesti menambahkan sebuah flag untuk tiap-tiap marker yang akan bernilai true ketika marker tersebut terdeteksi (dan bernilai false jika sebaliknya).
Pada fungsi markerAdded, kita tambahkan kemampuan untuk mengecek apakah flag dari kedua marker bernilai true, untuk kemudian model 3D dari masing-masing marker tsb disembunyikan (visible = false) dan tampilkan model 3D lainnya pada salah satu marker tsb.
Intinya sih gitu~
wah mas.. berhasil ne... oh iy mas, kembali k pokok maslahny ne... gimana yang menggunakan marker sebagai tombol interaksi userny..... seperti comnt saya sebelumny.... terus, pada objek yang saya buat ada animasiny, tapi waktu d jalani animasiny gak gerak... mohon bimbingany lagi mas.... hahaha....
@Riko: tentang animasi, pastikan pas export colladanya sudah benar animasi terekspor juga.
cek aja dengan impor ke (misalnya) 3dsMax, apa animasinya masih ada? klo tidak ada berarti salah pas ekspor.
untuk marker sebagai tombol, algoritmanya udah saya reply dengan jelas waktu itu, silakan implementasikan sendiri dalam script. coba dipahami di script bagian mana yang berjalan ketika sebuah marker terdeteksi, dan mana bagian yang bertugas untuk menampilkan atau mengubah properti (rotasi/translasi/skala) model 3D-nya.
nah memeberikan flag itu yang saya binggung mas ???
contohny gmn ya mas ??
maap mas byk bertanya soalny baru belajar :)
trima kasih
kira-kira seperti ini, harap diingat bahwa ini bukan script sebenarnya, cukup diikuti alurnya saja, terutama pada bagian OnEnterFrame ketika membanding2kan nilai foundMarker0 dan foundMarker1 apakah true atau false :)
*btw tampilan script di komentar ini susah dibaca, nanti kopas aja dan autoformat*
--------------------------------
private function onMarkerAdded(markerId:int) {
switch(markerId) {
case 0: {
foundMarker0 = true;
}
case 1: {
foundMarker1 = true;
}
}
}
private function onEnterFrame(e:Event) {
if (foundMarker0 && !foundMarker1) {
if (modelContainer0.visible == false) {
modelContainer0.visible = true;
break;
} else {
break;
}
}
if (!foundMarker0 && foundMarker1) {
if (modelContainer1.visible == false) {
modelContainer1.visible = true;
break;
} else {
break;
}
}
if (foundMarker0 && foundMarker1) {
if (modelContainer2.visible == false) {
modelContainer2.visible = true;
break;
} else {
break;
}
}
if (this.activeMarker0) {
this.modelContainer0.transform = AwayGeomUtils.convertMatrixToAwayMatrix(this.activeMarker0.transformMatrix);
}
if (this.activeMarker1) {
this.modelContainer1.transform = AwayGeomUtils.convertMatrixToAwayMatrix(this.activeMarker1.transformMatrix);
}
this.view.render();
}
mas saya sudah mencoba program dari mas tp keluar error sperti ini mas
C:\Documents and Settings\alfin\My Documents\FlashDevelopProject_FLARManager_v1_1_0\src\com\transmote\flar\marker\FLARMarker.as(76): col: 36 Error: Syntax error: expecting identifier before lessthan.
kira2 knp ya mas ???
trus saya mau nanya mas deklarasi markerny dimn ya mas ??
mas nanyany banyak soalny baru belajar tentang ini mas ..
trima kasih :)
itu errornya setelah nambahin script yang barusan saya kasih? ato dari awal sejak pake source code di blog ini?
script yang barusan kan cuma untuk menunjukkan contoh alurnya :) silakan disesuaikan sendiri
sebelum ditambahin mas ..
masih nyoba program dari mas aj
:)
@alfin : bukany pake ap? kalo pake flash develop langsung bisa tuh, tapi harus instal java n sdk flex builder dl untuk jalaniny... linkny liat d replay mas fathah sebelum2ny...
terus deklar markerny ad d flarconfig.xml ny.... (resources > flar > flarconfig.xml ), terus jika mw buat markerny... linkny jg ad d replay ini.... hahahaaha....
@mas fathah : mas saya masih bingung dengan conrol markerny, tidak sesuai dengan harapan... hhahaha... oo iy mas fathah, saya mw tanya ne.. SC ini bisa gak menampilkan 1 objek yang sama pada banyak marker yang sama pula.... jadi intinya, 1 objek tersebut dapat ditampilkan pada banyak marker yang sama pula... atau dengan kata lain 1 objek memiliki multi target marker yang sama..... nah itu pengaturany bagaimana??
@Alfin: nah itu udah dijawab :)
@Riko saja: pasti kontrolnya agak ngaco karena markernya sering gak kedetek yha? :P
Nah untuk yang multimarker tapi dengan marker yang sama, kita mesti ngasih index di tiap markerId yang terdeteksi, simpan aja dalam container berupa array. Jadi alurnya kira-kira gini:
#1 markerId 0 terdeteksi
#2 beri flag true pada containerMarkerId0[0]
#3 markerId 0 terdeteksi lagi untuk ke-n kali
#4 beri flag true pada containerMarkerId[n]
#5 nah yang ribet untuk transform model 3D nya, untuk tiap containerMarkerId[n] yang bernilai true, mesti ditempeli model 3D satu persatu, jadi harus bikin instance dari model 3D tersebut untuk tiap marker
#6 biar aplikasinya gak berat, jangan lupa untuk containerMarkerId[n] yang bernilai false model 3D nya langsung di removeChild, jangan sekedar di set false untuk visible nya
@Riko saja: oiya saya barusan buka sourcenya lagi dan nemu sesuatu yang pasti bisa membantu :)
Ternyata selain markerId, ada juga sessionId! :D
Nilai sessionId tidak pernah sama untuk tiap marker yang sama maupun marker yang beda.
Untuk mencobanya, ganti trace pada fungsi onMarkerAdded, onMarkerUpdated, onMarkerRemoved menjadi mirip-mirip seperti ini:
trace("[" + evt.marker.patternId + ", " + evt.marker.sessionId + "] added");
Jangan lupa buka flarConfig.xml dan ubah nilai markerMode="SINGLE" menjadi markerMode="MULTI"
pakai yang array sepertinya ribet mas... gak nyampe ilmu saya pakai array.... sulit dipahami codingnya.... hahahahaa....
terus cara yang kedua kok gak ad perubahan... masih saja, walaupun marker yang samany cuma ad 2 tapi yang muncul 1 objek saja pada satu marker, gak bisa 2 2ny... apa saya yang salah ya mas??
oh iy fungsi trace disini untuk apa ya mas, untuk parameter nilai marker ya??
lah? :D
Di cara yang kedua kan saya cuma pengen ngasi tau bahwa nilai sessionId untuk semua marker itu berbeda (dengan menampilkan nilainya menggunakan fungsi trace). Jadi variable sessionId tsb bisa dimanfaatkan untuk membuat aplikasi multi marker dgn marker yang sama. Gak perlu pake array~ :)
masih gak ngerti mas.... saya sdh tambahin di trace seperti mas replay td... terus, yang fungsi if ny gak diubah2 ya?? atau harus nambahin fungsi if ny??
perhatikan saja hasil trace di output tab FlashDevelop
mas... saya coba jalani cubeAway3D... yang ada d examples.. nah 1 objekny bisa tampil pada banyak marker yang sama..... bisa dijelaskan gak caranya??? kayakny pake array t......
itu dari awalnya aja udah beda cara untuk create 3D modelnya, coba klik di "SimpleCubes_Away3D" dan tekan tombol F4.
saya gak jadi pake multi markerny mas.... jadi pake satu2 aj, biar gak pusing hahahhaha...
oh iya mas, kalo kita sdh selesai buat nih... kt mau buat fileny jadi exe gmn ya?? masalahanya kalau kita pindahkan folderny dari partisi/komputer lain file .swf nya gak bisa dibuka langsung, harus dijalankan dari flash develop dl..... jadi ssh de... hahhahaha.......
double click file swfnya di luar FlashDevelop (otomatis akan dibuka oleh Flash Player), kemudian pakai menu "File >>> Create Projector..."
mas mau nanya lagi :)
texture saya kok ngk kluarny ya mas apdahal material idny sudah saya buat
model.materialLibrary.getMaterial("gedung3").material ;
model.materialLibrary.getMaterial("gedung1").material ;
model.materialLibrary.getMaterial("orange").material ;
model.materialLibrary.getMaterial("Material").material ;
model.materialLibrary.getMaterial("lempengbawah").material ;
model.materialLibrary.getMaterial("tanah").material ;
model.materialLibrary.getMaterial("cor").material ;
model.materialLibrary.getMaterial("pohon1").material ;
model.materialLibrary.getMaterial("jalan").material ;
model.materialLibrary.getMaterial("gedung2").material ;
model.materialLibrary.getMaterial("gedung4").material ;
malah kluar error seperti ini mas [Fault] exception, information=TypeError: Error #1009: Cannot access a property or method of a null object reference.
itu gmn ya mas ???
mohon pencerahannya
trima kasih sebelumny :)
@alfin :
- coba cek declare texture atau objek .dae ny benar atau salah...
- bener t id materialny? yang ad d dae lho...... yang kayak gini kah? nah ambil yang material idny (_1_-_Default-material)...... kalo bener biasany muncul t.....
- oh ia, exportny gunakan yang open collada dae, jgn yang bawaan 3ds max...
- ada animasi kah?
@rico:ud dicoba jg mas yg itu
model.materialLibrary.getMaterial("gedung3-material").material ;
tp ttp ngk kluar mas textureny :(
saya menggunakan blander mas ...
gmn ya mas ?
wah pake blender yah, mungkin bisa lihat2 tutorial ini aja, soalnya saya biasanya pake 3dsMax :)
cara menambahkan modelnya lagi gimna?
maksud dari default di syntak ini apa ya?
this.modelAnimator1 = model1.animationLibrary.getAnimation("default").animator as BonesAnimator;
apa
cara menambahkan model 3D lainnya:
#1 embed 3D model seperti pada baris 81-82
#2 embed teksturnya seperti pada baris 71-72, 74-75, 77-78
#3 edit flarConfig.xml dan tambahkan 1 marker lagi
#4 parsing 3D modelnya seperti pada baris 130-143, 146-159, 162-175
#5 modifikasi fungsi onMarkerAdded, onMarkerUpdated, onMarkerRemoved, onEnterFrame, markerAdded, markerRemoved
tentang getAnimation("default") saya juga kurang paham, mungkin "default" ini hanya dapat diganti dengan nama lain jika 3D model yang dibacanya berasal dari MD2 atau MD5, karena setau saya di kedua format itu tiap rentang animasi (frame sekian hingga frame sekian) dapat diberi nama masing-masing, dan dimainkan pada bagian itu saja.
pada collada sepertinya harus "default" dan otomatis memainkan seluruh frame pada file DAE tersebut. CMIIW
syukron mas. SANGAT JELAS SEKALI! dan mudah diikuti.
jazakallahu khairan katsira
Salam Mas Fathah..
Saya perlu pencerahan, jadi Multiple Marker menggunakan FLARToolkit + Papervision kan saya sudah berhasil tu, alhamdulillah 27 marker jalan semua.
Nah, kebetulan saya ingin buat object yang keluar tu bukan 3D tapi video, mungkin .mp4 atau .flv punya di multiple marker tu. Saya bingung, apa bisa menggunakan alur code yang saya pakai di awal?
trus, swc file nya cuma 1 saja ya?
Mudah"an Mas boleh bantu :D
Terima kasih :)
Bisa, cukup ganti 3D model yang kemarin dengan sebuah plane, kemudian videonya dipasang sebagai tekstur :)
hehehe terima kasih mas fathah, tapi boleh dibimbing sedikit ga mas, saya masih kurang paham bagaimana saya bisa combine itu. nah bagaimana caranya export ke flash builder itu mas? hehehe maap masih amatir :D
dicoba aja dulu yg di tutorial tsb, lalu share file projectnya di sini kalau ada masalah, memang gak gampang kok dulu juga pas pertama kali saya pake cara ini.. :)
Haha :)) ternyata link yang saya kasih tadi itu untuk Papervision3D, bukan Away3D...
Nanti cari lagi deh yang untuk Away3D. padahal cara Papervision3D yang di tutorial tadi lebih mudah mestinya daripada Away3D...
Hallo mas...
saya sudah liad source codenya..
mau tanya niey.. saya coba download 3D dae yg di googlesketchup. mau saya ganti marionya.
itu di file 3dnya khan ngga da texturenya mas.
tpi di file daenya ada material idnya..
itu gmn ditulis di codenya ya mas.. sedangkan di codenya.. pemanggilan material disertai texturenya..
mohon bantuannya mas...
material id tersebut mungkin memang tidak butuh tekstur, hanya warna dasar. jadinya gak perlu dituliskan di scriptnya. coba aja load 3D modelnya tanpa ngoprek2 material id dan tekstur, lihat tampilannya apa udah bener... :)
Ow iyaa mas bisa..
trims mas fathah.
trus mau tanya mas.. klu index 0 is out of range 0 tu artinya apa ya mas ?
sama kalau file 3dnya kira" 10 MB lebih.. sistemnya ngga kuat mbaca ya mas.. jadi tulisannya. Error #1502: A script has executed for longer than the default timeout period of 15 seconds.
mohon bantuannya untuk ini mas..
Wah saya belum pernah kena masalah "index 0 is out of range 0" tuh. Munculnya error tersebut pas kondisi apa?
Ukuran file 3D paling besar yang saya gunakan 3MB (rata-rata 1MB), karena total ada 20an model 3D yang diload sekaligus dalam 1 aplikasi, kasian usernya nanti kelamaan pas nunggu loadingnya~ :D
Nah itu mas, saya juga bingung. waktu ngisi material id sama texturenya.. kluarnya gitu.. ngga tau kesalahan di 3Dnya atau apanya...
brati 3Mb keatas ngga bsa ya mas.
kalau buat ngecilin file 3Dnya gmn mas?
soalnya temen saya yg buat 3Dnya..
Mungkin bisa, tapi lemot! :D
Oiya, untuk ngecilin file 3D modelnya itu udah bagiannya 3D modeller, bukan programmer, soalnya gak mudah. Jumlah poligon dari si 3D modelnya harus dikurangi.
Hmm..gitu ya mas fathah.
makasih infonya mas.
klu mau tanya" saya posting lagi disni ya mas..^^
thanks a lot..
silakan, ditunggu... :)
Terimakasih tutorialnya mas fathah :)
sya mau tnya ?
sya coba bkin animasi model 3d bergerak memutar, tp kok gk bsa y
baris animasi ini apa mksudtnya mas,.
this.modelAnimator1 = model1.animationLibrary.getAnimation("default").animator as BonesAnimator;
Poskan Komentar