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)时,此脚本工作。