首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Unity 3D中选择立方体的曲面?

如何在Unity 3D中选择立方体的曲面?
EN

Stack Overflow用户
提问于 2020-11-10 17:32:51
回答 1查看 91关注 0票数 0

对于Unity 3D用户来说,这是一个简单但有趣的问题。我的目标是一个应用程序,我可以在其中进行交互(f.e.选择6个表面中的1个)与一个立方体的表面,而不创建6个游戏对象,并将它们组合到一个立方体。有没有人有主意或线索?

EN

回答 1

Stack Overflow用户

发布于 2020-11-10 22:40:11

最简单的方法可能就像你描述的那样:用多个独立的对象和碰撞器等构建你的立方体

作为另一种选择,我会自己创建立方体网格,因为这样你就可以确定哪个三角形属于哪个边。(当然,您也可以使用默认的多维数据集和试错,直到您知道哪个三角形索引属于哪一方)

代码语言:javascript
复制
private MeshCollider _collider;

private void Start()
{
    var mesh = new Mesh();
    var verts = new Vector3[]
    {
        new Vector3 (-0.5f; -0.5f; -0.5f),  // index 0
        new Vector3 (-0.5f; 0.5f; -0.5f),   // index 1
        new Vector3 (0.5f; 0.5f; -0.5f),.   // index 2
        new Vector3 (0.5f; -0.5f; -0.5f),   // index 3
        new Vector3 (-0.5f; -0.5f; 0.5f),   // index 4
        new Vector3 (-0.5f; 0.5f; 0.5f),    // index 5
        new Vector3 (0.5f; 0.5f; 0.5f),     // index 6
        new Vector3 (0.5f; -0.5f; 0.5f)     // index 7
    };

    var tris = new int[]
    { 
        // Front
        0, 2, 1,    // index 0
        0, 3, 2,    // index 1

        // Back
        5, 6, 4,   // index 2
        5, 7, 6,    // index 3

        // Top
        3, 6, 2,   // index 4
        3, 7, 6,   // index 5

        // Bottom
        4, 1, 5    // index 6
        4, 0, 1,   // index 7

        // Left
        4, 3, 0,   // index 8
        4, 7, 3    // index 8

        // Righ
        1, 6, 5,   // index 10
        1, 2, 6    // index 11
    };

    mesh.vertices = verts;
    mesh.triangles = tris;
    mesh.RecalculateNormals();
    mesh.RecalculateBounds();

    var obj = new GameObject ("Cube", typeof(MeshFilter), typeof (MeshRenderer));
    obj.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Specular"));
    obj.GetComponent<MeshFilter>().mesh = mesh;
    _collider = obj.AddComponent<MeshCollider>();
    _collider.mesh = mesh;

    obj.transform.position = Camera.main.position + Vector3.forward * 7;
    obj.transform.rotation = Quaternion.Euler(45, 45, 45);
}

然后简单地使用RaycastHit.triangleIndex来确定你正在命中哪个三角形,你可以通过将索引映射到相应的边来知道这一边,例如->。

代码语言:javascript
复制
enum Side
{
    Front,
    Back,
    Top,
    Bottom,
    Left,
    Right
}

Dictionary<int,Side> triangleIdxToSide = new Dictionary<int,Side>
{
    {0, Side.Front},
    {1, Side.Front},

    {2, Side.Back},
    {3, Side.Back},

    {4, Side.Top},
    {5, Side.Top},

    {6, Side.Bottom},
    {7, Side.Bottom},

    {8, Side.Left},
    {9, Side.Left},

    {10, Side.Right},
    {11, Side.Right}
}

void Update ()
{
    var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if(_collider.Raycast(ray, out var hit))
    {
        Debug.Log($"Currently pointing on {triangleIdxToSide[hit.triangleIndex]} of the cube", this);
    }
}

注意:在智能手机上输入,但我希望这个想法变得清晰

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64766211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档