2019年9月

2019年9月12日 (木)読書の効果

おはようございます。
デザイナーのH.Nです。

突然ですが最近読書にハマっています。
通勤中や寝る前等、暇を見つけては本を読んでいます。
学生の頃は本には全く興味がなく、むしろ活字が大嫌いなくらいだったのに。
不思議なものですね。

特にこの作家が好き!とかはなく、なんとなく手に取ってみた本を読むことがほとんどです。
似たようなシチュエーションでも、作家によって、言い回しが大きく違うこともしばしばあります。
そういったところを気にしながら読むことも楽しみの一つです。

そして読書には、実は様々なメリットがあるそうです。
まず、
文章力・言語能力・漢字力・読む力
細かく分類するとかなり多くなってしまいそうなので割愛しますが、本を読むだけでこれだけの力が養われます。
また、テレビとは違って映像や音声も無く、与えられる情報は活字のみなので、情景や登場人物の心情を想像しなくてはなりません。
そこで欠かせないのが、疑問符や感嘆符をはじめとする記号や傍点です。
これらは主に音を視覚化して、読み手の想像をスムーズにしてくれます。
他にも、硬さや可愛さといった印象を与える書体も重要な情報となります。
想像力がなくては、すらすらと読み進めることがなかなか難しいため、自然と想像力が養われていきます。
読む人が変われば微妙に捉え方が違う所も、本の良い所だと私は思います。

先に述べた想像力ですが、ビジネスシーンでは非常に重要だと私は思います。
離れた相手とコミュニケーションを図る場合、会って話すよりメールや電話といった手段が主になるでしょう。
会話がテレビだとするなら、メールは本といったところでしょうか。
メールは本と同じく、相手が何を伝えたいのか、文字という少ない情報量から想像する必要があります。
想像力が身についていない人は、文字情報であるメールを読んでも相手の意を組むことが出来ず、"会話が成立しない"なんて状況に陥る可能性もあります。
本を読めば解決!というわけではありませんが、こういった問題を避けるために、力をつけるには身近な良いツールだと思います。

最近はどんどんデジタル化が進み、タブレットやスマホでも本が読めて便利だなーと思いますが、どこか温かみのある紙媒体のアナログな感じも私は好きです。

さぁ、次はどんな本に出会えるでしょうか、これからも、飽きるまで本を読み続けたいと思います。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2019/09/post-b9b549.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0)

2019年9月 5日 (木)動的にモデルを読み込む

おはようございます。
プログラマーのM.Iです。

夏ですね。今年もCEDECが近づいてきました。

ゲーム開発では効率化のため、モデルの修正をリアルタイムで確認したい、といったモチベーションがあります。
ゲームを動かしながらモデルを修正できれば調整しやすくなりますし、シェーダがのった状態で確認できるのもいい点です。
また、Unity等だとVRで見られるので、知識があればVRでのアニメーションやモデリングツールも作れるかもしれません。
間近でモデルを見ることで確認できる不具合もあるかもしれないですしね。
と言うわけで今回のお題はモデル・テクスチャを動的に読みこむ方法です。

UnityではSkinnedMeshRendererのsharedMeshを変更すれば動的にモデルを変更できます。
頂点や面、マテリアルは以下で設定できます。
例えばテレビのリモコンのモデルがあるとすれば、ゴム部分、プラスチック部分、金属部分の3つのマテリアルが必要ですね。

Mesh mesh = new Mesh();

// インデックスバッファはデフォルトでは帯域幅節約のため16bitになっている
// 頂点数が16bitを越えると32bitになるようにする
if ( verticeList.Length > 65535 )
{
  mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
}

// Vector3の頂点位置の配列
mesh.vertices = verticeList;
// Vector2のuvの配列
mesh.uv = uvList;
// マテリアル分サブメッシュを設定する
mesh.subMeshCount = MaterialList.Length;

// 法線をモデルから読みこまないならこれで自動計算してくれる
mesh.RecalculateNormals();

// MaterialList[ i ].Indiceはマテリアル毎のインデックスリスト
for ( int i = 0 ; i < MaterialList.Length ; i++ )
{
 // 第1引数はインデックスの配列、
 // 第2引数はインデックス形式、第3引数はマテリアル番号
 mesh.SetIndices( MaterialList[ i ].Indice , MeshTopology.Triangles , i );
}

例えば最初のマテリアルが
0,1,2 と 2,1,3
次のマテリアルが
3,4,5
番目の頂点を参照し、両方とも3角形であるなら

mesh.SetIndices(new int[]{0,1,2,2,1,3} , MeshTopology.Triangles , 0);
mesh.SetIndices(new int[]{3,4,5} , MeshTopology.Triangles , 1);
と呼ぶとマテリアル毎の面を作ってくれるというわけです。

ちなみにMeshTopology.Pointsにすれば頂点のみ描画してくれるようになります。

形が違うモデルを複数用意しておき、それぞれの形をブレンドする事をブレンドシェイプと言います。
プログラム的には頂点のインデックスと、どのくらい移動するかのオフセットさえあれば計算できます。
ブレンドシェイプは以下のようにすれば追加できます。

// モデル頂点分のVector3配列を作る
Vector3[] vertTemp = new Vector3[ VertexArray.Length ];

// ブレンドシェイプの頂点インデックス、座標のオフセットが入っている
foreach( var shapeVert in blendShapeList )
{
  vertTemp[ shapeVert.Index ] = shapeVert.Position;
}

// ブレンドシェイプの名前 座標のオフセット 法線や接線のオフセット
// 法線や接線のオフセットは不要ならnull
// 第2引数は複数フレームのブレンドシェイプを作る場合のウェイト。
// 1フレームだけならこれで100%のウェイトと言う意味
mesh.AddBlendShapeFrame( blendName , 1 , vertTemp , normal , tangent );

美顔ライトなどで影の入り方も調整する場合、法線のオフセットも設定できるようです。

スキニングはunity公式のバインドポーズのページをもとに、骨インデックスやウェイト等を設定すればいいので割愛します。

テクスチャ、マテリアルは以下のように設定できます

// テクスチャの大きさを指定
Texture2D tex = new Texture2D(width, height);
// 32bitの色配列 BinaryReaderなどでテクスチャを読んでimageDataに入れておく
tex.SetPixels32(imageData);
tex.Apply();

// シェーダ名
string shaderName = "Unlit/Texture";
Material newMat = new Material( Shader.Find( shaderName ) );

// マテリアルのメインテクスチャを設定
newMat.mainTexture = tex;

これをマテリアル分作れば、SkinnedMeshRendererのmaterialsに設定できます。

最後にSkinnedMeshRendererのsharedMeshにメッシュを設定すれば反映完了です。
Img_20190905_01
※クリックで拡大表示

maya等からモデル情報をudpなりで送ればボタンを押すだけでゲームエンジンに反映、といったことができるわけです。
.netの資源があるのでBinaryReader、Writerを使えばデータの入出力もできますしね。
バインドした骨オブジェクトを動かせば骨を動かせますし、SkinnedMeshRendererのSetBlendShapeWeightでブレンドシェイプも確認できます。

ちなみにUE4ではProceduralMeshComponentを使えば、動的にメッシュ作成ができそうなのですが、UV設定やマテリアル等はできそうなのにスキニング設定周りが見当たりません。
ProceduralMeshの機能はプラグインとして提供されていたので、
Engine\Source\Runtime\Engine\Private\Components\SkinnedMeshComponent.cpp
辺りを参考にすれば実装できるかもしれないですね。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2019/09/post-a05160.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0)