PV3DのTriangleMesh3Dの練習08 Primitives等も使って無理やりDroid作成実験

by siouxcitizen forked from PV3DのTriangleMesh3Dの練習07 Sphereクラスを修正して半球クラス作成実験 (diff: 106)
♥0 | Line 169 | Modified 2011-03-01 06:23:15 | MIT License
play

ActionScript3 source code

/**
 * Copyright siouxcitizen ( http://wonderfl.net/user/siouxcitizen )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/qv3S
 */

// forked from siouxcitizen's PV3DのTriangleMesh3Dの練習07 Sphereクラスを修正して半球クラス作成実験
//PV3DのTriangleMesh3Dの練習08 Primitives等も使って無理やりDroid作成実験
//引き続きかなりムリヤリテキトーに、Hemisphereモデルに加えてCylinderモデルも使いつつをDroid作成してます。。。
//
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import org.papervision3d.objects.primitives.Cylinder;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.view.*;
    public class Main extends BasicView {

        private var light:PointLight3D
        private var head:Hemisphere;
        private var body:Cylinder;
        private var leftHand:Cylinder;
        private var rightHand:Cylinder;
        private var leftFoot:Cylinder;
        private var rightFoot:Cylinder;
        private var leftAntenna:Cylinder;
        private var rightAntenna:Cylinder;
        private var leftEye:Hemisphere;
        private var rightEye:Hemisphere;

        public function Main() {
            //光源設定
            light = new PointLight3D();
            light.y = -8000;
            light.x = -8000;
            light.z = -8000;

            //var wMate : WireframeMaterial = new WireframeMaterial(0x0000ff);
            var cMate : ColorMaterial = new ColorMaterial(0xdddddd);
            var fMate : FlatShadeMaterial = new FlatShadeMaterial(light, 0x779977, 0x00ff00);
            fMate.doubleSided = true;

            head = new Hemisphere(fMate, 300, 10, 10);
            head.y = 300;

            body = new Cylinder(fMate, 300, 500, 14, 3);
            body.y = 280;
            head.addChild(body);

            leftHand = new Cylinder(fMate, 100, 450, 12, 3);
            leftHand.x = -420;
            leftHand.y = -30;
            body.addChild(leftHand);

            rightHand = new Cylinder(fMate, 100, 450, 12, 3);
            rightHand.x = 420;
            rightHand.y = -30;
            body.addChild(rightHand);

            leftFoot = new Cylinder(fMate, 100, 250, 12, 3);
            leftFoot.x = -160;
            leftFoot.y = 380;
            body.addChild(leftFoot);

            rightFoot = new Cylinder(fMate, 100, 250, 12, 3);
            rightFoot.x = 160;
            rightFoot.y = 380;
            body.addChild(rightFoot);

            leftAntenna = new Cylinder(fMate, 15, 150, 4, 3);
            leftAntenna.x = -160;
            leftAntenna.y = -330;
            leftAntenna.rotationZ = -45;
            head.addChild(leftAntenna);

            rightAntenna = new Cylinder(fMate, 15, 150, 4, 3);
            rightAntenna.x = 160;
            rightAntenna.y = -330;
            rightAntenna.rotationZ = 45;
            head.addChild(rightAntenna);

leftEye = new Hemisphere(cMate, 30, 8, 4);
            leftEye.x = -100;
            leftEye.y = -70;
            leftEye.z = -280;
            leftEye.rotationX = 90;
            head.addChild(leftEye);

rightEye = new Hemisphere(cMate, 30, 8, 4);
            rightEye.x = 100;
            rightEye.y = -70;
            rightEye.z = -280;
            rightEye.rotationX = 90;
            head.addChild(rightEye);

            scene.addChild(head);
            
            startRendering();
            
            this.addEventListener(Event.ENTER_FRAME, loop);
        }
        
        private function loop(evt:Event):void {
            head.rotationX=viewport.mouseX;
            head.rotationY=viewport.mouseY;
        }
    }
}

import org.papervision3d.Papervision3D;
import org.papervision3d.core.geom.*;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.math.NumberUV;
import org.papervision3d.core.proto.*;  
class Hemisphere extends TriangleMesh3D {

    private var segmentsW :Number;
    private var segmentsH :Number;
    static public var DEFAULT_RADIUS :Number = 100;
    static public var DEFAULT_SCALE :Number = 1;
    static public var DEFAULT_SEGMENTSW :Number = 8;
    static public var DEFAULT_SEGMENTSH :Number = 6;
    static public var MIN_SEGMENTSW :Number = 3;
    static public var MIN_SEGMENTSH :Number = 2;

    public function Hemisphere( material:MaterialObject3D=null, radius:Number=100, segmentsW:int=8, segmentsH:int=6 ) {
        super( material, new Array(), new Array(), null );

        this.segmentsW = Math.max( MIN_SEGMENTSW, segmentsW || DEFAULT_SEGMENTSW); // Defaults to 8
        this.segmentsH = Math.max( MIN_SEGMENTSH, segmentsH || DEFAULT_SEGMENTSH); // Defaults to 6
        if (radius==0) radius = DEFAULT_RADIUS; // Defaults to 100

        var scale :Number = DEFAULT_SCALE;

        buildHemiphere( radius );
    }

    private function buildHemiphere( fRadius:Number ):void {
        var i:Number, j:Number, k:Number;
        var iHor:Number = Math.max(3,this.segmentsW);
        var iVer:Number = Math.max(2,this.segmentsH);
        var aVertice:Array = this.geometry.vertices;
        var aFace:Array = this.geometry.faces;
        var aVtc:Array = new Array();
        for (j=0;j<(iVer/2+1);j++) { // vertical
            var fRad1:Number = Number(j/iVer);
            var fZ:Number = -fRadius*Math.cos(fRad1*Math.PI);
            var fRds:Number = fRadius*Math.sin(fRad1*Math.PI);
            var aRow:Array = new Array();
            var oVtx:Vertex3D;
            for (i=0;i<iHor;i++) { // horizontal
                var fRad2:Number = Number(2*i/iHor);
                var fX:Number = fRds*Math.sin(fRad2*Math.PI);
                var fY:Number = fRds*Math.cos(fRad2*Math.PI);
                if (!((j==0||j==iVer)&&i>0)) { // top||bottom = 1 vertex
                    oVtx = new Vertex3D(fY,fZ,fX);
                    aVertice.push(oVtx);
                }
                aRow.push(oVtx);
            }
            aVtc.push(aRow);
        }
        var iVerNum:int = aVtc.length;
        for (j=0;j<iVerNum;j++) {
            var iHorNum:int = aVtc[j].length;
            if (j>0) { // &&i>=0
                for (i=0;i<iHorNum;i++) {
                    // select vertices
                    var bEnd:Boolean = i==(iHorNum-1);
                    var aP1:Vertex3D = aVtc[j][bEnd?0:i+1];
                    var aP2:Vertex3D = aVtc[j][(bEnd?iHorNum-1:i)];
                    var aP3:Vertex3D = aVtc[j-1][(bEnd?iHorNum-1:i)];
                    var aP4:Vertex3D = aVtc[j-1][bEnd?0:i+1];

                    var fJ0:Number = j / (iVerNum-1);
                    var fJ1:Number = (j-1) / (iVerNum-1);
                    var fI0:Number = (i+1) / iHorNum;
                    var fI1:Number = i / iHorNum;
                    var aP4uv:NumberUV = new NumberUV(fI0,fJ1);
                    var aP1uv:NumberUV = new NumberUV(fI0,fJ0);
                    var aP2uv:NumberUV = new NumberUV(fI1,fJ0);
                    var aP3uv:NumberUV = new NumberUV(fI1,fJ1);
                    // 2 faces
                    if (j<(aVtc.length-1))  aFace.push( new Triangle3D(this, new Array(aP1,aP2,aP3), material, new Array(aP1uv,aP2uv,aP3uv)) );
                    if (j>1) aFace.push( new Triangle3D(this, new Array(aP1,aP3,aP4), material, new Array(aP1uv,aP3uv,aP4uv)) );
                }
            }
        }
        //半球下部の欠けている部分を作成
        for (i=0;i<iHorNum;i++) {
            var bEnd_2:Boolean = i==(iHorNum-1);
            var aP1_2:Vertex3D = aVtc[iVerNum-1][bEnd_2?0:i+1];
            var aP2_2:Vertex3D = aVtc[iVerNum-1][bEnd_2?iHorNum-1:i];
            var aP3_2:Vertex3D = aVtc[iVerNum-2][bEnd_2?iHorNum-1:i];

            //uvよくわからないのでとりあえず。。。
            var uvA : NumberUV = new NumberUV( 0, 0 );
            var uvC : NumberUV = new NumberUV( 1, 0 );
            var uvB : NumberUV = new NumberUV( 0, 1 );

            aFace.push( new Triangle3D(this, new Array(aP1_2,aP2_2,aP3_2), material, new Array(uvA,uvC,uvB)) );
        }
        for each(var t:Triangle3D in aFace) {
            t.renderCommand.create = createRenderTriangle;
        }
        
        this.geometry.ready = true;
        
        if (Papervision3D.useRIGHTHANDED) this.geometry.flipFaces();
    }
}