メッシュは、固体 のオブジェクトのように見せるために、3D 空間に並べられた三角形から構成されています。三角形は 3 つの角、つまり、頂点により定義されます。Mesh クラスでは、すべての頂点をひとつの配列に格納されていて、それぞれの三角形は頂点配列のインデックスに対応する 3 つの整数で指定されます。複数の三角形はさらに 1 つの整数の配列に集められます。この整数は配列の最初から 3 つずつ組にされます。要素 0、1、2 は 1つ目の三角形を定義し、要素 3、4、5 は 2つ目の三角形、という具合です。頂点は自由に他の三角形を定義するのに再利用できますが、下に説明する理由であまり推奨できません。
すべてのオブジェクトの基本形状は複数の三角形で決定できますが、ほとんどのケースで、メッシュを表示するのに追加の情報が必要です。オブジェクトがライティングのために正しくシェーディングされるには、各頂点に法線ベクトルが必要です。法線は外に向かって伸びるベクトルで、対応する頂点位置のメッシュの表面から垂直に伸びています。シェーディング計算において、各頂点の法線ベクトルは入射するライトの方向 (これもベクトル) と比較されます。もし 2つのベクトルが完全に平行である場合、面は真上からライトを受け、ライトの輝度はすべてシェーディングに使用されます。法線ベクトルに対して真横から入射する光の場合、面はまったくライトを受けません。一般的に、ライトは法線に対してある程度の角度で入射するため、シェーディングは完全に明るい輝度と真っ暗の間になります。その明るさは角度によって異なります。
メッシュは複数の三角形で構成されているため、角の法線は三角形の面に対して垂直に見えるかもしれません。ただし、法線は実際には三角形全体を覆うように補間され、角にはさまれた面の方向を示します。もし 3 つの法線がすべて同じ方向を指す場合、その三角形は全体が均等にライティングされます。別個の三角形を均等にシェーディングすると、その効果としてエッジがはっきり際立ちます。これはキューブや、エッジの尖った固体のようなモデルにとっては必要なことです。反対に、曲がった表面を表すスムーズなシェーディングを作成する場合には、法線の補間が必要です。
角ばったエッジを得るには、隣接する 2つの三角形の両方にそれぞれ別の法線が必要なので、各エッジで頂点を 2つにする必要があります。曲面の場合、頂点は通常、エッジに沿って共有されますが、共有する法線の最適な方向を決定するためには、しばしば直感に頼る必要があります。法線が単に、周囲の三角形の面の法線の平均である場合もあります。ただし、球のようなオブジェクトの場合、法線は球の中心からまっすぐ外に向かうべきです。
Mesh.RecalculateNormals メソッドを呼び出し、メッシュのジオメトリの意味に関する仮定を設定することによって、自動的に法線の方向を算出できます。三角形によって頂点が共有される場合はスムーズな面であると仮定し、2つの頂点の場合は、角ばったエッジであると仮定します。これは大抵は悪い仮定ではありませんが、表面がスムーズであるにも関わらず、2つの頂点が必要なテクスチャの状況の場合は RecalculateNormals は失敗します。
ライティングに加えて、モデルも表面に細かなディテールを作成するために一般的にテクスチャを活用します。テクスチャは、伸縮可能なゴムのシートにプリントした図に少し似ています。各三角メッシュで、テクスチャの三角形領域が定義されます。そして、そのテクスチャの三角形は伸縮されてメッシュの三角形に合うように「ピンで止め」られます。そのため、各頂点はピンで止める図の位置の座標を保存する必要があります。これらの座標は 2次元であり、0 - 1 の範囲でスケールされます (0 は図の左下を表し 1 は右上を示します)。この座標を 3D 空間上の直角座標と混同しないために、よく使用されている X, Y 座標の代わりに、 U, V で指定し、そのため一般的に UV 座標と呼ばれます。
法線と同じように、テクスチャ座標は頂点毎に 1つですが、エッジに異なる UV 値を取得するために、頂点を 2つにすることがあります。わかりやすい例としては、2つの隣接する三角形が連続しないテクスチャを使用する場合などです (例えば顔のテクスチャにある目など)。また、完全に閉じたオブジェクトには、テクスチャ領域が一周して互いに繋がる部分である「継ぎ目」が必要です。継ぎ目の片側の UV 値は、反対側とは異なる値になります。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.