为什么在使用 gizmos 时绘图不合适?
Why when using gizmos the drawing is not fitting?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Grid : MonoBehaviour
{
private MeshFilter meshf;
private Mesh mesh;
private Vector3[] vertices;
private void Start()
{
StartCoroutine(GenerateOrigin());
}
private IEnumerator GenerateOrigin()
{
// You can change that line to provide another MeshFilter
meshf = GetComponent<MeshFilter>();
mesh = new Mesh();
meshf.mesh = mesh;
mesh.Clear();
#region Vertices
WaitForSeconds wait = new WaitForSeconds(0.05f);
vertices = new Vector3[resX * resZ];
for (int z = 0; z < resZ; z++)
{
// [ -length / 2, length / 2 ]
float zPos = ((float)z / (resZ - 1) - .5f) * length;
for (int x = 0; x < resX; x++)
{
// [ -width / 2, width / 2 ]
float xPos = ((float)x / (resX - 1) - .5f) * width;
vertices[x + z * resX] = new Vector3(xPos, 0f, zPos);
yield return wait;
}
}
#endregion
#region Normales
Vector3[] normales = new Vector3[vertices.Length];
for (int n = 0; n < normales.Length; n++)
normales[n] = Vector3.up;
#endregion
#region UVs
Vector2[] uvs = new Vector2[vertices.Length];
for (int v = 0; v < resZ; v++)
{
for (int u = 0; u < resX; u++)
{
uvs[u + v * resX] = new Vector2((float)u / (resX - 1), (float)v / (resZ - 1));
}
}
#endregion
#region Triangles
int nbFaces = (resX - 1) * (resZ - 1);
int[] triangles = new int[nbFaces * 6];
int t = 0;
for (int face = 0; face < nbFaces; face++)
{
// Retrieve lower left corner from face ind
int i = face % (resX - 1) + (face / (resZ - 1) * resX);
triangles[t++] = i + resX;
triangles[t++] = i + 1;
triangles[t++] = i;
triangles[t++] = i + resX;
triangles[t++] = i + resX + 1;
triangles[t++] = i + 1;
}
#endregion
mesh.vertices = vertices;
mesh.normals = normales;
mesh.uv = uvs;
mesh.triangles = triangles;
mesh.RecalculateBounds();
}
private void OnDrawGizmos()
{
Gizmos.color = Color.black;
for (int i = 0; i < vertices.Length; i++)
{
Gizmos.DrawSphere(vertices[i], 0.1f);
}
}
}
我正在使用 WaitForSeconds 和 return 等待。
在一个一个地创建顶点之后,我最终得到的是:红色的网格不在顶点上,不在适当的位置。
也许这很好我不确定。我觉得应该是在顶点上吧
您没有考虑对象在 space 中的位置。你让它从原点偏移,但顶点是相对于原点绘制的,忽略了那个偏移量。
如果您的对象被放置在 (0,5,0)
这条线是顶点出现的地方:
vertices[x + z * resX] = new Vector3(xPos, 0f, zPos);
注意顶点的 y 坐标中的 0。 0 != 5
您需要添加对象世界space位置的偏移量。
vertices[x + z * resX] = new Vector3(xPos + transform.position.x, transform.position.y, zPos + transform.position.z);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Grid : MonoBehaviour
{
private MeshFilter meshf;
private Mesh mesh;
private Vector3[] vertices;
private void Start()
{
StartCoroutine(GenerateOrigin());
}
private IEnumerator GenerateOrigin()
{
// You can change that line to provide another MeshFilter
meshf = GetComponent<MeshFilter>();
mesh = new Mesh();
meshf.mesh = mesh;
mesh.Clear();
#region Vertices
WaitForSeconds wait = new WaitForSeconds(0.05f);
vertices = new Vector3[resX * resZ];
for (int z = 0; z < resZ; z++)
{
// [ -length / 2, length / 2 ]
float zPos = ((float)z / (resZ - 1) - .5f) * length;
for (int x = 0; x < resX; x++)
{
// [ -width / 2, width / 2 ]
float xPos = ((float)x / (resX - 1) - .5f) * width;
vertices[x + z * resX] = new Vector3(xPos, 0f, zPos);
yield return wait;
}
}
#endregion
#region Normales
Vector3[] normales = new Vector3[vertices.Length];
for (int n = 0; n < normales.Length; n++)
normales[n] = Vector3.up;
#endregion
#region UVs
Vector2[] uvs = new Vector2[vertices.Length];
for (int v = 0; v < resZ; v++)
{
for (int u = 0; u < resX; u++)
{
uvs[u + v * resX] = new Vector2((float)u / (resX - 1), (float)v / (resZ - 1));
}
}
#endregion
#region Triangles
int nbFaces = (resX - 1) * (resZ - 1);
int[] triangles = new int[nbFaces * 6];
int t = 0;
for (int face = 0; face < nbFaces; face++)
{
// Retrieve lower left corner from face ind
int i = face % (resX - 1) + (face / (resZ - 1) * resX);
triangles[t++] = i + resX;
triangles[t++] = i + 1;
triangles[t++] = i;
triangles[t++] = i + resX;
triangles[t++] = i + resX + 1;
triangles[t++] = i + 1;
}
#endregion
mesh.vertices = vertices;
mesh.normals = normales;
mesh.uv = uvs;
mesh.triangles = triangles;
mesh.RecalculateBounds();
}
private void OnDrawGizmos()
{
Gizmos.color = Color.black;
for (int i = 0; i < vertices.Length; i++)
{
Gizmos.DrawSphere(vertices[i], 0.1f);
}
}
}
我正在使用 WaitForSeconds 和 return 等待。 在一个一个地创建顶点之后,我最终得到的是:红色的网格不在顶点上,不在适当的位置。 也许这很好我不确定。我觉得应该是在顶点上吧
您没有考虑对象在 space 中的位置。你让它从原点偏移,但顶点是相对于原点绘制的,忽略了那个偏移量。
如果您的对象被放置在 (0,5,0)
这条线是顶点出现的地方:
vertices[x + z * resX] = new Vector3(xPos, 0f, zPos);
注意顶点的 y 坐标中的 0。 0 != 5
您需要添加对象世界space位置的偏移量。
vertices[x + z * resX] = new Vector3(xPos + transform.position.x, transform.position.y, zPos + transform.position.z);