2009年10月26日月曜日

間違い発見

さっきスペルミスを発見した。(2009/10/26現在)

OpenSocial API リファレンス
上のページのこの部分。
Object value - 更新する値です。有効な josn である必要があります。
josnじゃなくてjsonだと思ふ。他のところはjsonって書いてあるし。

それだけ。

2009年10月24日土曜日

[Pv3D]UVマッピングの問題


UVマッピングを使用したテクスチャに、Shaderを適用すると出てくる例の黒い線を消すべくいろいろやってみた。

日本語のページを探してもこの問題の解決策を見つけられなかったので、英語で調べてみるとこんなものを見つけました。
まさに自分と同じ現象、しかも解決策書いてある!というわけで早速試してみました。

解決方法が書いてあるのはこの一文。
a fix is to change the shadercomposition mode to per_tri on the shader. This will be slower but remove the seams.
意訳すると、「シェーダーのshadercomposition modeをper_triにすれば、重くなるけど線消えるよ。」って感じでしょうか?

shadercomposition modeってのは、ShadedMaterialのプロパティにshaderCompositeModeというのがあるので多分これのことでしょう。
shaderCompositeModeのデフォルトの値は0。
また、ShaderCompositeModesに次のような記述があります。
public static var PER_LAYER:int = 0;
public static var PER_TRIANGLE_IN_BITMAP:int = 1;
per_triというのは、おそらくこのPER_TRIANGLE_IN_BITMAPのこと。
というわけで、
var material:ShadedMaterial = new ShadedMaterial(bitmapmaterial, shader, 1);
という風に記述しました。3つ目の引数がshaderCompositeModeです。

こちらが作ったswfファイルです。重いので反応遅れます。
ソースコードは右クリックで見られます。
他の目的で作ったものをブログ用に適当に改変してるので非効率的な書き方になってます。

上のファイルを見てもらえればわかりますが、この方法を試しても駄目でした。
例の線は消えてはいるようですが、それとはまた別のものが表示されるようになってしまいました。
原因はよくわかりません。

自分は解決しませんでしたが、これで解決する場合もあるかもしれません。

2009年10月18日日曜日

反省とメモ

最近改めて以前公開したソースコードを見直したりしてますが、今見直すと修正したいものが結構あります。
ブログは他人にも見られるものなので一応修正しておきます。

この記事についての訂正です。

var myMaterials:Object = {
    material_2_1_8_image: new BitmapMaterial(material0.bitmapData),
    material_3_2_8_image: new BitmapMaterial(material1.bitmapData),
    material_4_3_8_image: new BitmapMaterial(material2.bitmapData),
中略
    material_28_37_8_image: new BitmapMaterial(material35.bitmapData),
    material_22_38_8_image: new BitmapMaterial(material36.bitmapData),
    material_0_23_8_image: new BitmapMaterial(material37.bitmapData)
}
var daeObject:DAE = new DAE();
daeObject.load(XML(new daeFile()), new MaterialsList(myMaterials));
scene.addChild(daeObject);
Object型は文字『-』を使うとエラーが出たので、Colladaファイルの『-image』を『_image』に置換してました。
これを今書き直すならこうします。
var myMaterials:MaterialsList = new MaterialsList();
myMaterials.addMaterial(new BitmapMaterial(material0.bitmapData), "material_2_1_8-image");
myMaterials.addMaterial(new BitmapMaterial(material1.bitmapData), "material_3_2_8-image");
myMaterials.addMaterial(new BitmapMaterial(material2.bitmapData), "material_4_3_8-image");
中略
myMaterials.addMaterial(new BitmapMaterial(material35.bitmapData), "material_28_37_8-image");
myMaterials.addMaterial(new BitmapMaterial(material36.bitmapData), "material_22_38_8-image");
myMaterials.addMaterial(new BitmapMaterial(material37.bitmapData), "material_0_23_8-image");

var daeObject:DAE = new DAE(false);
daeObject.load(XML(new daeFile()), myMaterials);
scene.addChild(daeObject);
訂正版はコンパイルしたわけではないので、もしかしたらエラーが出るかも・・・
MaterialsList.addMaterialを使えば、文字『-』を使っても問題ない(はず)ですので、こっちのほうがいいです。
ソースコードも多少わかりやすいと思います。


あと、気になった記事のメモ。
Papervision 3D Programming Tutorial - Blend Modes
いろいろあるんですね。

単調なウェブサイトのデザインに手を加えてクオリティをアップするチュートリアル

必ずモノにしたい! ウェブデザイン向け Photoshop チュートリアル16個

cssのテクニックなどを学びたい時に見ておきたい12サイト
未チェック。そのうち見る。

[JS]画像に見出しとキャプションをスライド表示させるチュートリアル
jQuery。

お前等ノートパソコンにステッカー貼らないよな?
ちょっと作ってみたいかも。

2009年10月12日月曜日

[Pv3D]Phong shadingとBump mapping[AS3.0]


久しぶりの更新です。
自転車で東京へ行くっていう馬鹿なことしてたので時間がありませんでした。

さて本題。
Papervision3DのPhongShaderを使ってバンプマッピングをしてみました。
バンプマッピングってのは白黒の画像で表面の凹凸を表現する方法のことらしいです。
こんな感じ。結構CPUに負荷かかるので気をつけてください。

クリックした場所のバンプマップを書き換えてます。
某アニメの最終話みたいに月に落書きします。
note.x | [PV3D2.0] BumpMapの動的書き換え
上の記事を参考に書きました。
月の画像はこちらのを使わせてもらいました。

あまりいい書き方ではないと思いますが、以下ソースコードです。
変数名とか関数名とかかなり適当。
package {
 import flash.display.Bitmap;
 import flash.events.Event;
 import flash.geom.Point;
 import flash.geom.Rectangle;

 import org.papervision3d.core.utils.InteractiveSceneManager;
 import org.papervision3d.core.utils.Mouse3D;
 import org.papervision3d.core.utils.virtualmouse.VirtualMouse;
 import org.papervision3d.lights.PointLight3D;
 import org.papervision3d.materials.BitmapMaterial;
 import org.papervision3d.materials.shaders.PhongShader;
 import org.papervision3d.materials.shaders.ShadedMaterial;
 import org.papervision3d.objects.primitives.Plane;
 import org.papervision3d.objects.primitives.Sphere;
 import org.papervision3d.view.BasicView;

 [SWF(backgroundColor="#ffffff")]
 public class sample_bump extends BasicView {
  // ヴァーチャルマウス
  private var vMouse:VirtualMouse;
  // 球(月)
  private var sphere:Sphere;
  // 月のバンプマップ埋め込み
  [Embed(source="moonbump1k.jpg")] private var bumpImage:Class;
  private var bumpMap:Bitmap = new bumpImage() as Bitmap;
  // シェーダー
  private var shader:PhongShader;

  /* constructor */
  public function sample_bump() {
   super(640, 480, true, true,"Target");

   // カメラ設定
   camera.x = 0;
   camera.y = 0;
   camera.z = 400;
   camera.focus = 1000;
   camera.zoom = 1;

   vMouse = viewport.interactiveSceneManager.virtualMouse;
   Mouse3D.enabled = true;

   /* 背景画像は画像を貼り付けたPlane(平面)を球(月)の奥に設置している */
   // 背景画像埋め込み
   [Embed(source="000191_m.jpg")] var wallpaper:Class;
   var wp:Bitmap = new wallpaper() as Bitmap;
   var star:BitmapMaterial = new BitmapMaterial(wp.bitmapData);
   star.doubleSided = true;
   star.smooth = true;
   var wall:Plane = new Plane(star, 1024, 681);
   wall.z = -200;
   scene.addChild(wall);

   // 月の画像埋め込み
   [Embed(source="moonmap1k.jpg")] var texture:Class;
   var tex:Bitmap = new texture() as Bitmap;
   // ライト設定
   var light:PointLight3D = new PointLight3D();
   light.x = 0;
   light.y = 200;
   light.z = 500;
   scene.addChild(light);

   var bmpMat:BitmapMaterial = new BitmapMaterial(tex.bitmapData);
   shader = new PhongShader(light, 0xFFFFFF, 0x666666, 50, bumpMap.bitmapData, tex.bitmapData);
   var material:ShadedMaterial = new ShadedMaterial(bmpMat, shader);
   material.smooth = true;
   material.interactive = true;

   sphere = new Sphere(material, 100, 16, 12);
   scene.addChild(sphere);

   startRendering();
  }

  // バンプマップ埋め込み
  [Embed(source="bump.png")] private var craterImage:Class;
  private var crater:Bitmap = new craterImage() as Bitmap;
  private function meteor():void {
   // バンプマップ合成
   bumpMap.bitmapData.merge(crater.bitmapData, new Rectangle(0, 0, crater.width, crater.height), new Point(vMouse.x*1000 - crater.width/2, vMouse.y*500 - crater.height/2), 128, 128, 128, 128);

   // バンプマップ更新
   shader.bumpmap = bumpMap.bitmapData;
  }

  override protected function onRenderTick(event:Event=null):void {
   // 回転
   sphere.yaw(0.25);
   if(InteractiveSceneManager.MOUSE_IS_DOWN) {
    meteor();
   }

   super.onRenderTick(event);
  }
 }
}