カテゴリー別アーカイブ: Papervison3D

PlaneのMaterialに設定したムービークリップを参照する

ひとつ前のポストに関連してるけど、PlaneのMaterialに設定(適用)したムービークリップ(以下、mc)を参照できるかなと(注:targetPlaneはPlaneオブジェクトです)・・・

 trace(“targetPlane”,targetPlane.material);

とやると・・・

targetPlane Texture:s02 lineColor:0 lineAlpha:0

と出てくるので、

 trace(“targetPlane”,targetPlane.material.Texture);

とすると、

1119: 未定義である可能性が高いプロパティ Texture に静的型 org.papervision3d.core.proto:MaterialObject3D の参照を使用してアクセスしています。

とエラーになってしまう。lineColorとlineAlphaは参照できるのに、何で??
いろいろ調べたら、事前にmaterialを配列化しておいて、そこから参照する方法があった。
例)配列に保存

var material:MovieAssetMaterial = new MovieAssetMaterial(name_slide,true,true,false,true);
//後からMovieAssetMaterialのmcを制御するためにリスト化
array_materials.push(material);

例)参照するときには配列から取り出す

for (var i:int = 0;i<array_materials.length;i++) {
var mc:MovieClip = array_materials[i].movie as MovieClip;
mc.content.gotoAndStop(1)
}

一応コレで出来るんだけど、どうして参照が出来ないのかが納得できない。
何か大きな勘違いをしているような気もするけど・・・・。
ちなみに上の方法は下記サイトにて発見。感謝。

MovieAssetMaterialで適用したmcから上の階層への参照

またしてもPapervison3Dネタで。

PlaneのMovieAssetMaterialに適用したムービークリップ(以下、mc)の中に書いたスクリプトで、上の階層を参照しようとしたらnullが返ってきた。materialで使ったmcは、あくまで3Dオブジェクト(Plane)の素材なので、階層からは切り離されているってことなのかしらん。予想としては・・・

Scene3D > DisplayObject3D > Plane > MovieAssetMaterial

みたいになるのではと思っていたんだけど。
仕方がないのでPlaneを生成したときに、そのクラスからrootのオブジェクトを渡しておいて、mcからはそれを使って参照するようにした。抜粋すると、こんな感じ。
例1)Planeを生成するクラス

var name_slide:String = “panel”;

var material:MovieAssetMaterial = new MovieAssetMaterial(name_slide,true,true,false,true);
var mc:MovieClicp = material.movie as MovieClip;
material.xSaveObj_root(obj_root);

例2)MovieAssetMaterialで使用されたmc

var obj_root:Object;
function xSaveObj_root(obj:Object):void {
obj_root = obj;
}

一応これでmc側からrootにアクセスできるようになった。もっと簡単な方法はないのかな?

Materialで使用するmcで、アニメーション中に位置がずれる

PlaneのMaterialに適用したmcで、アニメーションで(0,0)より左(xのマイナス方向)にオブジェクトが出てくるとPlaneのx方向の位置がずれる事象が発生。マスクされていて、オブジェクトが(0,0)より左に表示されなくても、置いてあるとダメ。はみ出した分だけ、xの正方向にずれる。つまりmcに含まれるオブジェクトで一番左が原点になるようにmcが動いている感じ。何でだ?
MovieAssetMaterial、MovieMaterialのどちらでも発生。
たぶんカメラを等倍設定(camera.z = -(camera.zoom * camera.focus);)にしているので、カメラの位置がずれるのかな・・・と気がするけど、現時点では対処法わからず。とりあえず(0,0)より左にはオブジェクト配置しないようにすることで対処。

MovieAssetMaterialで適用したmcにあるボタンにカーソルが反応しない

前提としてMovieAssetMaterialのmcでボタンを有効にするには、MaterialObject3D.interactiveをtrueにする必要がある。Viewport3Dクラスにもinteractiveがあるけど、こちらは関係ないみたい。設定しなくて大丈夫でした。

例)
var name_slide:String = “panel”;
var material:MovieAssetMaterial = new MovieAssetMaterial(name_slide,true,true,false,true);
material.oneSide = false;
material.smooth = true;
material.interactive = true;

で、このmcの中にあるボタンイベントは問題なく動作するものの、カーソルが変化しない。ボタンでもムービークリップにmc.buttonMode = trueでもダメ。
仕方ないので、強制的にカーソルを変更する事で対処。ボタン自体も反応しないので、ムービークリップに変更してボタン表示もスクリプト制御にする。
例)
btn_next.addEventListener(MouseEvent.ROLL_OVER,onRollOver_btn);
btn_next.addEventListener(MouseEvent.ROLL_OUT,onRollOut_btn);
btn_next.addEventListener(MouseEvent.MOUSE_DOWN,onPress_btn);
btn_next.addEventListener(MouseEvent.CLICK,onClick_next);
function onClick_next(evt:MouseEvent):void {
//var wObj_parent:Object = this.parent;
var target_mc:MovieClip = evt.currentTarget as MovieClip;
target_mc.gotoAndPlay(“f_over”);
this.gotoAndPlay(“c1_2”);
trace(“click next!”);
}
function onRollOver_btn(evt:MouseEvent):void {
var target_mc:MovieClip = evt.currentTarget as MovieClip;
target_mc.gotoAndPlay(“f_over”);
Mouse.cursor = MouseCursor.BUTTON;
}
function onRollOut_btn(evt:MouseEvent):void {
var target_mc:MovieClip = evt.currentTarget as MovieClip;
target_mc.gotoAndPlay(“f_off”);
Mouse.cursor = MouseCursor.AUTO;
}
function onPress_btn(evt:MouseEvent):void {
var target_mc:MovieClip = evt.currentTarget as MovieClip;
target_mc.gotoAndPlay(“f_on”);
}
う〜ん、一応動いたけど、F9だとMouse.cursorが使えないので、F10/AS3.0でないと使えない。なんとかならないのかな〜。