Metasequoia.asをインタラクティブにする方法:詳細編
新コード
取り敢えず、前回の記事にあるとおり、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);
}
}
}
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の方は、最上位オブジェクトにだけ設定しとけばいいみたいで、現状から変更の必要は無かった。
カテゴリ:ActionScript |Papervision3D




