Home > papervision3d > Papervision3D Rev1.5のColorMaterialのlineColorプロパティのバグを修正する

Papervision3D Rev1.5のColorMaterialのlineColorプロパティのバグを修正する

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を実装します。

drawFace3Dのバグ修正

ではさっそく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を描いただけです。

修正したColorMaterialをテスト

前回のエントリ「TweenerでPapervision3DのSphereをトゲトゲにする」ではマテリアルとしてWireframeMaterialを使いました。それを今回修正したColorMaterialに置き換えてみます。

もともとWireframeMaterialでした。

material = new WireframeMaterial( 0x999999 );

それをColorMaterialに変更します。

material = new ColorMaterial(0x000000, 0.5);

Sphereオブジェクトをクリックすると滑らかにトゲトゲになります。

ちゃんとlineColorが反映されていますね。

Source Code

一応、ソースコードも公開しておきます。
以前のエントリから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になってました。修正しておきます〜。

Comment Form
Remember personal info

*
To prove that you're not a bot, enter this code
Anti-Spam Image

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

Home > papervision3d > Papervision3D Rev1.5のColorMaterialのlineColorプロパティのバグを修正する

Search
Feeds
Meta

Return to page top