XSIのシーンからデータを抽出する2

今回はマテリアルとUVに関してです。
結構複雑なので、まだ色々と対応出来ていない事や抜けがあるかもしれませんが、
ひとまず最低限描画に必要な物を抜き出してみます。

まずはマテリアル(Materialクラス)を取得する方法です。
シーンに含まれている全てのマテリアルを一覧するだけなら以下の方法で可能です。

{
    Application app;
    Project project = app.GetActiveProject();
    Scene   scene   = project.GetActiveScene();

    MaterialLibrary matlib = scene.GetActiveMaterialLibrary();
    CRefArray materials = matlib.GetItems();
    for( LONG i = 0 ; i < materials.GetCount() ; ++i ){
        Material material( materials[ i ] );
    }
}


ただ、このやり方ではどのメッシュとマテリアルが組み合わせられるのか分かりません。
それを解決するには以下の方法でマテリアルを取得します。

void Func( const X3DObject& obj )
{
    // まずはクラスターに対して適用されているマテリアルを探す
    CRefArray primitives = obj.GetPrimitives();
    for( LONG i = 0 ; i < primitives.GetCount() ; ++i ){
        Primitive primitive( primitives[ i ] );
        Geometry geometry = primitive.GetGeometry();
        if( geometry.IsA( siPolygonMeshID ) ){
            PolygonMesh mesh( geometry );
            CRefArray clusters = mesh.GetClusters();

            CLongArray polygon_indices;
            for( LONG i = 0 ; i < clusters.GetCount() ; ++i ){
                Cluster cluster = clusters[ i ];
                Material material = cluster.GetMaterial();
                if( material.IsValid() == false ){
                    continue;
                }
                …  // マテリアルに関する処理
            }
        }
    }

    // クラスターに対して適用されているマテリアルが無い場合はオブジェクトから探す
    CRefArray materials  = obj.GetMaterials();
    if( materials.GetCount() > 0 ){
        for( LONG i = 0 ; i < materials.GetCount() ; ++i ){
            material = materials[ i ];
            …  // マテリアルに関する処理
        }
    }
    else{
        // オブジェクトに適用されている物が無ければシーンのマテリアルを使用する
        Application app;
        Project project = app.GetActiveProject();
        Scene   scene   = project.GetActiveScene();

        MaterialLibrary matlib = scene.GetActiveMaterialLibrary();
        CRefArray materials = matlib.GetItems();
        for( LONG i = 0 ; i < materials.GetCount() ; ++i ){
            material = materials[ i ];
            …  // マテリアルに関する処理
        }
    }
}


次にMaterialからD3DMATERIAL9のメンバと対応するデータを抜き出します。
シェーダはまた複雑ですが、ひとまず”Phong”と言う名前のシェーダだけを抜き出します。

{
    CRefArray shaders = material.GetShaders();
    D3DMATERIAL9 d3d_material;

    for( LONG j = 0 ; j < shaders.GetCount() ; ++j ){
        Shader shader( shaders[ j ] );
        if( shader.GetName() == L"Phong" ){
            float r, g, b, a;
            if( shader.GetColorParameterValue( L"ambient", r, g, b, a ) == CStatus::OK ){
                d3d_material.Ambient.r = r;
                d3d_material.Ambient.g = g;
                d3d_material.Ambient.b = b;
                d3d_material.Ambient.a = a;
            }
            {
                Parameter param = shader.GetParameter( L"diffuse_inuse" );
                CValue    value = param.GetValue();
                bool      inuse = value;
                if(
                    ( inuse ) &&
                    ( shader.GetColorParameterValue( L"diffuse", r, g, b, a ) == CStatus::OK )
                ){
                    d3d_material.Diffuse.r = r;
                    d3d_material.Diffuse.g = g;
                    d3d_material.Diffuse.b = b;
                    d3d_material.Diffuse.a = a;
                }
            }
            {
                Parameter param = shader.GetParameter( L"specular_inuse" );
                CValue    value = param.GetValue();
                bool      inuse = value;
                if(
                    ( inuse ) &&
                    ( shader.GetColorParameterValue( L"specular", r, g, b, a ) == CStatus::OK )
                ){
                    d3d_material.Specular.r = r;
                    d3d_material.Specular.g = g;
                    d3d_material.Specular.b = b;
                    d3d_material.Specular.a = a;

                    param = shader.GetParameter( L"shiny" );
                    value = param.GetValue();
                    float shiny = value;
                    d3d_material.Power = shiny; // 本当はこの値は加工しないといけない
                }
            }
            if( shader.GetColorParameterValue( L"ambience", r, g, b, a ) == CStatus::OK ){
                d3d_material.Emissive.r = r;
                d3d_material.Emissive.g = g;
                d3d_material.Emissive.b = b;
                d3d_material.Emissive.a = a;
            }
        }
    }
}


次にテクスチャの情報を取得します。
と言ってもひとまずファイル名だけです。

{
    ImageClip2 image_clip = material.GetCurrentImageClip2();
    CString file_name = image_clip.GetFileName();
}


最後にUV情報を取得します。

void Func( const PolygonMesh& mesh, const X3DObject& obj )
{
    CVertexRefArray      vertices  = mesh.GetVertices();  // 頂点データ
    CPolygonFaceRefArray polygons  = mesh.GetPolygons();  // 面データ
    CRefArray            clusters  = mesh.GetClusters();

    // まずクラスターから取得する
    CLongArray polygon_indices;
    for( LONG i = 0 ; i < clusters.GetCount() ; ++i ){
        Cluster  cluster  = clusters[ i ];
        Material material = cluster.GetMaterial();
        if( material.IsValid() == false ){
            continue;
        }

        ClusterProperty property = material.GetCurrentUV();
        CFloatArray     uvs;
        property.GetValues( uvs );

        for( LONG j = 0 ; j < elements.GetCount() ; ++j ){
            LONG element = elements.GetItem( j );
            PolygonFace polygon          = polygons[ element ];
            CLongArray  triangle_indices = polygon.GetTriangleSubIndexArray();
            CLongArray  vertex_indices   = polygon.GetVertices().GetIndexArray();
            CLongArray  node_indices     = polygon.GetNodes().GetIndexArray();
            for( LONG k = 0 ; k < triangle_indices.GetCount() ; ++k ){
                LONG vertex_index = vertex_indices[ triangle_indices[ k ] ];
                LONG uv_index     = node_indices[ triangle_indices[ k ] ];

                // 頂点情報
                bool is_normal_valid;
                Vertex vertex = vertices[ vertex_index ];
                MATH::CVector3 p = vertex.GetPosition();
                MATH::CVector3 n = vertex.GetNormal( is_normal_valid );
                float u = uvs[ ( uv_index * 3 ) + 0 ];
                float v = uvs[ ( uv_index * 3 ) + 1 ];
                float w = uvs[ ( uv_index * 3 ) + 2 ];
            }
            polygon_indices.Add( element );     // クラスターが適用されているポリゴンを保存しておく
        }
    }

    // クラスターが適用されていないポリゴン
    {
        Material  material;
        CRefArray materials = obj.GetMaterials();
        if( materials.GetCount() > 0 ){
            material = materials[ 0 ];
        }
        else{
            // オブジェクトに適用されている物が無ければシーンのマテリアルを使用する
            Application app;
            Project project = app.GetActiveProject();
            Scene   scene   = project.GetActiveScene();

            MaterialLibrary matlib = scene.GetActiveMaterialLibrary();
            CRefArray materials = matlib.GetItems();
            if( materials.GetCount() > 0 ){
                material = materials[ 0 ];
            }
        }

        if( material.IsValid() == false ){
            return;
        }

        for( LONG i = 0 ; i < polygons.GetCount() ; ++i ){

            ClusterProperty property = material.GetCurrentUV();
            CFloatArray     uvs;
            property.GetValues( uvs );

            bool is_registered = false;
            for( LONG j = 0 ; j < polygon_indices.GetCount() ; ++j ){
                if( i == polygon_indices[ j ] ) { is_registered = true; }
            }
            if( is_registered ) { continue; }

            PolygonFace polygon = polygons[ i ];
            CLongArray  triangle_indices = polygon.GetTriangleSubIndexArray();
            CLongArray  vertex_indices   = polygon.GetVertices().GetIndexArray();
            CLongArray  node_indices     = polygon.GetNodes().GetIndexArray();
            for( LONG k = 0 ; k < triangle_indices.GetCount() ; ++k ){
                LONG vertex_index = vertex_indices[ triangle_indices[ k ] ];
                LONG uv_index     = node_indices[ triangle_indices[ k ] ];

                bool is_normal_valid;
                Vertex vertex = vertices[ vertex_index ];
                MATH::CVector3 p = vertex.GetPosition();
                MATH::CVector3 n = vertex.GetNormal( is_normal_valid );
                float u = uvs[ ( uv_index * 3 ) + 0 ];
                float v = uvs[ ( uv_index * 3 ) + 1 ];
                float w = uvs[ ( uv_index * 3 ) + 2 ];
            }
        }
    }
}


上記の方法以外にも以下のようにTriangleクラスを使用する方法もありそうですが、
そっちの検証はまた後日にしたいと思います。

{
    CTriangleRefArray triangles = mesh.GetTriangles();
    for( LONG i = 0 ; i < triangles.GetCount() ; ++i ){
        Triangle triangle = triangles[ i ];
    }
}


この情報をプロジェクトに組み込んで表示させてみました。
exporter01
無事テクスチャが表示されました。

次はスキニングメッシュの為の骨構造とウェイトです。

modoでキャラクター作成02 - 縦横比

新たに製作し始めております。

image358l

modoです。やはりモデリングしやすいです。

今回はポリゴンです。
前回作ったものを下敷きにして作りました。

modoの背景コンストレインとを使うとこれ程度のものは一日かからずに出来ます。

しかし、リアルタイムビューとプレビューの縦横比が違うのですがこれは何なのでしょう?

前に作っている時も同じ問題にぶつかり、何とかしたような記憶があるのですが、

すっかり忘れました、、

記事に書いたかと思ったのですが、見つかりません。

うーん、微妙なのですが微妙です。

話は変わりますが最近はリトポロジーと言う言葉を良く見つけます。

様々なツールで様々なアプローチで実装されています。

modoのペンツールと背景コンストレインとで作ってゆくのもそれと言えなくはありません。

要はすでにある形状のもののメッシュの割り方を変える、と言うことで問題ないかと思います。

401ではさらに進化しているそうです。楽しみです。

今回のものはそれを使い、新たにメッシュを構成しました。

面倒くさい耳のモデリングもあっけなく終わります。

中々良い分割だと思ったので、データをアップしておきます。

ちなみに画面で表示されているものはアップしたデータにスムースを一段階かけました。

その状態からスカルプトツールでメッシュを編集しているところです。

思いっきり途中です。

メッシュの割がそれなりにきちんとしていればスカルプトでも何とかなるんじゃないか?

という実験です。

それなりに長くCGをやっているとは思いますがいつも実験ばかりしています。

行き当たりばったりです。出来るのでしょうか、、

head

データはobjです。ご自由にお使いください。

modtoolで水道橋16

さて、ようやく終了です。

色々と説明が増えてしまい、当初の予定よりも長くなってしまいました。

あと少しUVの整形をし、テクスチャを貼ってそれにUVをあわせる作業をして終了したいと思います。

ではオブジェクトを選択し、「t」でポイント選択にし、「i」でアイランド選択にします。

image342l

アーチの下側の面、とでも言うべきでしょうか?以前脇にどかしたUVを選択します。

image343l

まずは編集中に他のUVをいじらないように「v」で移動ツールにしてどかします。

「i」でアイランド選択を解除します。

image344l

ポイント選択で左右どちらかのポイントを全て選択します。

image345l

「v」で移動ツールにして移動させます。

いまさらですが押しっぱなしで使うことでスティッキーツールとして一時的にツールを使用できます。

キーを離せば選択ツールの戻れます。

「Ctrl」を押してスナップを利かせて、図の位置に移動させます。要は反対側の列にくっつけます。

image346l

くっ付けたら再びそのアイランド全てを選択します。この場合アイランド選択を使うよりもドラッグして選択してしまったほうが

手っ取り早いです。

選択したら「r」キーで時計方向に90度回転させます。

image347l

テクスチャエディタの何も無いところで一度クリックし、選択を解除します。

image348l

一番右の列から作業を進めます。画面に見える二つのポイント、実際には重なっているので8つのサンプルポイントです。

選択し、「v」で移動ツールにし、「Ctrl」を押しながら移動させます。

image349l

同様に全てのポイントで同じようにします。

image350l

このような形になります。

アーチの裏側でUVが対称的な模様になります。

これは本来ならば出来る限り避けるべきです。人間は左右対称のものを目ざとく見つける習性があります。

背景とは出来る限り目立たなくあるものなので、こういったものがあるとつい視線がとまりがちになります。

ただ、目立たないところなどに配置する分にはかまわないかと思います。テクスチャの節約、時間の節約になります。

では、テクスチャを読み込みます。

「Alt」+「6」(テンキーでない)を押し、クリップビューアを開きます。

image351l

そのメニューのファイル読み込みでイメージを読み込むことが可能です。

ちなみにXSIではプロジェクトフォルダ内の「Pictures」がイメージデータを入れる場所となります。

あらかじめこちらにデータを入れておくことをお勧めします。

それ以外の場所から読み込むとファイルの絶対パスとなってしまいます。

準備が出来たらファイル>読み込み、でファイルを読み込みます。

image352l

読み込みました。何も加工してない素の状態の画像です。

「7」(テンキーでない)を押してレンダーツリーを表示させます。

image353l

レンダーツリーのファイルメニュー、「クリップ」から先ほど読み込んだ画像を選びます。

image354l

新たにノードが追加されます。これは左クリックで動かすことが出来ます。邪魔にならないところに動かします。

「s」キーを押しながらで、ビューポートと同じ操作が可能です。

イメージノードの青い球をクリックすると矢印がポインタにくっついてきます。そのままドラッグしてマテリアル「Lambert」ノードの左側にくっつくようにします。

出てくるプルダウンメニューは「diffuse」を選びます。

「Ctrl」+「r」で画面を整列できます。

image355l

クリップノードは直接マテリアルの接続することは出来ないので、自動的に「Image」ノードが作成されます。

XSIは乱暴にノードを接続しても結構くっつけてくれます。便利です。

テクスチャエディタのメニュー、「クリップ」から先ほど適用したテクスチャを選択すればテクスチャが貼られます。

これは仕様なのか分かりませんが、テクスチャエディタを開きながらテクスチャを適用するとこのような状態になったかと思います。

そうでない場合は自動的に更新されたかと思います。

image356l

後はUVをアイランドごとに変形させて調整します。

image357l

ポイントは形の変わり目、ポリゴンの境目にブロックの境目が来るようにすることです。

scene12

ようやく終わりました、、長かったですね。単純な作業なのに。

それと、ついでに連絡ですがしばらくの間製作に専念したいので、更新が滞ってしまうかと思います。

ページの紹介などはちょくちょくしてゆこうと思いますが、連続するものは恐らくしません。

誠に勝手ながらすみません。

8月過ぎればまたページ上で何かを作ってゆくかと思います。

今後とも宜しくお願いいたします。

modtoolで水道橋15

間が空いてしまいました。

中途半端なところですね。

modo401、中々出ませんね。待ち遠しいです。

Zbrush4の機能の一部が紹介されていましたがこれも楽しそうですね。

modoで似たようなことが出来はしますが、ここまで突っ込んではいませんね。

インターネットに直結、とまで行かなくても気軽に画像やブラシの読み込みが出来ると助かります。

401はペイントについてそれほど紹介されていませんが、そのあたりの進化はどうなのでしょうか?

楽しみです。

関係ないついでにもう一つ、

3Dcoatというロシア製の3Dツールですが、以前体験版を使ってみましたが、

modoと同じくイメージベースでのスカルプトで、色々と機能が豊富なようでしたが

個人的にはmodoでいいかな、と思いそのままにしていましたが、最近バージョンアップをしたようで

Zbrushと同じくボリューメトリックスモデリングになっていました。驚きの進化です。

200ドルという低価格です。以前のバージョンはもっと安かったのですがまだまだ安いです。

残念なのはサンプルとして展示しているもののクオリティーがちょっともったいないです、、

さて、それでは本題に入ります。

UVの整形はそのツールの特化した機能を効率よく使うのが一番です。

なので、整形に対してどのような考えを持ったツールであるかを理解するのがそのツールを使いこなす一番の近道となります。

XSIの場合はスナップに優れている、という特性があります。

6辺りから「UVの変換」という機能が加わり、数値入力にも大分対応できるようになりましたが取ってつけた感があります。

ちなみにテクスチャエディタのファイルメニュー>ツール>「UVの変換」です。

今回の場合はこれで整形するよりもスナップを使った方が手っ取り早いです。

まずはオブジェクトを選択し、ポインタをテクスチャエディタに持っていったら「t」を押してポイント選択モードにします。

(選択モードはポリゴンでもかまいません)

次に「i」を押してアイランド選択にします。

image335l

縦に長い方のUVを選択します。アイランド選択なので一部を選択すれば繋がったUVを全て選択できます。

「c」で回転ツールにします。「Shift」を押しながら回転させることで、規定値での回転が可能です。

もしくは「r」「Shift」+「r」で選択範囲の中心を基準(ピボットを有効としていない場合)とした90度回転が可能です。

image336l

この場合反時計回りに90度回転させると方向が一致します。

「v」で移動ツールにしたら選択されているポイントのどれかの近くでクリックを始め、「Ctrl」(スナップ機能オン)を押しながら

ドラッグし横長のUVに重なるようにします。

ちなみにツールによってスナップや規定値の編集に使われる「Shift」を押すタイミングに差があります。

XSIやアドビ製品は後から押しても反応してくれるのですが、modoは無視されます。地味ですが後からでも反応してくれる方が便利です。

image337l

図のパースビューで分かるとおり、アーチの始めと終わりが逆さまになっています。

これを直します。

image338l

ポインタをパースビューに持って行き、「u」でポリゴン選択にします。

テクスチャエディタではポリゴン単位のサンプルの選択になってしまいますので注意してください。

片方のアーチを選択します。

image339l

引き続きビューを回転させ、同じ位置のポリゴンを選択します。

テクスチャエディタのファイルメニュー、ツール>水平ミラーを実行します。

テクスチャエディタにそれらしきアイコンがありますが、これはポリゴン個別に反転させる機能です。

必要なのでしょうか?用途が分かりませんが、、

image340l

反転させました。少しずれてしまいました。

「v」で移動ツールにし、「Ctrl」を押してスナップさせます。

image341l

次に斜めになっているUVを整えます。

「i」を押し、アイランド選択を解除します。「t」でポイント選択にしたら上下二点ずつのポイントを選択し、「垂直線に集約」を実行します。

それを斜めになっている箇所全てに適用します。

しかし、等間隔にはなりません。

そういった場合はテクスチャエディタにある数値入力部分の「U」の値に「0.2」を入力しましょう。

そこまで厳密にする必要も無いと思いますが、一応そういった編集方法もあります。

「0.2」と言うのはUの値、1を語等分した数値です。

テクスチャは以前紹介させていただいた、こちらからどうぞ。

シームレス画像なので加工の手間が省けます。512ピクセルの正方形と、ゲームにやさしいつくりになっています。

テクスチャの貼り付けは次回に回します。

scene11

では、今回はこの辺で。

modtoolで水道橋14

UVの整形を進めてゆきます。

オブジェクトを選択し、ポインタをテクスチャエディタに持って行き、「u」でポリゴン選択にします。

image322l

テクスチャエディタで選択を行ったのは、やりやすいからです。

パースビューでは、裏表同時に選択するのにビューを回転させなければなりません。

ごめんなさい、図が少し間違っていました。

アーチにはさまれた部分全てを選択します。

図では一番下の小さいポリゴンが選択されていません。これも選択します。

選択が出来たら、前回同様、「平行部分投影」から「ベストフィット」を選びます。

image323l

次に、アーチの裏面部分とでも言うのでしょうか、次の図の部分を選択し、同様に「平行部分投影」「ベストフィット」を行います。

image324l

この場合ビューポートで「u」キーによる選択でマウスボタンを押しっぱなしにして、順に選択するのが一番早いと思います。

範囲選択、という手もありますがこの程度のポリゴン数であれば必要ない顔思います。

同様に反対側も取得します。

image325l

「Space」キーでオブジェクト選択にし、一度「フリーズ」します。

テクスチャサポートが邪魔です。

image326l

「u」キーでポリゴン選択にし、テクスチャエディタで0,1に収まったUVを適当な場所に移動させます。

0,1に収まる、とはUVの範囲の事です。

アーチの曲線部分以外は取り直したのでUVの0,1範囲内にあるかと思います。

曲線部分の取得を少し違う方法で取るので、邪魔になるからどかせました。

ついでにUVの範囲について少し書きます。

現在では余り無いかと思いますが、ゲームエンジンによってはUVの範囲が限定されるものもあります。

以前仕事で0,1の範囲を超えてはいけない、という仕様もありました。

その場合はタイリングしたいポリゴンを全て分断して一枚のポリゴンが一枚のテクスチャを表示する、

といった事になります。

大抵は一枚のテクスチャをタイリングさせるため、UVをスケールするだけで済ませますが、

0,1の範囲内となるとそうも行きません。

話を戻します。

アーチの曲線部分を取得するため、「輪郭ストレッチ部分投影」というツールを使用します。

言葉をそのまま読んでも何のことやらさっぱり分かりません。訳者の苦悩が垣間見えます。

自分も詳しい使い方は分かりません。マニュアル見てません。

なんとなく使ってみたら出来たので、まぁ、良いか。という程度です。

image327l

「u」でビューポートから図の位置のポリゴンを選択します。

アーチの連なった面です。4つ別々に作業を進めます。

image328l

テクスチャエディタの投影スイッチの一番右「輪郭ストレッチ部分投影」「メッシュ上を移動」を実行します。

ポインタに「pick」が表示されるかと思います。

恐らく基準となるものを求めているのかと思います。

ただ、この場合何も指定せずに右クリックでツールを終了します。

image330l

ウィンドウが開き、UVが展開されます。

完全にきれいな形、とは言えませんが、簡単に整形できる形に展開してくれます。

この辺はmodoのUVピーラーの方がきれいですね。

これを4回繰り返します。

image331l

縦と横二種類のUVが取得されました。

法線を見ているのか、ワールド座標を見ているのか知りませんが何かしらの法則で

分かれるのだと思います。これをまとめます。

UVをまとめる時に気をつける点は、同じ方向にする。と言うことです。

この場合同じ方向とは、隣接する箇所をそろえる、と言うのでしょうか、言葉で表現するのが難しいのですが、

image333l

テクスチャエディタで図のように選択するとアーチとアーチにはさまれた間部分に隣接するUVが選択されたのが分かります。

裏面を見ても同様です。

なので、この部分を基準に揃えてゆきます。

ただ気をつけなくてはいけないのは、

image334l

図を見て分かるとおり、回転させるだけでは合わないということです。

反転させる必要があります。

そのあたりは次回に回します。

scene10

では、今回はこの辺で。

modtoolで水道橋13

前回紹介したmelについてですが、

アップした後恥ずかしくて見ていなかったので気が付きませんでしたが、

変な文字列になっておりました。ごめんなさい。

 

修正したのでもう大丈夫です。

しかし改めて単純なスクリプトです。

基本的にどこかで見つけたものをベースにコマンドを拾ってくっつけているだけなので

同じ事をしていても違う書式になっていたりします。

 

ランダム回転や、スケール、uvセット系は適用したいオブジェクトを複数選択して使うことが出来ます。

マテリアルやバックカリングは選択する必要がありません。

 

さて、本題に入ります。

XSIのUVは慣れると使いやすいのですが、最初のうちは少し大変かもしれません。

エディタを見ても分かるとおり、機能がたくさんあります。

最も良くあることで、頻繁に使うものは限られております。

たまに気まぐれで、これなんだろう?とスイッチを押すと便利な機能だったりします。

ModToolにはデフォルトで日本語のマニュアルが付いているそうなので、詳しくはそちらで確認してください。

メニューバーのヘルプ>ユーザガイド、で参照できます。

 

MayaのようにUV、という独立した選択ツールとしては成り立っておりません。

modoと同じで、ポイントを選択したらその場所のUVが選択されます。

ただ、modoのように完全にポイント選択と同じではありません。

ポイント、エッジ、ポリゴンからUVの選択は出来ますが、UVの選択をそれ以外にすることは出来ません。

こう書くとUVの選択が独立しているように思いますが、独立しているようで独立していない、という不思議な感じです。

 

通常のビューポートでポイントを選択すると、選択されたポイントが赤く表示されます。

テクスチャエディタ上で同様にポイントを選択すると各ポイントに毛のようなものが生え、それらが赤くなります。

サンプルと呼ばれております。Mayaでいう頂点フェースのようなものです。

あれを選択してUVを編集する、と考えても問題ないかと思います。

MayaではUVの接続、非接続が明示されており、接続を解除しない限りは個別には動かせません。

XSIでは、スナップしてくっついたら自動的に接続され、一つのサンプルを掴んで動かせば勝手に解除されます。

恐らくデータとしては、全てが分断された状態で持っているのかと思います。

 

まぁ、とにかくやってみましょう。

image313l

まずはオブジェクトを選択します。

相変わらず画像が見づらく、申し訳ないのですがテクスチャエディタの「ISL」スイッチを押します。

ショートカットは「i」です。これはアイランド選択、と呼ばれております。

繋がったUVを認識して選択してくれます。

Mayaでいう「シェルの選択」です。便利なのでホットキーに登録しております。

Mayaでは一部を選択してから実行することで繋がったUVを選択してくれますが、XSIでは

このスイッチが入っている状態で選択すると繋がったUVが選択できます。

 

image314l

柱以外の部分を選択し、脇にどけておきます。「v」で移動ツールにしてマウス左ボタンでドラッグします。

後で取り直すので、どこでもかまいません。

 

再び「i」キーでアイランド選択を解除します。

「u」キーでポリゴン選択にします。

image315l

またまた見にくいですが、柱の上の段から選択してゆきます。

image316l

それを「v」で移動させます。この時にXSIの強力なスナップ機能を使います。

スナップは「Ctrl」を押しながら移動です。

スナップの基準にしたいポイント付近でマウスをプレスし、「Ctrl」を押しながらドラッグします。

二段目のUVに重ねます。上の段の一番下の真ん中のポイントを二段目のどう位置のポイントにスナップさせます。

一番上から作業を始めたのは、段の区切りに水平面があり、UVが重なっているためです。

下の段からはじめるとそれを選択することが出来ません。

「Space」キーで一度選択を解除し、一段目と二段目が重なったUVを選択し、同様に三段目に重ねます。

image317l

「t」でポイント選択にします。

「s」キーでパンとズームを調整し、拡大します。

image318l

図の合計6つのポイントを選択します。重なっているので実際には48のサンプルポイントとなります。

image319l

また見づらく申し訳ないのですが、テクスチャエディタ内の「垂直線に集約」スイッチを押します。(「Shift」+「¥」)

平均値に集約されます。これはMayaの最小値、最大値にアライン、の方が便利です。

これを全てのポイントで行います。上面に重なって見えなくなっているポリゴンにも処理する必要があります。

image321l

図の位置です。これらも処理します。

image320l

最後に柱の垂直部分も同様に集約します。

今回はここまでにします。

scene09

 

なんだかんだで時間がかかっています、もう少しで完成ですね。

modtoolで水道橋12

マテリアルに関しての追記です。

前回オブジェクト選択の状態でマテリアルをアサインしたと思いますが、

それではクラスタが作られません。

オブジェクトに直接くっついてしまうことになります。

 

取り立てて問題は無いのですが、

以前アンリアルエンジンを使った時にScene_Materialはオブジェクトについていてはいけない。

という仕様がありました。

それでいうと、むしろ現状の方が好ましいのですが、8の時に紹介したクラスタから

選択範囲を取得したい場合などは困ります。

 

その場合はポリゴン選択でポリゴンを選択して、マテリアルをアサインした方が便利です。

その方法だとオブジェクト自体のマテリアルはScene_Mateialですが、

クラスタ内に適用したマテリアルが格納されます。

 

仕様上、Scene_Materialをオブジェクトにつけていてはまずい場合は、「8」でエクスプローラを開き、

クラスタ内のマテリアルをクリックドラッグでオブジェクト自体(今回の場合「cube」)に入れることで

オブジェクトとシーンマテリアルの関係を絶つことが出来ます。

 

XSIのマテリアルはややこしいです、、

 

さて、それでは作業の続きに入ります。

UVの個別取得です。

 

UVを編集する時は場所別にどういった形にするかを考えてから始めます。

この場合、柱の部分はほぼ正面と側面から取得し、アーチ部分は正面から取得する部分と

それ以外の工夫が必要な部分に分かれます。

 

文章で説明するのも難しいので、実際に進めてゆきます。

 

image304l

まずは「u」でポリゴン選択にし、図の位置のポリゴンをクリックで選択します。

image305l

次に「Alt」を押しながら左クリックで柱の根元のポリゴンを選択します。

左クリックで範囲選択、中クリックでループ選択です。

image306l

次に「Shift」を押しながら、最初に選択したポリゴンの隣のポリゴンをクリックして選択します。

image307l

「Shift」「Alt」を押しながら柱の根元のポリゴンを左クリックで選択します。

この時「Shift」を離すと一つ前の選択が解除されるので気をつけてください。

その場合はやり直すか、かまわず逆方向に選択をし直すかお好きな方を選んでください。

 

出来たら反対側も同様に選択します。

image308l

テクスチャエディタ上のメニュー、

image311l

平行部分投影(小さくて見づらくごめんなさい)を実行します。

プルダウンメニューを開くとベストフィットというコマンドが一番初めにあります。

image310l

なんとも魅力的なネーミングです。

その名のとおり良い具合にUVを取得してくれます。

 

同じプルダウンメニューにアスペクト比の保持というコマンドにチェックを入れるとテクスチャ

の縦横比にあわせてくれます。

チェックを入れてから実行してください。

この場合noIconの縦横比1:1にあわせてくれます。

 

平行投影だけではなく、他の投影方法でも使用が可能です。

image312l

結局に画面分割にしました、説明しやすいです。

側面も同様に処理します。

XSIのとても地味でとても便利な機能の紹介です。

以前紹介したような気もしますが忘れました。

 

プルダウンメニュー全てにおいて(多分)、同じコマンドを再び使う場合は

中クリックするだけでコマンドが実行可能です。

この場合テクスチャエディタの平行部分投影アイコンを中クリックすればベストフィットが適用されます。

便利です。ただ間違うこともあるので注意は必要です。

 

テクスチャサポートが作成されますが、オブジェクトをフリーズすればなくなります。

必要ないのですぐに消してかまいません。

scene08

 

では、今回はこの辺で。

modtoolで水道橋11

さて、ついにUVです。

XSIでは最初にUVを持っていません。

テクスチャプロジェクションを作成し、UVを編集してゆくこととなります。

 

テクスチャプロジェクションについては少し注意が必要です。

ツールにより、人により作り方は様々ですが、始めに取得したUVを編集して整形してゆく

やり方と必要に応じてUVを取得、作成してゆく方法があると思います。

 

ツールではどちらかと言うと、Mayaは始めに取得したものを編集で整形してゆく

方法が王道かと思います。それに対し、XSIやmodoは必要に応じて取得しなおす方法が王道かと思います。

 

どちらとも同じ手法は取れるのですが、最終的な形に持ってゆくのにどちらの方が近いかで判断されるかと思います。

 

ただ、XSIで注意しなければいけない点は、通常のツールで行うプロジェクションとテクスチャエディタで行うプロジェクションが

違う、と言う点にあると思います。これだけでは分かりづらいので実際に作業を進めて説明してゆきます。

 

後、改めて前回のデータを見直すといくつかハードエッジが適用されていない箇所を発見したので、ハードエッジを追加してから作業を行います。

 

image297l

オブジェクトを選択し、画面左のツール群から、取得>プロパティ>テクスチャプロジェクション>UVを選びます。

ツールの場所は謎です。そこなの?という疑問が残ります。

 

image300l

 

モデルが緑色の枠で囲まれます。「8」でエクスプローラを開くと図のように、クラスタが作成され、Texture_Projectionと下のほうにTexture_Support

という二つのものが作成されます。

Texture_Projectionの方はMayaでいうUVセット、と考えて問題ないかと思います。

Texture_Supportというのは取得した時点での枠なので、これを選択しトランスフォームツールで動かすことで元の枠を動かすことが出来ます。

Mayaと同じでフリーズするとなくなります。

マルチUVの必要が無い限りは一つのモデルに付きこの作業は一度になります。場所にあわせて取得しなおす時はテクスチャエディタで作業します。

 

とりあえず、枠が邪魔なので一度フリーズしてから作業を進めます。フリーズは画面右下にあります。ちなみにフリーズMというものはモデリングのみのフリーズです。

Mayaでいうデフォーマ以外のヒストリの削除ににていると思います。今回はモデリングしかしていないのでどちらでも構いません。

 

image301l

「Alt」+「7」でテクスチャエディタを開きます。Mayaでは画面を半分にしてテクスチャエディタとパースビューで作業をすることが多いのですが、

XSIではもっぱらウィンドウで使います。

現在のXSIはどうなのか検証していないので分かりませんが、自分が良く使っていた頃はメインビューにテクスチャエディタを配置していると

描画がおかしくなったりフリーズが頻発したりしました。それが原因と言う確たる証拠はありませんがウィンドウで使うようにしてからは安定しました。

そんなことがありXSIではウィンドウで使っています。

 

パースビューの描画をテクスチャデカールにしています。XSIでは何もテクスチャが貼られていないとデフォルトで格子模様を貼ってくれます。

noIconといイメージです。なのでゆがみを見るためにイメージを貼る必要がありません。

image302l

あと、マテリアルを設定するのを忘れていました。

 

オブジェクトを選択し、左のツール群から、取得>マテリアル>Lambertを選択してオブジェクトにマテリアルを適用します。

image303l

エクスプローラで確認すると、適用されているのが分かります。

Scene_Materialが無くなり、Materialが追加されています。斜体の方は実体ではありません。

恐らくマテリアルはクラスタの中に入る、という仕様上そうなったのかと思います。

ポリゴンを全選択でマテリアルをアサインする場合とオブジェクト選択によるアサインでこのあたりの動作が変わります。

この辺もちょっとややこしいところです。

 

scene07

では、今回はこの辺で。

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です