unityで法線マップが正常に表示されない
filename
public class test3 : MonoBehaviour
{
List<Vector3> newVertices = new List<Vector3> ();
List<int> newTriangles = new List<int> ();
List<Vector2> newUV = new List<Vector2> ();
void Start ()
{
Mesh mesh = this.GetComponent<MeshFilter> ().mesh;
CubeTop ();
CubeBot ();
CubeEast ();
CubeWest ();
CubeNorth ();
CubeSouth ();
mesh.Clear ();
mesh.vertices = newVertices.ToArray ();
mesh.triangles = newTriangles.ToArray ();
mesh.uv = newUV.ToArray ();
mesh.uv2 = newUV.ToArray ();
mesh.Optimize ();
mesh.RecalculateNormals ();
}
//頂点の作成は各軸の正方向から見て左上,右上,右下,左下の順で6面全て統一して代わりに三角ポリゴンの順番を面ごとに定義している.
//他のスクリプトで頂点を利用するときにやりやすいため.
//y+.
void CubeTop ()
{
newVertices.Add (new Vector3 (- 0.5f, 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, 0.5f, - 0.5f));
newVertices.Add (new Vector3 (- 0.5f, 0.5f, - 0.5f));
Cube (0);
}
//y-.
void CubeBot ()
{
newVertices.Add (new Vector3 (- 0.5f, - 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, - 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, - 0.5f, - 0.5f));
newVertices.Add (new Vector3 (- 0.5f, - 0.5f, - 0.5f));
Cube (1);
}
//x+.
void CubeEast ()
{
newVertices.Add (new Vector3 (0.5f, 0.5f, - 0.5f));
newVertices.Add (new Vector3 (0.5f, 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, - 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, - 0.5f, - 0.5f));
Cube (2);
}
//x-.
void CubeWest ()
{
newVertices.Add (new Vector3 (- 0.5f, 0.5f, - 0.5f));
newVertices.Add (new Vector3 (- 0.5f, 0.5f, 0.5f));
newVertices.Add (new Vector3 (- 0.5f, - 0.5f, 0.5f));
newVertices.Add (new Vector3 (- 0.5f, - 0.5f, - 0.5f));
Cube (3);
}
//z+.
void CubeNorth ()
{
newVertices.Add (new Vector3 (- 0.5f, 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, 0.5f, 0.5f));
newVertices.Add (new Vector3 (0.5f, - 0.5f, 0.5f));
newVertices.Add (new Vector3 (- 0.5f, - 0.5f, 0.5f));
Cube (4);
}
//z-.
void CubeSouth ()
{
newVertices.Add (new Vector3 (- 0.5f, 0.5f, - 0.5f));
newVertices.Add (new Vector3 (0.5f, 0.5f, - 0.5f));
newVertices.Add (new Vector3 (0.5f, - 0.5f, - 0.5f));
newVertices.Add (new Vector3 (- 0.5f, - 0.5f, - 0.5f));
Cube (5);
}
void Cube (int meshKind)
{
int faceCount = newVertices.Count / 4 - 1;
//top,east,south.
if (meshKind == 0 | meshKind == 2 | meshKind == 5) {
newTriangles.Add (faceCount * 4 + 0);
newTriangles.Add (faceCount * 4 + 1);
newTriangles.Add (faceCount * 4 + 2);
newTriangles.Add (faceCount * 4 + 0);
newTriangles.Add (faceCount * 4 + 2);
newTriangles.Add (faceCount * 4 + 3);
}
//bot,west,north.
if (meshKind == 1 | meshKind == 3 | meshKind == 4) {
newTriangles.Add (faceCount * 4 + 1);
newTriangles.Add (faceCount * 4 + 0);
newTriangles.Add (faceCount * 4 + 3);
newTriangles.Add (faceCount * 4 + 1);
newTriangles.Add (faceCount * 4 + 3);
newTriangles.Add (faceCount * 4 + 2);
}
newUV.Add (new Vector2 (0, 1));
newUV.Add (new Vector2 (1, 1));
newUV.Add (new Vector2 (1, 0));
newUV.Add (new Vector2 (0, 0));
}
}
解決したので追記します
法線マップを正常に表示するにはtangentをメッシュに合わせる必要があるみたいで
自作する際にはMesh.Optimize()やMesh.RecalculateNormals()を書くと思いますが
これらはmesh.tangentsをメッシュに合わせて更新してくれないので自分で計算する必要があるみたいです
以下はtangent計算の参考URLです
http://blog.livedoor.jp/akinow/archives/52387194.html
Author And Source
この問題について(unityで法線マップが正常に表示されない), 我々は、より多くの情報をここで見つけました https://qiita.com/soro/items/3125de64a09e697736f2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .