- 2007-08-25 13:59
- papervision3d
Papervision3DのRev1.5ではColorMaterialのlineColorというプロパティ(インスタンス変数)が反映されないというバグが存在しますので、修正版を公開します。
マテリアルに設定した値(fillColor, lineAlpha, lineColorなど)が適用したオブジェクトに反映させるのは、どこなんでしょう?それはdrawFace3Dというメソッドです。
ColorMaterial.asでは75行目あたりにdrawFace3Dの定義があります。
drawFace3Dは親クラスのMaterialObject3Dをオーバーライドしています。
その中身はこうなっています。
override public function drawFace3D(instance:DisplayObject3D, face3D:Face3D, graphics:Graphics, v0:Vertex2D, v1:Vertex2D, v2:Vertex2D):int { var x0:Number = v0.x; var y0:Number = v0.y; var x1:Number = v1.x; var y1:Number = v1.y; var x2:Number = v2.x; var y2:Number = v2.y; graphics.beginFill( fillColor, fillAlpha ); graphics.moveTo( x0, y0 ); graphics.lineTo( x1, y1 ); graphics.lineTo( x2, y2 ); graphics.lineTo( x0, y0 ); graphics.endFill(); return 1; }
見た通り、fillColorの設定のみが反映されておりlineColorが反映されていません。
ココがバグです。
ではlineColorを実装します。
ではさっそくlineColorが反映されるようdrawFace3Dメソッドのバグフィクスです。
override public function drawFace3D(instance:DisplayObject3D, face3D:Face3D, graphics:Graphics, v0:Vertex2D, v1:Vertex2D, v2:Vertex2D):int { var x0:Number = v0.x; var y0:Number = v0.y; var x1:Number = v1.x; var y1:Number = v1.y; var x2:Number = v2.x; var y2:Number = v2.y; graphics.beginFill( fillColor, fillAlpha ); graphics.moveTo( x0, y0 ); graphics.lineTo( x1, y1 ); graphics.lineTo( x2, y2 ); graphics.lineTo( x0, y0 ); graphics.endFill(); // start draw line @adamrocker graphics.lineStyle( 0, lineColor, lineAlpha ); graphics.moveTo( x0, y0 ); graphics.lineTo( x1, y1 ); graphics.lineTo( x2, y2 ); graphics.lineTo( x0, y0 ); graphics.lineStyle(); // end draw line return 1; }
startとendのコメントで挟まれた部分を追加しました。
単純にlineを描いただけです。
前回のエントリ「TweenerでPapervision3DのSphereをトゲトゲにする」ではマテリアルとしてWireframeMaterialを使いました。それを今回修正したColorMaterialに置き換えてみます。
もともとWireframeMaterialでした。
material = new WireframeMaterial( 0x999999 );
それをColorMaterialに変更します。
material = new ColorMaterial(0x000000, 0.5);
Sphereオブジェクトをクリックすると滑らかにトゲトゲになります。
ちゃんとlineColorが反映されていますね。
一応、ソースコードも公開しておきます。
以前のエントリからTweenerの設定を少し変更しています。
package { import flash.display.*; import flash.events.*; import org.papervision3d.core.proto.*; import org.papervision3d.scenes.*; import org.papervision3d.objects.*; import org.papervision3d.cameras.*; import org.papervision3d.materials.*; import caurina.transitions.*; [SWF( backgroundColor="0xffffff", frameRate="45" )] public class TweenSphere2 extends Sprite { private var container : Sprite; private var scene : Scene3D; private var camera : Camera3D; private var rootNode : DisplayObject3D; private var obj : DisplayObject3D ; //オブジェクト private var size : int = 100;//オブジェクトの長さ private var segment : int = 16; //面の分割数 private var material : MaterialObject3D; private var isTween : Boolean; //--------------------------------------------Constructor public function TweenSphere2():void { //ステージ this.stage.quality = "MEDIUM"; this.stage.scaleMode = "noScale"; this.stage.align = StageAlign.TOP_LEFT; this.stage.addEventListener(Event.ENTER_FRAME, loop); this.stage.addEventListener(Event.RESIZE, resize); //コンテナ生成 container = new Sprite(); container.x = this.stage.stageWidth / 2; container.y = this.stage.stageHeight / 2; addChild(container); //シーン生成 scene = new Scene3D(container); //rootNode生成 rootNode = new DisplayObject3D("rootNode"); scene.addChild(rootNode); //マテリアル設定 material = new ColorMaterial(0x000000, 0.5); material.lineColor = 0xcccccc; material.lineAlpha = 100; //オブジェクト生成 obj = new Sphere(material, size, segment, segment); rootNode.addChild(obj); //camera設定 camera = new Camera3D(); camera.z = -size*3; camera.focus = 300; camera.zoom = 1; //Tweenの状態フラグ isTween = false; //イベントリスナの登録 container.addEventListener(MouseEvent.CLICK, clickObj); } //--------------------------------------------loop private function loop(event:Event):void { // 回転 obj.rotationY += container.mouseY / 100; obj.rotationX += container.mouseX / 100; //再レンダリング scene.renderCamera(camera); } //--------------------------------------------stage private function resize(e:Event):void{ container.x = this.stage.stageWidth / 2; container.y = this.stage.stageHeight / 2; } //--------------------------------------------mouse click private function clickObj (e:MouseEvent):void { var num:Number = 1; for each(var i:* in obj.geometry.vertices) { if(num % 7 == 0) { if(isTween) { Tweener.addTween(i, { x:i.x/3, y:i.y/3, z:i.z/3, time:2, delay:0, transition:"easeInOutElastic" }); } else { Tweener.addTween(i, { x:i.x*3, y:i.y*3, z:i.z*3, time:3, delay:Math.random(), transition:"easeOutElastic" }); } } num++; } isTween = !isTween; scene.renderCamera(camera); } } }
(2007.09.11)一部修正しました。ありがとうございます>湯茶さん
Comments:2
- 湯茶 07-09-06 (木) 16:29
-
ソースコードにlineAlphaの記述が必要でした。
トゲトゲのソースコードに
material.lineAlpha = 100;
を追加すると上と同じように表示でき。ここのサイトで勉強させてもらって
ほんとにすごく助かってます。
これからも更新おねがいしますヽ( ´ー`)ノ - adamrocker 07-09-11 (火) 22:01
-
コメントありがとうございます。
私の勉強の過程を垂れ流しているだけなので、それが誰かの役に立てていることは嬉しい限りです。
最近、時間が無いのとネタに困っているので更新が滞っていますが、ボチボチと更新していきます。>ソースコードにlineAlphaの記述が必要でした。
ご指摘ありがとうございます。
仰る通り、ライブラリのソースを読むとlineAlphaの初期値が0になってました。修正しておきます〜。
Trackbacks:0
- Trackback URL for this entry
- http://www.adamrocker.com/blog/148/papervision3d_bugfix_colormaterial_linecolor.html/trackback/
- Listed below are links to weblogs that reference
- Papervision3D Rev1.5のColorMaterialのlineColorプロパティのバグを修正する from throw Life
