NARUTOを見ながら、Ribbon3Dを試してみた→拡張現実で螺旋丸が出来た。
Ribbon3Dのサンプル部分のコード
今回は、Ribbon3Dを使って螺旋丸を表現するクラス「Rasengan」を作ってみた。
これね。
{
import org.papervision3d.core.material.TriangleMaterial;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.DisplayObject3D;
import soulwire.papervision3d.Ribbon3D;
/**
* 螺旋丸っぽい感じで
* @author 太郎
*/
public class Rasengan extends DisplayObject3D
{
private var _ribbons:Vector.<Ribbon3D>;
private var _rasengan:DisplayObject3D;
private var _theta:Number;
private var _speed:Number;
private var _rotateSpeed:Number;
private var _sizeMin:uint;
private var _sizeDelta:uint;
public function Rasengan(ribbonCount:Number,
speed:Number = 2,
rotateSpeed:Number = 3,
sizeMin:uint = 50,
sizeDelta:uint = 3,
thickness:uint = 2,
light:PointLight3D = null,
lightColorMin:uint = 0,
lightColorMax:uint = 0xFFFFFF,
ambientColorMin:uint = 0,
ambientColorMax:uint = 0xFFFFFF)
{
this._theta = 0;
this._speed = speed;
this._rotateSpeed = rotateSpeed;
this._sizeMin = sizeMin;
this._sizeDelta = sizeDelta;
this._ribbons = new Vector.<Ribbon3D>();
if (light == null) {
light = new PointLight3D();
}
var mat:TriangleMaterial;
var lightColor:uint;
var ambientColor:uint;
var r:Ribbon3D;
for (var i:int = 0; i <ribbonCount; i++) {
lightColor = Math.random() * (lightColorMax - lightColorMin) + lightColorMin;
ambientColor = Math.random() * (ambientColorMax - ambientColorMin) + ambientColorMin;
mat = new FlatShadeMaterial(light, lightColor, ambientColor, 10);
mat.doubleSided = true;
r = new Ribbon3D(mat, thickness, Math.random() * 100+50);
r.rotationX = Math.random() * ribbonCount * (90 * i);
r.rotationY = Math.random() * ribbonCount * (90 * i);
r.rotationZ = Math.random() * ribbonCount * (90 * i);
this._ribbons.push(r);
this.addChild(r);
}
}
public function draw():void
{
this._theta += this._speed;
this.rotationX += this._rotateSpeed;
this.rotationY += this._rotateSpeed;
this.rotationZ += this._rotateSpeed;
var tp:Number = (this._theta * Math.PI / 180);
var size:Number = this._sizeMin;
var xBase:Number = Math.cos((this._theta * Math.PI / 180)) * Math.cos((this._theta * Math.PI / 180) * 12);
var yBase:Number = Math.cos((this._theta * Math.PI / 180)) * Math.sin((this._theta * Math.PI / 180) * 12);
var zBase:Number = Math.sin((this._theta * Math.PI / 180));
for each(var r:Ribbon3D in this._ribbons) {
r.x = size * xBase;
r.y = size * yBase;
r.z = size * zBase;
r.draw();
size += this._sizeDelta;
}
this._theta %= 360;
}
private function get numRibbons():int
{
return this._ribbons.length;
}
public function get sizeMin():uint { return _sizeMin; }
public function set sizeMin(value:uint):void
{
_sizeMin = value;
}
public function get sizeDelta():uint { return _sizeDelta; }
public function set sizeDelta(value:uint):void
{
_sizeDelta = value;
}
}
}
- ページ:
- 1
- 2



