太郎日記’79J

「やったろうやないの。」な太郎のblog
技術ネタはタロタローグに任せて、こっちはニュースメインで。
<< July 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
RECOMMEND
MySQLによるタフなサイトの作り方
MySQLによるタフなサイトの作り方 (JUGEMレビュー »)
佐藤 真人,桑野 章弘,岡田 達典,大黒 圭祐
MySQLだけでなく、DBサーバやアプリの設計など、あらゆる手段を使ってタフなサイトを作る本である
最新記事
あわせて読みたい
あわせて読みたい
なかのひと
ClusterMaps
CM by JUGEM
スポンサーサイト

一定期間更新がないため広告を表示しています

- | 個別記事 | - | -
LOAD TO NEGI (3):Metasequoiaクラスの改良

さて、初音ミクのMetasequoiaモデルの読み込みに使うMetasequoiaクラスだが、
作者のrch850さんがコメントして下さった所によると、
色々とバージョンアップしたものが手元にあるようで、
さらにブログの方で、バージョンアップの表明をしてらっしゃるので、
近々パーツごとに読み込めたり色々バージョンアップしてるものが出ると思う。
なので、これから書く記事は意味なくなるかも知れんが、
俺も俺なりにMetasequoiaクラスを改良してみた。

今回の議題は、
[PV3D][Away3D] Metasequoiaクラス(note.x)

(前略)
うーん。重いのはまぁしょーがないとして、左右が反転してるのは何で?Metasequoiaクラスの改造がマズかったかな。
この話。
Metasequoiaクラスでモデルを読み込むと、
何故かモデルが左右反転してると言う問題。

とりあえず、この問題は解決可能だった。


前回のデータをまんま読み込んだだけです。

で、何でモデルが反転するのか?
これは、MetasequoiaとPapervision3Dの座標系が違うから。
Papervision3Dメモ #26(note.x)
によると、Papervision3DはMetasequoiaが採用してる右手座標系と、
ちょっと異なるオリジナルっぽい座標系を使ってるらしい。
なので、変換時にZ座標を-1倍してやらなきゃいけない。
で、それだけだと面が反転しちゃうので、それに併せて頂点の順番も逆転させる。
そうすると、上手いことメタセコモデルどおりに読み込める。
ただし、そんな細かく検証してない(このミクしか試してない)ので、
まだ穴があるかも。

で、変更点は以下の通り。

  1. 248行目の、頂点のZ座標を読み込む場面。
                    var z:Number = parseFloat(coords[2]) * mScale;
                    var z:Number = parseFloat(coords[2]) * mScale * -1;
    これで、Z座標の反転をあわせる。
  2. 292〜365行目の、面データの読み込み部分。
    Metasequoiaの面データの頂点の順番を反転させるために、
    変数に値を読み込む場面で、読み込む順番を逆転させる。
    a→b→cと読み込んでるところを、c→b→aといった感じで、逆に読む。
    uvAとかなってるところも、dまであるところも同様に。

    読み込み部分で逆転させると楽かもしれないけど、
    UV部分は0番目と1番目、2番目と3番目がセットって感じで、
    逆転させるとなると
    [0 1 2 3 4 5]→[4 5 2 3 0 1]
    てなってて若干面倒。
    しかも、逆転させる処理が余計だし。
                if (v.length == 3) {
                    a = vertices[parseInt(v[0]) + vertexOffset];
                    b = vertices[parseInt(v[1]) + vertexOffset];
                    c = vertices[parseInt(v[2]) + vertexOffset];
                    
                    if (mstr != null) {
                        materialName = mMaterialNames[parseInt(mstr)];
                    }
                    
                    if (uv.length != 0) {
                        uvA = new NumberUV(parseFloat(uv[0]), 1 - parseFloat(uv[1]));
                        uvB = new NumberUV(parseFloat(uv[2]), 1 - parseFloat(uv[3]));
                        uvC = new NumberUV(parseFloat(uv[4]), 1 - parseFloat(uv[5]));
                        face = new Face3D([a, b, c], materialName, [uvA, uvB, uvC]);
                    } else {
                        face = new Face3D([a, b, c], materialName,
                            [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 Face3D([a, b, c], face.materialName, face.uv);
                        faces.push(face);
                    }
                } else if (v.length == 4) {
                    a = vertices[parseInt(v[0]) + vertexOffset];
                    b = vertices[parseInt(v[1]) + vertexOffset];
                    c = vertices[parseInt(v[2]) + vertexOffset];
                    d = vertices[parseInt(v[3]) + vertexOffset];
                    
                    if (mstr != null) {
                        materialName = mMaterialNames[parseInt(mstr)];
                    }
                    
                    if (uv.length != 0) {
                        uvA = new NumberUV(parseFloat(uv[0]), 1 - parseFloat(uv[1]));
                        uvB = new NumberUV(parseFloat(uv[2]), 1 - parseFloat(uv[3]));
                        uvC = new NumberUV(parseFloat(uv[4]), 1 - parseFloat(uv[5]));
                        uvD = new NumberUV(parseFloat(uv[6]), 1 - parseFloat(uv[7]));
                    } else {
                        uvA = new NumberUV(0, 0);
                        uvB = new NumberUV(1, 0);
                        uvC = new NumberUV(0, 1);
                        uvD = new NumberUV(1, 1);
                    }
                    face = new Face3D([a, b, c], materialName, [uvA, uvB, uvC]);
                    faces.push(face);
                    face = new Face3D([c, d, a], materialName, [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 Face3D([a, b, c], materialName, [uvA, uvB, uvC]);
                        faces.push(face);
                        face = new Face3D([c, d, a], materialName, [uvC, uvD, uvA]);
                        faces.push(face);
                    }
                }
    
                if (v.length == 3) {
                    c = vertices[parseInt(v[0]) + vertexOffset];
                    b = vertices[parseInt(v[1]) + vertexOffset];
                    a = vertices[parseInt(v[2]) + vertexOffset];
                    
                    if (mstr != null) {
                        materialName = materials.getMaterialByName(mMaterialNames[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 Face3D([a, b, c], materialName, [uvA, uvB, uvC]);
                    } else {
                        face = new Face3D([a, b, c], materialName,
                            [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"]);
                        c = mirrorVertex(a, mirrorAxis);
                        b = mirrorVertex(b, mirrorAxis);
                        a = mirrorVertex(c, mirrorAxis);
                        vertices.push(a);
                        vertices.push(b);
                        vertices.push(c);
                        face = new Face3D([a, b, c], face.material, face.uv);
                        faces.push(face);
                    }
                } else if (v.length == 4) {
                    d = vertices[parseInt(v[0]) + vertexOffset];
                    c = vertices[parseInt(v[1]) + vertexOffset];
                    b = vertices[parseInt(v[2]) + vertexOffset];
                    a = vertices[parseInt(v[3]) + vertexOffset];
                    
                    if (mstr != null) {
                        materialName = materials.getMaterialByName(mMaterialNames[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 Face3D([a, b, c], materialName, [uvA, uvB, uvC]);
                    faces.push(face);
                    face = new Face3D([c, d, a], materialName, [uvC, uvD, uvA]);
                    faces.push(face);
                    
                    if (properties["mirror"] == "1") {
                        mirrorAxis = parseInt(properties["mirror_axis"]);
                        d = mirrorVertex(a, mirrorAxis);
                        c = mirrorVertex(b, mirrorAxis);
                        b = mirrorVertex(c, mirrorAxis);
                        a = mirrorVertex(d, mirrorAxis);
                        vertices.push(a);
                        vertices.push(b);
                        vertices.push(c);
                        vertices.push(d);
                        face = new Face3D([a, b, c], materialName, [uvA, uvB, uvC]);
                        faces.push(face);
                        face = new Face3D([c, d, a], materialName, [uvC, uvD, uvA]);
                        faces.push(face);
                    }
                }
    

しかし、問題点も解決案もnote.xから見つけて来るとは、
何たるマッチポンプ。

スポンサーサイト
- | 個別記事 | - | -
ドミノ・ピザでも食べながら、コメントをどうぞ。
from: rect   2007/11/12 4:06 PM
こんにちは、note.xのrectです。
何というマッチポンプ…お恥ずかしい限りです;
ご指摘ありがとうございました。
from: fuddy   2007/11/13 12:02 AM
ネギが回転するのを見てると、ブラウザのレスポンスが異様に悪くなるんだけど、こっちのスペックの問題かな?
from: 太郎(管理者)   2007/11/14 11:38 PM
>rect さん
どもー!
いつも参考にさせてもらってます。
今回はホント反転が個人的に気になったんで、助かりました。
マッチもポンプも揃ってる、無くてはならないブログだと思ってますんで、どんどん更新しまくって下さい。

>fuddy さん
ネギへの愛が足りてない。
とは言え、俺も開発時は確認→閉じるを繰り返してるけどね。
コメントする









 
トラックバック
この記事のトラックバックURL(記事と無関係なトラックバックは削除される可能性があります)
※記事が投稿されてから30分の間、トラックバックを行うことが出来ません。
http://tarotaro.jugem.cc/trackback/1611
 

Copyright (C) 2004 paperboy&co. All Rights Reserved.

Powered by "JUGEM"