C# 将自定义三角形映射到摄影机&x2019;s视角
我已经通过我的代码做了一个三角形。见下文:C# 将自定义三角形映射到摄影机&x2019;s视角,c#,unity3d,C#,Unity3d,我已经通过我的代码做了一个三角形。见下文: void TriangleMaker() { MeshFilter mf = GetComponent<MeshFilter>(); Mesh mesh = new Mesh(); mf.mesh = mesh; //vertices const int verticeCount = 3;//how many vertices for triangle
void TriangleMaker()
{
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
//vertices
const int verticeCount = 3;//how many vertices for triangle its 3
Vector3[] vertices = new Vector3[verticeCount]{
//bottom left.orgin of the gameobject,
new Vector3(0,0,0),
new Vector3(width,0,0),
new Vector3(width, height,0)
};
//triangles
int[] tri = new int[6];
tri[0] = 0; //go clock wise always to make triangle from your vertices
tri[1] = 1;
tri[2] = 2;
//normals
//show the direction of objects
Vector3[] normals = new Vector3[3];
normals[0] = -Vector3.up;
normals[1] = -Vector3.up;
normals[2] = -Vector3.up;
mesh.vertices = vertices;
mesh.triangles = tri;
mesh.normals = normals;
}
void TriangleMaker()
{
MeshFilter mf=GetComponent();
网格=新网格();
mf.mesh=网格;
//顶点
const int verticeCount=3;//三角形的3有多少个顶点
Vector3[]顶点=新Vector3[verticeCount]{
//游戏对象的左下角.orgin,
新矢量3(0,0,0),
新矢量3(宽度,0,0),
新矢量3(宽度、高度、0)
};
//三角形
int[]tri=新int[6];
tri[0]=0;//始终按时钟顺序从顶点生成三角形
tri[1]=1;
tri[2]=2;
//常态
//显示对象的方向
向量3[]法线=新向量3[3];
法线[0]=-Vector3.up;
法线[1]=-Vector3.up;
法线[2]=-Vector3.up;
网格顶点=顶点;
mesh.triangles=tri;
mesh.normals=法线;
}
脚本被附加到我相机的子游戏对象上,它显示了三角形,但我想将我的三角形精确地映射到相机的视角
也按照Niki answer的建议进行了尝试,结果与预期不符:
:我刚在Unity docs中找到它: 附言:我很惊讶在文档中发现了这一点。最后,我想你是世界上唯一需要这个的人D 编辑: 好的,我编辑了你的脚本。这将可视化摄影机的上平截头体平面。请注意,这在全局空间中起作用,因此在(0)位置和(0)旋转处移动摄影机以查看结果。但我想你可以添加其余的平面,然后自己将其转化为局部空间
using UnityEngine;
using System.Collections;
public class FrustumScript : MonoBehaviour {
private void Start()
{
TriangleMaker();
}
void TriangleMaker()
{
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
Camera cam = Camera.main;
//vertices
Vector3[] vertices = new Vector3[3]
{
new Vector3(0, 0, 0),
cam.ViewportToWorldPoint(new Vector3(0, 1, cam.farClipPlane)),
cam.ViewportToWorldPoint(new Vector3(1, 1, cam.farClipPlane))
};
//triangles
int[] tri = new int[6];
tri[0] = 0; //go clock wise always to make triangle from your vertices
tri[1] = 1;
tri[2] = 2;
//normals
//show the direction of objects
Vector3[] normals = new Vector3[3];
normals[0] = -Vector3.up;
normals[1] = -Vector3.up;
normals[2] = -Vector3.up;
mesh.vertices = vertices;
mesh.triangles = tri;
mesh.normals = normals;
}
}
使用UnityEngine;
使用系统集合;
公共阶级的平台文字:单一行为{
私有void Start()
{
三角形制造者();
}
void TriangleMaker()
{
MeshFilter mf=GetComponent();
网格=新网格();
mf.mesh=网格;
Camera cam=Camera.main;
//顶点
Vector3[]顶点=新Vector3[3]
{
新矢量3(0,0,0),
cam.ViewportToWorldPoint(新矢量3(0,1,cam.farClipPlane)),
cam.ViewportToWorldPoint(新矢量3(1,1,cam.farClipPlane))
};
//三角形
int[]tri=新int[6];
tri[0]=0;//始终按时钟顺序从顶点生成三角形
tri[1]=1;
tri[2]=2;
//常态
//显示对象的方向
向量3[]法线=新向量3[3];
法线[0]=-Vector3.up;
法线[1]=-Vector3.up;
法线[2]=-Vector3.up;
网格顶点=顶点;
mesh.triangles=tri;
mesh.normals=法线;
}
}
我刚刚在Unity文档中找到了它:
附言:我很惊讶在文档中发现了这一点。最后,我想你是世界上唯一需要这个的人D
编辑:
好的,我编辑了你的脚本。这将可视化摄影机的上平截头体平面。请注意,这在全局空间中起作用,因此在(0)位置和(0)旋转处移动摄影机以查看结果。但我想你可以添加其余的平面,然后自己将其转化为局部空间
using UnityEngine;
using System.Collections;
public class FrustumScript : MonoBehaviour {
private void Start()
{
TriangleMaker();
}
void TriangleMaker()
{
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
Camera cam = Camera.main;
//vertices
Vector3[] vertices = new Vector3[3]
{
new Vector3(0, 0, 0),
cam.ViewportToWorldPoint(new Vector3(0, 1, cam.farClipPlane)),
cam.ViewportToWorldPoint(new Vector3(1, 1, cam.farClipPlane))
};
//triangles
int[] tri = new int[6];
tri[0] = 0; //go clock wise always to make triangle from your vertices
tri[1] = 1;
tri[2] = 2;
//normals
//show the direction of objects
Vector3[] normals = new Vector3[3];
normals[0] = -Vector3.up;
normals[1] = -Vector3.up;
normals[2] = -Vector3.up;
mesh.vertices = vertices;
mesh.triangles = tri;
mesh.normals = normals;
}
}
使用UnityEngine;
使用系统集合;
公共阶级的平台文字:单一行为{
私有void Start()
{
三角形制造者();
}
void TriangleMaker()
{
MeshFilter mf=GetComponent();
网格=新网格();
mf.mesh=网格;
Camera cam=Camera.main;
//顶点
Vector3[]顶点=新Vector3[3]
{
新矢量3(0,0,0),
cam.ViewportToWorldPoint(新矢量3(0,1,cam.farClipPlane)),
cam.ViewportToWorldPoint(新矢量3(1,1,cam.farClipPlane))
};
//三角形
int[]tri=新int[6];
tri[0]=0;//始终按时钟顺序从顶点生成三角形
tri[1]=1;
tri[2]=2;
//常态
//显示对象的方向
向量3[]法线=新向量3[3];
法线[0]=-Vector3.up;
法线[1]=-Vector3.up;
法线[2]=-Vector3.up;
网格顶点=顶点;
mesh.triangles=tri;
mesh.normals=法线;
}
}
我猜您的意思是需要将其映射到相机的平截头体(现在假设它是一个金字塔)。在这种情况下,您需要添加更多详细信息。有很多方法可以将三角形映射到金字塔。很可能您希望将其映射到金字塔的x或y投影上。对吗?谢谢@NikaKasradze让我添加一个图像来更清晰地定义。你差一点right@NikaKasradze有4个trainagle/pyramid require,我想在相机视角上映射,以便我可以看到相机覆盖了多少区域。(见图)我猜你们的意思是你们需要把它映射到相机的平截头体上(现在假设它是一个金字塔)。在这种情况下,您需要添加更多详细信息。有很多方法可以将三角形映射到金字塔。很可能您希望将其映射到金字塔的x或y投影上。对吗?谢谢@NikaKasradze让我添加一个图像来更清晰地定义。你差一点right@NikaKasradze有4个trainagle/pyramid require,我想在相机视角上映射,以便我可以看到相机覆盖了多少区域。(见图)感谢有价值的输入,但结果并不符合预期。参见更新的问题“为什么要在z中搜索?”?cam.Farclipplane因为这就是ViewportToWorldPoint
的工作原理:我无法确定为什么三角形的旋转不正确。正如我所说,当相机处于(0,0,0)旋转(0,0,0)时,此脚本工作。如果相机不在该位置/旋转,您可以移动变换使其与相机对齐。感谢有价值的输入,但结果与预期不符。参见更新的问题“为什么要在z中搜索?”?cam.Farclipplane因为这就是ViewportToWorldPoint
的工作原理:我无法确定为什么三角形的旋转不正确。正如我所说,当相机处于(0,0,0)旋转(0,0,0)时,此脚本工作。