PV3Dでマテリアルの動的な変更

このQ&Aのポイント
  • papervision3Dでマテリアルを動的に変更する方法について
  • マテリアルの変更が上手くいかない場合の対処法
  • 初心者向けにPV3Dでマテリアルの変更について解説
回答を見る
  • ベストアンサー

PV3Dでマテリアルの動的な変更

papervision3Dでマテリアルを動的に変更したいのですが、 どうも上手くいきません。 markerと言う別画像のplaneオブジェクトをTweenerで徐々に表して alphaが1になった時に外部の画像と切り替えたいのですが出来ませんでした。 エラーは出ず、最初の画像のままです。 Tweener.addTween(marker, { alpha:1, time:4, onComplete:function() { var image:BitmapFileMaterial = new BitmapFileMaterial(url);    marker.material = new BitmapFileMaterial(url); } また、 marker.replaceMaterialByName( new BitmapFileMaterial(url), "all"); も試してみたのですが変化ありませんでした。 まだPV3Dを始めたばかりなので初歩的な質問に なりますが、おわかりの方がいましたらご教授頂けるとありがたいです…!

  • Flash
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • josef_as3
  • ベストアンサー率100% (3/3)
回答No.1

replaceMaterialByName関数はCubeオブジェクトに使うものですね。 marker.material = new BitmapFileMaterial(url); でいけるんじゃないでしょうか。 変更前のBitmapDateを再利用しない場合はdisposeしてあげるといいですね。 ではでは:)

aomegane13
質問者

お礼

ご指摘頂いた通り BitmapFileMaterialで 上手く行きました!! 本当にありがとうございました!

関連するQ&A

  • Tweenerの繰り返しについて

    こんばんわ。 Tweenerの繰り返しについてですが、 3つの写真があり、それぞれライブラリで書き出し済みです。 そして、その3つの写真をフェードイン・フェードアウトで切り替えることに成功したのですが、その3つの写真を続けて繰り返し(無限ループ)ができません。 TweenerのonCompleteを使ってtween(myMc,i)に戻ってもスタックオーバーフローになってしまい、うまくいきません。 こちらソースになります↓ for (var i:int=1; i<=3; i++) { var mc_str:String = "photo0" + i; var myClassMc:Class = Class(getDefinitionByName(mc_str)); var myMc:MovieClip = new myClassMc(); main_mc.addChild (myMc); myMc.visible = false; myMc.name = mc_str; tween (myMc,i); } function tween (MC:MovieClip, num:Number):void { var _num:Number = num - 1; if (num >= 1) { trace (_num+"枚目通過"); Tweener.addTween(MC, { alpha:0, onComplete:function():void{MC.visible=true;},delay:1+(_num*5) }); trace (_num+"枚目終わり"); Tweener.addTween (MC, { alpha:1, transition:"linear", time:3, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); } } どうか、ご教授のほうよろしくお願いします。

    • ベストアンサー
    • Flash
  • PV3Dでのアニメーション

    下記のソースですが、以下のような動きを追加したいと考えています。 ・直方体の側面(4方向共)に10数個の矢印を縦に並べる ・矢印の向きは直方体方向 ・矢印の先は円錐型ではなく、四角柱型もしくはarrowクラスの  ような形 ・カメラの初期位置を今の位置から更にx軸方向にもってくる  (初期画面で軸が三菱のマークに見えるようなイメージ) です。 問題なのが、arrowクラスの引数が色指定しかない為、任意の大きさに 指定して配置することができません。自分でシンボルを作って配置する しかないのでしょうか。 また、テキストのyがどうしてもyに見えないのですが解決方法はありますか? 以下にソースを貼りますので、ご教授ください。 import org.papervision3d.view.BasicView import org.papervision3d.objects.DisplayObject3D import org.papervision3d.objects.primitives.* import org.papervision3d.objects.special.VectorShape3D import org.papervision3d.materials.ColorMaterial import org.papervision3d.materials.utils.MaterialsList import org.papervision3d.materials.shadematerials.FlatShadeMaterial import org.papervision3d.materials.MovieMaterial import org.papervision3d.lights.PointLight3D var vw=new BasicView(1,1,true,false) var mtr:ColorMaterial = new ColorMaterial(0x000000); var mtr1:ColorMaterial = new ColorMaterial(0x33AA88); var light:PointLight3D=new PointLight3D(false) var shdMtr:FlatShadeMaterial=new FlatShadeMaterial(light,0xAAFFCC,0x338844) var mtrList:MaterialsList=new MaterialsList({all:shdMtr}) var cubeList=new Array() var vecList=new Array() var txtList=new Array() var drc:Number=0 var dst:Number=500 var rot:Number=0 var prevX:Number=mouseX for(var i=0;i<3;i++){ cubeList.push(new Cube(mtrList,60,60,200)) vw.scene.addChild(cubeList[i]) cubeList[i].x=150 cubeList[i].y=150 cubeList[i].z=150 vecList.push(new DisplayObject3D()) var cone=new Cone(mtr,10,30) var bar=new Cylinder(mtr,3,250) cone.y=250 bar.y=125 vecList[i].addChild(cone) vecList[i].addChild(bar) vecList[i][["rotationX","rotationY","rotationZ"][i]]=90 if(i==2)vecList[i].rotationZ=-90 vw.scene.addChild(vecList[i]) var movMtr=new MovieMaterial(makeTxtMov(["x","y","z"][i]),true,false,true) movMtr.oneSide=false txtList.push(new Plane(movMtr,50,50)) txtList[i][["x","y","z"][i]]=300 vw.scene.addChild(txtList[i]) } function makeTxtMov(str:String):MovieClip{ var rtn=new MovieClip() var fld=new TextField() var fmt=new TextFormat fmt.size=100 fmt.color=0x000000 fld.defaultTextFormat=fmt fld.text=str rtn.addChild(fld) return rtn } light.y=light.x=light.z=500 vw.camera.y=300 vw.startRendering() addChild(vw) vw.y=50 addEventListener(Event.ENTER_FRAME,frameTick) function frameTick(e){ drc+=rot rot*=0.98 for each(var txt in txtList)txt.rotationY=-drc*180/Math.PI-90 vw.camera.x=light.x=Math.cos(drc)*dst vw.camera.z=light.z=Math.sin(drc)*dst } stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e){prevX=mouseX;stage.addEventListener(Event.ENTER_FRAME,setRot)}) stage.addEventListener(MouseEvent.MOUSE_UP,function(e){stage.removeEventListener(Event.ENTER_FRAME,setRot)}) function setRot(e){ rot=(prevX-mouseX)/300 prevX=mouseX } ※元ソースは頂き物です。

  • Flash CS4体験版でpapervision3Dを試すがコンパイルエラーが出る

    AS3.0を勉強しようと思い、CS4の体験版をインストールしました。 Tweenerを試したりAS2.0との違いなど勉強しているところです。 今回困っているのはpapervision3Dでのコンパイルエラーです。 Public Beta 2.0 - Great White というバージョンをダウンロードし、 /ユーザー/classes/org/papervision3d に配置し、クラスパス設定しました。 環境はMac OS X です。 http://www.thinkit.co.jp/images/article/91/3/9131.zip 上記URLにてpapervision3Dのサンプルをダウンロードし、01Planeフォルダ内plane.flaをダブルクリックで開きムービーの書き出しをしたところ・・・ 1137: 引数の数が正しくありません。0 個以下であることが必要です。scene = new Scene3D( container ); 1180: 未定義である可能性が高いメソッド OldCube の呼び出しです。cubeObj = new OldCube( material, cubeSize, cubeSize, cubeSize, segment, segment); 1061: 未定義である可能性のあるメソッド renderCamera を、静的型 org.papervision3d.scenes:Scene3D の参照を使用して呼び出しました。scene.renderCamera( camera ); Warning: 3590: ブール値が必要ですが、void が使用されています。ブール式に型強制されます。return (displayObjects[do3d] != null); Warning: 3590: ブール値が必要ですが、void が使用されています。ブール式に型強制されます。var bEnd:Boolean = i==(iHorNum-0); といったエラーがずらずら表示されます。他のサンプルでもpapervision3Dを使用したものでは同じようなエラーがでてしまいます。 何か特別な設定が必要なのか、クラスパスの設定なのか、それとも根本的な問題なのか、検討がつきません。。 お解りになる方、助けてください。

    • ベストアンサー
    • Flash
  • Flash初心者です。

    Flash初心者です。 以下のコードでは、1120:未定義のプロパティ_cubeへのアクセスです。というエラーが出ます。 ネットで調べてみたところ変数の定義がされていない時のエラーなのは分かったんですが、var _cube:Cube = new Cubeの部分では不足なのでしょうか?環境はFlashCS5です。 package { import flash.events.*; import org.papervision3d.objects.primitives.*; import org.papervision3d.view.*; import org.papervision3d.materials.*; import org.papervision3d.materials.utils.*; public class Box extends BasicView { public function Box() { var material:WireframeMaterial = new WireframeMaterial(0x2288CC); var materials:MaterialsList = new MaterialsList({all:material}); var _cube:Cube = new Cube(materials,500,500,500); scene.addChild(_cube); startRendering(); addEventListener(Event.ENTER_FRAME, loop); } private function loop(e:Event):void { _cube.rotationY += 2; } } }

    • ベストアンサー
    • Flash
  • 3DのActionScriptについて

    http://www.uniqlo.co.uk/ 海外のユニクロサイトのトップにあるようなFLASHを作りたいのですが どのようなフレームワークが必要かわかりますでしょうか。 (SWF内でクリックした場所を中心にしてタイル状に画像が沈んでから新しい画像へ変わるもの) いろいろと調べてみたのですが ・Tweener ・papervision3d ・scaena のここらへんを使えば実現できそうな気はするのですが いまいち実現方法を見出すことができません。 他に必要(これを使うべき)というものはありますか? またサンプルがあるサイトがございましたらアドバイスをお願いできますでしょうか。

  • googleMapでアイコンを変更すると、情報ウインドウがでなくなる。

    googleMapでアイコンを変更すると、情報ウインドウがでなくなる。 下記のようにデフォルトアイコンのマーカーと、アイコンを変更したマーカーをgoogleMapに表示しております。 var map = new GMap2(document.getElementById("map_canvas")); map.setCenter(new GLatLng(41.7724,140.72628), 12); var markerIcon1 = new GIcon(); markerIcon1.image = "./green.png"; markerIcon1.iconAnchor = new GPoint(16, 32); var opt1 = {icon:markerIcon1,clickable:true}; var marker1 = new GMarker(new GLatLng(41.75886,140.703535), opt1); var marker2 = new GMarker(new GLatLng(41.79672,140.757179), {clickable:true}); map.addOverlay(marker1); map.addOverlay(marker2); marker1.bindInfoWindowHtml("てすと1<br />",{maxWidth:200}); marker2.bindInfoWindowHtml("てすと2<br />",{maxWidth:200}); するとデフォルトアイコンのマーカーはクリックした際に情報ウインドウが表示されるのですが、アイコン画像を変更したほうのマーカーはクリックしても情報ウインドウが表示されず、「エラー: b is undefined ソースファイル: http://maps.gstatic.com/intl/ja_ALL/mapfiles/193c/maps2.api/main.js 行: 1224」というエラーが表示されてしまいます。 アイコン画像を変更したマーカーでは情報ウインドウは表示できないのでしょうか?

  • グーグルマップについて教えてください。

    【やりたいこと】 グーグルマップとストリートビューを連動するところまではできました。しかし、地図をクリックして取得されるデータをマーカーが出るように設定し所までは良かったのですが、そのマーカーをクリックしても必要なデータが表示されません。どの様にしたらいいでしょうか? ソースは下記の通りです。 var map; var myPano; var panoClient; var currentLatLng = new GLatLng(35.6829, 139.7653); window.onload = function() { load(); loadd(); setEvent(); } function load() { map = new GMap2(document.getElementById("mymap"),{draggableCursor:"crosshair"}); map.setCenter(new GLatLng(35.6829, 139.7653), 8);    map.addControl(new GMapTypeControl());    map.addControl(new GLargeMapControl3D());    streetview = new GStreetviewOverlay();    map.addOverlay(streetview); map.addControl(new GOverviewMapControl(new GSize(200,200))); } function loadd() {     myPano = new GStreetviewPanorama(document.getElementById("pano")); GEvent.addListener(map,"click", function(overlay,point) { currentLatLng=point; myPano.setLocationAndPOV(currentLatLng); map.setCenter(currentLatLng); }); } function createGMarker(title, html, lat, lng) { var infoObj = new Object(); infoObj.title = title; var gpObj = new GLatLng(lat, lng); var marker = new GMarker(gpObj, infoObj); map.addOverlay(marker); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); }); }

  • 呼び出し先関数内で待ちの処理

    お世話になります。 基本的な質問かと思うのですが、スマートな解決策が分からないため質問させていただきます。 現在、FLASHでルービックキューブを作っています。 先日ここでPaperVision3Dを教えていただき、キューブを表示し、1列回転させるところまでできました。 回転はtweenerを使い、rotationXなどを変化させています。 Cube_Rotateという関数を作り、Cube_Rotate("z",1)と記述することで、Z軸の1列目を回転することはできています。 ここで、 Cube_Rotate("z",1) Cube_Rotate("x",-1) Cube_Rotate("y",0) とし、違う3カ所が回転するところを見たかったのですが、同時に回転してしまいます。 呼び出し先のCube_Rotate内でtweenerの処理が終了してから呼び出し元に戻れば良いと思うのですが、タイムアウトになってしまいます。 タイムアウトになるコードは以下の通りです。 private function Cube_Rotate ( str:String, val:Number ):void { /*省略*/ var tweenflag = false; /*省略*/ Tweener.addTween(rootNodes[selected_cube[0]], {time:t_time, rotationZ:90 , transition:"easeOutSine", onComplete:tweenflagON}); /*省略*/ while( tweenflag==false ){ } } private function tweenflagON() { tweenflag = true ; } tweener処理が終わり、tweenflagがtrueになるまで、while文で待機させようとしたのですが、while文で回りっぱなしの状態だと思います。 こんなレベルの私でも理解できるやり方があればご教授ください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • wonderflで作ったクラスを、flaで呼び出す

    3Dオブジェクトが回るクラス http://wonderfl.net/c/cOMF を、同階層に置いたflaファイルで走らせて、swfファイルを作りたいのですが、 何か根本的に間違っているようで、どうしてもうまくいきません。 以下の手順だと思うのですが、、 1) 外部クラスをimportする 2) そのクラスを使って変数を作る?(型は?) 3) 作った変数をaddChildする? flaの1フレーム目: A) MovieClipで import PV3D_01; import flash.display.MovieClip; var showUp:MovieClip = new PV3D_01(); addChild(showUp); 上記を走らせると、以下のエラーが出ます。 1067: Implicit coercion of a value of type PV3D_01 to an unrelated type flash.display:MovieClip. B)Spriteを使ってみると import PV3D_01; import flash.display.Sprite; var showUp:Sprite = new PV3D_01(); addChild(showUp); こんなエラーが出ます。 INFO: Papervision3D 2.0.0 (March 12th, 2009) TypeError: Error #1009: Cannot access a property or method of a null object reference. at PV3D_01() at PV3D_01_kudou_fla::MainTimeline/frame1() おわかりの方、どうか!よろしくお願いします。

    • ベストアンサー
    • Flash
  • google mapで二番目以降のマップが表示されない

    自作のマーカーを使い、マーカーをクリックすると吹き出しが出るようにして、マップ上2か所にマーカーを付けたのですが、2番目のマーカーが全く反映されません。 下に書いたものがそのコードなのですが、見直してもどこにミスがあるのかわかりません… どなたか解決策をお願いします… <script type="text/javascript"> //<![CDATA[ var map = new GMap(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.centerAndZoom(new GPoint(135.384521484375,34.73709847578162), 8 ); var icon = new GIcon(); icon.image = " pngイメージ画像 "; icon.shadow = " pngイメージ画像 "; icon.iconSize = new GSize(12, 20); icon.shadowSize = new GSize(22, 20); icon.iconAnchor = new GPoint(6, 20); icon.infoWindowAnchor = new GPoint(5, 1); // 1番目位置 var point = new GPoint(省略); var marker = new GMarker(point,icon); map.addOverlay(marker); // 1番目吹き出し GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml("<div style='width:350px;font-size:12px;' ><table><tr><td><img src=イメージ画像 ><br><a href=\"ページへのリンク\"target=\"blank\" >説明文<br><br></td></tr></table></div>");}); var marker = createMarker(point,html); map.addOverlay(marker); // 2番目位置 var point = new GPoint(省略); var marker = new GMarker(point,icon); map.addOverlay(marker); // 2番目吹き出し GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml("<div style='width:350px;font-size:12px;' ><table><tr><td><img src=イメージ画像 ><br><a href=\"ページへのリンク\"target=\"blank\" >説明文<br><br></td></tr></table></div>");}); var marker = createMarker(point,html); map.addOverlay(marker); //]]> </script>

専門家に質問してみよう