Metasequoia.asをインタラクティブにする方法:詳細編

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2008年3月3日 月曜日0:58:26

新コード

取り敢えず、前回の記事にあるとおり、Metasequoia#parseFaceを変更し、元になるMetasequoiaインスタンスを受け取るようにする。その代わり、受け取ってたfacesとverticesは不要になる。parseFace内で取得すればいいからね。
あと、vertexOffsetを受け取ってたが、オブジェクトチャンクをそれぞれ別オブジェクトとして受け取る今となっては不要なものだ(常に0なので)。なので、受け取らないし、関数内でも取得しない。使ってるところからは消す。

で、こうなる。

private function parseFace(obj:Metasequoia , line:String, properties:Dictionary):void {
    var faces:Array = obj.geometry.faces;
    var vertices:Array = obj.geometry.vertices;
    var vstr:String = getParam(line, "V");
    var mstr:String = getParam(line, "M");
    var uvstr:String = getParam(line, "UV");
   
    var v:Array = (vstr != null) ? vstr.match(/\d+/g) : [];
    var uv:Array = (uvstr != null) ? uvstr.match(/-?\d+\.\d+/g) : [];
    var a:Vertex3D;
    var b:Vertex3D;
    var c:Vertex3D;
    var d:Vertex3D;
    var material:MaterialObject3D;
    var uvA:NumberUV;
    var uvB:NumberUV;
    var uvC:NumberUV;
    var uvD:NumberUV;
    var face:Triangle3D;
   
    if (v.length == 3) {
        c = vertices[parseInt(v[0])];
        b = vertices[parseInt(v[1])];
        a = vertices[parseInt(v[2])];
       
        if (mstr != null) {
            material = materials.getMaterialByName(_materialNames[parseInt(mstr)]);
        }
       
        if (uv.length != 0) {
            uvC = new NumberUV(parseFloat(uv[0]), 1 - parseFloat(uv[1]));
            uvB = new NumberUV(parseFloat(uv[2]), 1 - parseFloat(uv[3]));
            uvA = new NumberUV(parseFloat(uv[4]), 1 - parseFloat(uv[5]));
            face = new Triangle3D(obj, [a, b, c], material, [uvA, uvB, uvC]);
        } else {
            face = new Triangle3D(obj, [a, b, c], material,
                [new NumberUV(0, 0), new NumberUV(1, 0), new NumberUV(0, 1)]);
        }
       
        faces.push(face);
       
        if (properties["mirror"] == "1") {
            var mirrorAxis:int = parseInt(properties["mirror_axis"]);
            a = mirrorVertex(a, mirrorAxis);
            b = mirrorVertex(b, mirrorAxis);
            c = mirrorVertex(c, mirrorAxis);
            vertices.push(a);
            vertices.push(b);
            vertices.push(c);
            face = new Triangle3D(obj, [c, b, a], material, face.uv.reverse());
            faces.push(face);
        }
    } else if (v.length == 4) {
        d = vertices[parseInt(v[0])];
        c = vertices[parseInt(v[1])];
        b = vertices[parseInt(v[2])];
        a = vertices[parseInt(v[3])];
       
        if (mstr != null) {
            material = materials.getMaterialByName(_materialNames[parseInt(mstr)]);
        }
       
        if (uv.length != 0) {
            uvD = new NumberUV(parseFloat(uv[0]), 1 - parseFloat(uv[1]));
            uvC = new NumberUV(parseFloat(uv[2]), 1 - parseFloat(uv[3]));
            uvB = new NumberUV(parseFloat(uv[4]), 1 - parseFloat(uv[5]));
            uvA = new NumberUV(parseFloat(uv[6]), 1 - parseFloat(uv[7]));
        } else {
            uvD = new NumberUV(0, 0);
            uvC = new NumberUV(1, 0);
            uvB = new NumberUV(0, 1);
            uvA = new NumberUV(1, 1);
        }
        face = new Triangle3D(obj, [a, b, c], material, [uvA, uvB, uvC]);
        faces.push(face);
        face = new Triangle3D(obj, [c, d, a], material, [uvC, uvD, uvA]);
        faces.push(face);
       
        if (properties["mirror"] == "1") {
            mirrorAxis = parseInt(properties["mirror_axis"]);
            a = mirrorVertex(a, mirrorAxis);
            b = mirrorVertex(b, mirrorAxis);
            c = mirrorVertex(c, mirrorAxis);
            d = mirrorVertex(d, mirrorAxis);
            vertices.push(a);
            vertices.push(b);
            vertices.push(c);
            vertices.push(d);
            face = new Triangle3D(obj, [c, b, a], material, [uvC, uvB, uvA]);
            faces.push(face);
            face = new Triangle3D(obj, [a, d, c], material, [uvA, uvD, uvC]);
            faces.push(face);
        }
    }
}

で、呼び出し側はこんな感じ。

parseFace(mesh , lines[l] , properties);

Materialの方は、最上位オブジェクトにだけ設定しとけばいいみたいで、現状から変更の必要は無かった。

  • ページ:
  • 1
  • 2
  • 3

TrackBack URL :

コメントする

HTML convert time: 1.046 sec.