LibGdx:将Ray与ModelInstance中的网格相交

时间:2019-07-01 14:36:34

标签: java libgdx

我想在游戏世界的地板上(也就是ModelInstance)放置一些对象(ModelInstance)。为了获得这些对象的位置,我让Ray与地板相交。然后,交点应为所需位置。

我的计划是将射线的原点设置在地板下方,以使射线的方向笔直向上并从下方撞击地板。这两个ModelInstance都是Blender中制作的.g3db模型。

        Vector3 dir = new Vector3(0, 10, 0); //Vector points upwards
        Ray ray = new Ray(new Vector3(), dir.cpy());

        Mesh mesh = landscape.model.meshes.first(); //The floor ModelInstance, has only a single mesh

        int fac = mesh.getVertexSize();
        float[] verts = new float[mesh.getNumVertices() * fac];
        short[] inds = new short[mesh.getNumIndices()];
        mesh.getVertices(verts);
        mesh.getIndices(inds);

        for (int j = 0; j < 10; j++) { //add 10 objects to the floor
            Vector3 out = new Vector3(- 15, -50f, - j * 5); 
            ray.origin.set(out.cpy()); //set the origin of the vector below the floor

            if (Intersector.intersectRayTriangles(ray, verts, inds, fac, out)) {
                System.out.println(j + " out = " + out); //out should be the position for my objects
            }
        }

intersectRayTriangles方法的输出正是地板下面的初始位置。但这并不是离地面很近的地方。如何获得正确的交点?

1 个答案:

答案 0 :(得分:0)

我终于找到了一个(半最佳)解决方案。 景观是使用Blender创建的ModelInstance。

ArrayList<Vector3> vertices = new ArrayList<>();

landscape.calculateTransforms();
    Renderable rend = new Renderable();
    Mesh mesh = landscape.getRenderable(rend).meshPart.mesh;

    int vertexSize = mesh.getVertexSize() / 4;
    float[] verts = new float[mesh.getNumVertices() * vertexSize];
    short[] inds = new short[mesh.getNumIndices()];
    mesh.getVertices(verts);
    mesh.getIndices(inds);

    for (int i = 0; i < inds.length; i++) {
        int i1 = inds[i] * vertexSize;
        Vector3 v = new Vector3(verts[i1], verts[i1 + 1], verts[i1 + 2]);

        v.set(v.prj(rend.worldTransform));


        vertices.add(v);
    }

    Vector3 dir = new Vector3(0, 10, 0);
    Vector3 pos = new Vector3(random.nextFloat(),random.nextFloat(),random.nextFloat());
    Ray ray = new Ray(pos, dir.cpy());

        for (int i = 0; i < vertices.size() - 3; i+=3){
            if (Intersector.intersectRayTriangle(ray, vertices.get(i), vertices.get(i + 1), vertices.get(i + 2), pos)) {
                //pos now contains the correct coordinates
                break;
            }

请注意,y轴朝上