LibGDX:检测光线在何处撞击3D对象 [英] LibGDX : Detecting where a Ray hits a 3D object

查看:83
本文介绍了LibGDX:检测光线在何处撞击3D对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在LibGDX中构建3D游戏,我使用以下代码来计算是否碰到物体,但是如何找出碰撞的点.我没有使用Bullet,因为我想建立HTML5端口

I am building a 3D game in LibGDX, I have used the following code to work out if I touch a object, but how do I find out at what point it collides. I am not using Bullet as I want to make a HTML5 port

    public int getObject (int screenX, int screenY) {

        int result = -1;
        float distance = -1;

        Ray ray = camera.getPickRay(screenX, screenY);
        Vector3 pos = new Vector3(camera.position);

        for (int i = 0; i < boxInstance.size; i++) {

            GameObject instance = boxInstance.get(i);
            instance.transform.getTranslation(pos);

            float dist2 = ray.origin.dst2(pos);
            if (distance >= 0f && dist2 > distance) continue;

            if (Intersector.intersectRayBoundsFast(ray, pos, instance.dimensions)) {
                result = i;
                distance = dist2;

                Vector3 v = new Vector3();
                if (Intersector.intersectRayBounds(ray, instance.bounds, v))
                {
                    boxInstance.get(result).materials.get(0).set(ColorAttribute.createDiffuse(Color.RED));
                }
            }
        }

        if (result > -1)
        {

            //boxInstance.removeIndex(result);
        }

        return 1;
    };

我需要这个的原因是,如果我触摸大平面,我希望能够将要触摸的物体平面化.

The reason I need this is if I touch a large plane, I want to be able to plane a object where I touch.

更新 我发现intersectRayBounds应该可以执行我想要的操作,但是它永远不会触发

Update I found intersectRayBounds which should do what I want but it never fires

这是我的GameObject类.也许我的BoundingBox是错的?

Here is my GameObject class. Maybe my BoundingBox is wrong?

public class GameObject extends ModelInstance {
    public final Vector3 center = new Vector3();
    public final Vector3 dimensions = new Vector3();
    public static BoundingBox bounds = new BoundingBox();

    public GameObject (Model model, float x, float y, float z) {
        super(model, x,y,z);
        calculateBoundingBox(bounds);
        bounds.getCenter(center);
        bounds.getDimensions(dimensions);
    }
}

推荐答案

我不确定为什么会解决此问题,但似乎您每次都必须计算边界框.参见下面的代码.

I am not sure why this is the fix but it appears you have to compute the Bounding box everytime. See code below.

    public int getObject (int screenX, int screenY) {

        int result = -1;
        float distance = -1;

        Ray ray = camera.getPickRay(screenX, screenY);
        Vector3 pos = new Vector3(camera.position);

        for (int i = 0; i < boxInstance.size; i++) {

            GameObject instance = boxInstance.get(i);
            instance.transform.getTranslation(pos);
            instance.updateBox();

            float dist2 = ray.origin.dst2(pos);
            if (distance >= 0f && dist2 > distance) continue;


            Vector3 v = new Vector3();
            if (Intersector.intersectRayBounds(ray, instance.bounds, v))
            {
                result = i;
                distance = dist2;
                Gdx.app.log("MyTag 2", "x " + v.x + " z " + v.z);

            }

        }

        if (result > -1)
        {
            boxInstance.get(result).materials.get(0).set(ColorAttribute.createDiffuse(Color.RED));
        }

        return 1;
    };


public class GameObject extends ModelInstance {
    public final Vector3 center = new Vector3();
    public final Vector3 dimensions = new Vector3();
    public static BoundingBox bounds = new BoundingBox();
    private float x,y,z;


    public GameObject (Model model, float x, float y, float z) {
        super(model, x, y, z);
        this.x = x;
        this.y = y;
        this.z = z;
        updateBox();
    }

    public void updateBox()
    {
        calculateBoundingBox(bounds);
        bounds.getCenter(center);
        bounds.getDimensions(dimensions);
        bounds.set(bounds.min.add(x,y,z), bounds.max.add(x,y,z));

        Gdx.app.log("MyTag 2", "x " + bounds.min + " z " + bounds.max );
    }

}

这篇关于LibGDX:检测光线在何处撞击3D对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆