メイン

2011年02月26日

ビットマップのテクスチャにシェーダーを。

_light = new PointLight3D();
_light.x = 500;
_light.y = 1300;
_light.z = 700;
_light.lookAt(this);

var flatShade :FlatShader = new FlatShader(_light, 0xcccccc, 0x888888, 10);
var iconMate :ShadedMaterial = new ShadedMaterial(new BitmapAssetMaterial("bmpname",false), flatShade);

var bd:BitmapData = new BitmapData(100, 100, false, 0x333333);
var mate:BitmapMaterial = new BitmapMaterial(bd)
mate.lineThickness = 1;
mate.lineColor = 0xcccccc;
mate.lineAlpha = 1;

pv3dの3d計算だけつかう

http://www.ua-labo.com/entries/pid000038.html
なるほどー、参考になります。

autoCalcScreenCoords=trueにして
screenを使うのと

hoge.scaleX =
hoge.scaleY = _camera.focus / (_camera.focus + hoge.screen.z) * _camera.zoom

を使うのがポイント

クリッピングをきれいに

カメラ近くのポリゴンがかけるときがある。

_renderer.clipping = new FrustumClipping(FrustumClipping.BOTTOM);
do3d.useClipping = true
とすると地面のクリッピングがきれいになる

BOTTOMとかALLとかNEARとか設定できる。
場合によって選べばよいかもしれない。


_renderer.clipping//何も設定せずデフォルト値。
do3d.useClipping = false;
だと軽くはなるが、カメラ付近で地面が出たり消えたりしてしまうっぽい


pv3dでalphaやfilterをあつかう

var o:Plane = new Plane(new ColorMaterial(), 100, 100, 1, 1);
o.useOwnContainer = true;
o.filters = [new BlurFilter()];
o.alpha = 0.5;

2011年02月13日

pv3dで等倍表示

ピクセル等倍になる距離 = camera.focus * camera.zoom

2010年11月01日

materialList

var materialList:MaterialsList = new MaterialsList();

materialList.addMaterial(new ColorMaterial(0xDF2975), "front");

materialList.addMaterial(new ColorMaterial(0xFF5B4F), "back");

materialList.addMaterial(new ColorMaterial(0x624FFF), "right");

materialList.addMaterial(new ColorMaterial(0x4FF2FF), "left");

materialList.addMaterial(new ColorMaterial(0x4FFF88), "top");

materialList.addMaterial(new ColorMaterial(0xDCFF4F), "bottom");

2010年03月08日

camera.lookAtとcamera.rotationの関係性メモ

_camera.x=0;
_camera.y=0;
_camera.z=0;
_camera.lookAt(_tgt);

_tgtが(100,0,0)のとき _camera.rotationは(0,90,0);
_tgtが(-100,0,0)のとき _camera.rotationは(0,-90,0);
_tgtが(0,0,100)のとき _camera.rotationは(0,0,0);
_tgtが(0,0,-100)のとき _camera.rotationは(180,0,180);

2010年03月07日

sphereのmaterial

sphereのmaterialの任意の座標(x,y)
(ただしx: 0~1、y: 0~1)

sphereにおける緯度経度

経度(横の角度) = x * 2 * Math.PI
緯度(縦の角度) = (0.5-y)*Math.PI

に対応する(と思う)

緯度の計算に関しては
孤の長さと、ラジアンの対応関係からきている(と思う)

参考
http://psyark.jp/?entry=20050925191451

2010年02月09日

MovieMaterialのテクスチャ

MovieMaterialのdrawBitmapで
テクスチャにdrawする。

または
MovieMaterial.bitmap
に直接書き込んじゃってもいいんじゃないかな

2009年04月09日

pv3d2.0のコピペ用サンプル

package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;

import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;

public class Symbol3d extends Sprite
{
private var renderer:BasicRenderEngine
private var scene:Scene3D;
private var camera:Camera3D;
private var viewport:Viewport3D;


public function Symbol3d()
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

renderer = new BasicRenderEngine();
scene = new Scene3D();
camera = new Camera3D();
viewport = new Viewport3D(0, 0, true, false);
addChild(viewport);

camera.z = -400;
camera.focus = 1100;
camera.zoom = 1;

var cube:Cube =new Cube(new MaterialsList({all:new ColorMaterial(0xff0000)}),200,200,200,1,1,1);
cube.y = 200;
scene.addChild(cube);

var plane:Plane = new Plane(new ColorMaterial(0xffffff),500,500,10,10);
plane.pitch(90);
scene.addChild(plane);

stage.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
}

private function handleEnterFrame(e:Event):void
{
camera.x=camera.y=camera.z=0;
camera.yaw(.5);
camera.moveBackward(1000);
camera.moveUp(200);

renderer.renderScene(scene, camera, viewport);
}

}
}

2008年11月16日

フォグ効果 fog filter

var fogMaterial:FogMaterial = new FogMaterial(0x000000);
var fogLayers:int = 10;
var minDepth:Number = 1000;
var maxDepth:Number = 1600;
_renderer.filter = new FogFilter(fogMaterial, fogLayers, minDepth, maxDepth);

viewportLayerに関する記事

http://d.hatena.ne.jp/mugaki/20081020/1224508846

2008年11月14日

DAE.removeChild()

DAEクラスのremoveChildはつかえない。。
無限ループしちゃて
Error: Error #1023: スタックオーバーフローが発生しました。
とでる。addChildはできるのに。。

DAEクラスに書かれているremoveChildメソッドをごっそり消してしまいましょう。
do3dのremoveChildをoverrideしているだけだったので、問題ないです。

2008年11月11日

copyTransform 値がおかしくなる

_plane.copyTransform(camera);
_plane.moveForward(1000);

このようにcopyTransformすると、上記のcameraの値もおかしくなるときがあった。
下記のようにしたら直った。 よくわからん。

camera.rotationX;
camera.rotationY;
camera.rotationZ;
_plane.copyTransform(camera);
_plane.moveForward(1000);

2008年11月09日

DisplayObject3D.screen

_do3d..autoCalcScreenCoords = true;
にして

_do3d.screen.x
_do3d.screen.y
_do3d.screen.z

で表示上のx,y,zが取得できる。

(x,y)は まんま画面のx,y ただし(0,0)は左端でなく、どまんなか。
zはよく分かりません。

2008年11月07日

particles

こないだは何か知らんがparticlesを量産していた。
particleを量産し、particlesはそれらを内包するものだろう。

var particles:Particles = new Particles("snow");

for(var i:int = 0; i var bmpData:BitmapData = new (getDefinitionByName("snowpng"))(1, 1);
var mat:BitmapParticleMaterial = new BitmapParticleMaterial(bmpData);
mat.smooth = true;

var particle:Particle = new Particle(mat, 5, 0, 0, 0);
particles.addParticle(particle);

particle.x = 1000*(Math.random()-0.5)
particle.y = 1000*(Math.random()-0.5)
particle.z = 1000*(Math.random()-0.5)

_particles.push(particle);
}

this.addChild(particles);

2008年11月06日

MovieAssetParticleMaterial

MovieAssetParticleMaterialのbitmapを随時更新してたら、アニメーションします。

動的なマテリアルの生成1

1.org.papervision3d.core.render.material.MaterialManagerをみる
マテリアル群はこの中に格納されていると推測

2.そのなかの
updateMaterialsBeforeRender(renderSessionData:RenderSessionData):void
をみる

3.そのメソッド内に
if(m is IUpdateBeforeMaterial){
um = m as IUpdateBeforeMaterial;
um.updateBeforeRender(renderSessionData);
}
とある。

4.IUpdateBeforeMaterialというインターフェイスを持つマテリアルに対してのみ
レンダリングの度に更新されているのではないか。

5.実際にやってみます

2008年11月05日

入れ子はおもい?

http://flash.polig.daa.jp/?eid=925331
入れ子はおもいっぽい情報がありますので 注意しよう

2008年11月04日

translateをつかって(dx,dy,dz)移動する

var dist:Number = Math.sqrt(dx * dx + dy * dy + dz * dz );
do3d.translate(dist, new Number3D(dx,dy,dz));

do3dがどっちを向いていようとも。

2008年10月26日

do3d.translate

public function translate( distance:Number, axis:Number3D ):void
ってのがあります。

moveForward
moveBack
moveLeft
moveRight
の仲間だと思われます

distanceぶん、axis方向へ移動という意味だと推測しています。

axisが[1,0,0]だったらx方向にのみ移動
axisが[0.33,0.33,0.33]だったらx,y,zに33%ずつ移動
その移動距離はdistanceになる。

--

でもよくわかってません。。

カメラのコントロールについて OOP本を参考に。

●登場人物
private var pinto:DisplayObject3D;
private var targetCameraPos:DisplayObject3D;

●レンダリング
//pintoはターゲット(this.targetModel)へトゥイーンします
this.pinto.x += EASING * (this.targetModel.x - this.pinto.x);
this.pinto.y += EASING * (this.targetModel.y - this.pinto.y);
this.pinto.z += EASING * (this.targetModel.z - this.pinto.z);

//cameraはtargetCameraPosへトゥイーンします
//targetCameraPosはthis.targetModelから ちょっと離れた位置にあります
this.camera.x += EASING * (this.targetCameraPos.x - this.camera.x);
this.camera.y += EASING * (this.targetCameraPos.y - this.camera.y);
this.camera.z += EASING * (this.targetCameraPos.z - this.camera.z);

//カメラは常にpintoの方向を向いています
this.camera.lookAt(this.pinto);

DisplayObject3Dを常に正面から捕らえるカメラ

//こういう風に動きまくっても
do3d.rotationY += 5;
do3d.rotationX += 2;
do3d.rotationZ += 4;
do3d.x = 100 * Math.sin(_cnt/10);
do3d.y = 100 * Math.cos(_cnt/10);
do3d.z = 100 * Math.sin(_cnt/10);

//こうすれば常にdo3dの正面に。
camera.copyTransform(do3d);
camera.moveBackward(600);//do3dから600離れて撮る

2008年10月25日

pitch roll yaw

pitch x軸に対して 回転
yaw() y軸に対して 回転
roll() z軸に対して 回転

pv3d2のdoc

http://www.flashbookmarks.com/PV3D-GreatWhite-DOC/

2008年10月17日

geometry.vertices

planeの各頂点は下記のようにアクセスします。

for (var i:uint = 0; i < plane.geometry.vertices.length;i++){
//for (var v:Vertex3D in plane.geometry.vertices) {
var v:Vertex3D = plane.geometry.vertices[i];
trace(v.x,v.y,v.z);

}
}

2008年10月16日

camera3Dのプロパティビューワー

DebugCamera3Dだかがあったんだけど使い方が良く分からんかったので、
とりあえずプロパティがみえるのを製作

----

package wmobile.pv3d.debug {
import flash.text.TextField;
import org.papervision3d.cameras.Camera3D;

/**
* @author watanabe
*/
public class CameraDebug extends TextField{

public function CameraDebug() {
this.selectable = false;
this.width = 200;
this.height = 200;
this.textColor = 0xFFFF00;
}

public function update(camera:Camera3D):void {
this.text = "";

this.appendText( "x: " + Math.round( camera.x ) + "\n");
this.appendText( "y: " + Math.round( camera.y ) + "\n");
this.appendText( "z: " + Math.round( camera.z ) + "\n");

this.appendText( "rotX: " + Math.round( camera.rotationX ) + "\n");
this.appendText( "rotY: " + Math.round( camera.rotationY ) + "\n");
this.appendText( "rotZ: " + Math.round( camera.rotationZ ) + "\n");

this.appendText( "localRotX " + Math.round ( camera.localRotationX%360 ) + "\n");
this.appendText( "localRotY " + Math.round ( camera.localRotationY%360 ) + "\n");
this.appendText( "localRotZ " + Math.round ( camera.localRotationZ%360 ) + "\n");

}



}

}

particle


particleの使い方がやっと分かった。

---
holder=new DisplayObject3D();

for(var i:uint=0 ; i<100; i++){
var bmpData:BitmapData = new (getDefinitionByName("b"))(1, 1);
var mat:BitmapParticleMaterial = new BitmapParticleMaterial(bmpData);
mat.smooth = true;

var flakeHolder:Particles = new Particles("flake" + i);
var flake:Particle = new Particle(mat, 100, 0, 0, 0);

flakeHolder.addParticle(flake);

flakeHolder.x = 500*(Math.random()-0.5)
flakeHolder.y = 500*(Math.random()-0.5)
flakeHolder.z = 500*(Math.random()-0.5)

holder.addChild(flakeHolder);
}

scene.addChild(holder);

2008年02月07日

camera / plane

----- plane (z=0)


■ camera (z=-100)

2008年02月04日

BasicRenderEngine

doRender

sorter.sort(renderList)

パースを付けたくない2

zSortしないと。

ary.sortOn("z", Array.NUMERIC);//aryの各要素のzプロパティを見てソート

var len:uint=ary.length;
for(var i:uint = 0; i < len; i++){
var mc:Point3d = ary[i];
setChildIndex(mc, i);
}

パースを付けたくない

pv3dにはプリミティブな形状というのが定義されている。平面とか、球とか、円柱とか。

sceneにaddChildすると、それらはカメラ位置によってパースがつく。

でも、付けたくない場合もあるかもしれない。だって重いんだもん。ふつーにずーっとカメラに対して真正面を向いているようにしたい。全3dオブジェクトに対してlookAt(camera)を指定すればいいが、どうしても負荷がかかってしまうようだ。

そこで
var d=new DisplayObject3D;
scene.addChild(d);
と空のDispObj3Dを用意し、

var s=new Sprite();
s.x=d.screen.x;
s.y=d.screen.y;
s.scaleX=s.scaleY=camera.focus / ( camera.focus + d.screen.z ) * camera.zoom
this.addChild(s);

とした。thisはふつーのspriteとか。問題なく動いた。たぶん。
でも、これじゃ深度がうまくいかない。もっと良い方法があればいいな。
あと、これに平行四辺形の単純な変形を加えればさらにいいかも。

2008年02月03日

renderSessionData

renderSessionData.scene = scene;
renderSessionData.camera = camera;
renderSessionData.viewPort = viewPort;
renderSessionData.container = viewPort.containerSprite;
renderSessionData.triangleCuller = viewPort.triangleCuller;
renderSessionData.particleCuller = viewPort.particleCuller;
renderSessionData.renderStatistics.clear();

BasicRenderEngine内

camera

http://cs3book.flashoop.jp/wiki/index.php?paper%20vision#h9e147c6

●Camera まずカメラの設定から始まります。zoomとfocusについて話します。まずzoomですが、これは倍率を指します。これは100 × 100のオブジェクトがカメラに最も近づいたときに、zoomが1(等倍)であればViewport上に100 × 100で描画されます。続いてfocusですが、まず下記の図をご覧ください。

●カメラのfocusの概念
focusとはカメラから、カメラを覗く目までの距離を表します。目が遠ければ遠いほど視野角度が狭くなり望遠な絵になります。また、目が近ければ近いほど、視野角度が広くなり、広角な絵(奥行きを強く感じられる絵)になります。

なるほど、ありがとうございます

geometry

http://blog.r3c7.net/?p=67


Planeとかで作った形状の頂点データは、Vertex3DオブジェクトとしてDisplayObject3Dのgeometryプロパティに、要はGeometryObject3Dオブジェクトのvertices:Arrayとして格納されるみたいだ。なので、

for each(obj_vartices in planeObj.geometry.vertices){
obj_vartices.x = 1;
obj_vartices.y = 1;
obj_vartices.z = 1;
}

とかやれば、形状を構成する全部の頂点を制御できると。

なるほど2.0では未確認ですが、ありがとうございます。

2008年02月01日

document2.0

http://www.flashbookmarks.com/pv3ddoc/

カリング クリッピングについて

http://monsho.hp.infoseek.co.jp/dx/dx51.html

・クリッピング
これは基本的に描画する必要がない、というか出来ない部分を描画しない方法です。

・カリング
描画するポリゴンそのものを間引く方法です。クリップ面に少しも入っていないポリゴンを初めから描画しないようにする、というのがこの処理です。

・シザリング
そしてもう一つがシザリングです。これは、クリップ面を跨いでしまっているポリゴンをクリップ面にしたがって切る方法です。
この処理を行わないと例えばニアクリップ面を跨いだときなど明確におかしなポリゴンが表示されてしまいます。

2008年01月31日

lookAt

つねにオブジェクトがカメラを見ているような。
plane.lookAt(camera)
とする。

これはつまり座標の計算だけして、パースを付けない。
ということなんだけど、
内部的にはパースの計算もしちゃってるのかなあ。うーむ。

動きのあるマテリアル

動きのあるマテリアルは
MovieMaterial
を使っている。これはムービークリップをテクスチャにできる。

MovieMaterialは
レンダリング時に、対象のムービークリップをdrawし、その結果をテクスチャに反映させる。

drawはcopyPixelsの4倍遅い。

あらかじめ決まった動きのするもの、PNG連番などに対しては
material.bitmap.copyPixels
としたほうが、高速に動作するはずだ。

※直接bitmapをdraw/copyPixelsするとrenderer.renderを使わずともパースのついた絵が更新される。なぜだろう。逆にdrawを行わないと、絵は更新はされない(再描画領域をみても更新されていない)。
renderer.renderを行うと、drawが行われていようが、いまいが絵は更新される(再描画領域を見ると更新されている)

パースが変わらないとき、カメラが動かないときはdrawをしたほうがよいのか。
rendererのメソッドでなんか、そのへんをいい感じにするものがあるのか。調べないといけない

material.bitmap

plane.material.bitmap

で直接bitmapDataを操作!

2008年01月30日

ゆび!

http://feb19.jp/blog/archives/000122.php

interactive

http://pv3d.org/2008/01/06/7-basic-interactivity/

インタラクティブ付加。

MovieMaterial

第3引数animated
MovieMaterial( movieAsset:DisplayObject=null, transparent:Boolean=false, animated:Boolean=false, precise:Bool);

2008年01月29日

回転

http://www.nilab.info/zurazure2/000859.html

http://yamasv.blog92.fc2.com/blog-entry-114.html

rendrer

renderer.renderScene(scene, camera, viewport);

scene: 実際のブツ(DisplayObject)が入っている。動いている。
camera: カメラ位置
viewport: 出力した絵、bitmapみたいな感じ

render→sceneをcameraでviewportに出力みたいな意味だと思われる。

viewportは テキトーなMCとかでaddChildすりゃいい。

2008年01月28日

movieMaterial

コンストラクタはこんな。

MovieMaterial( movieAsset:DisplayObject=null, transparent:Boolean=false, animated:Boolean=false, precise:Boolean = false )

静止画でなくて再生するにはanimated=trueに。

マテリアルの更新は MovieMaterial.updateBitmap();を呼ぶ。

マテリアル

マテリアル

ただし、このdocsは2.0ではない。

2008年01月24日

pv3d 2.0 DL

http://papervision3d.googlecode.com/svn/trunk/

はじめのイッポ
http://yamasv.blog92.fc2.com/blog-entry-101.html