Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单击libgdx检查模型_Java_Libgdx - Fatal编程技术网

Java 单击libgdx检查模型

Java 单击libgdx检查模型,java,libgdx,Java,Libgdx,我正在使用libgdx进行简易3D游戏,我需要检查模型是否被单击。 这是我的代码: public int getObject (int screenX, int screenY) { Ray ray = cam.getPickRay(screenX, screenY); int result = -1; float distance = -1; for (int i = 0; i < rooms.size; ++i) {

我正在使用libgdx进行简易3D游戏,我需要检查模型是否被单击。 这是我的代码:

public int getObject (int screenX, int screenY) {   
    Ray ray = cam.getPickRay(screenX, screenY);

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

    for (int i = 0; i < rooms.size; ++i) {  
        final GameObject instance = rooms.get(i);               
        instance.transform.getTranslation(position);
        position.add(instance.center);
        final float len = ray.direction.dot(position.x-ray.origin.x, position.y-ray.origin.y, position.z-ray.origin.z);

        if (len < 0f)
            continue;

        float dist2 = position.dst2(ray.origin.x+ray.direction.x*len, ray.origin.y+ray.direction.y*len, ray.origin.z+ray.direction.z*len);

        if (distance >= 0f && dist2 > distance) 
            continue;

        if (dist2 <= instance.radius * instance.radius ) {      
            result = i;
            distance = dist2;
        }
    }

    return result;
}
public int-getObject(int-screenX,int-screenY){
射线=cam.getPickRay(screenX,screenY);
int结果=-1;
浮动距离=-1;
对于(int i=0;i=0f&&dist2>距离)
继续;

如果(dist2我没有完全分析你的代码,也不知道它有时会起什么作用。
实际上的意思是(例如,在什么情况下它不起作用?),但你正在使用一个边界球体来检测对象是否被点击

假设你的计算是正确的(如我所说,我没有深入检查),你仍然可能有误报或误报,因为唯一由边界球体完美表示的形状是…嗯…球体

这可能是点击检测“有时”起作用的原因

如果是这种情况,并且需要更精确的检测,则应使用不同的绑定体积、绑定体积层次或基于渲染的方法(即,将对象id渲染到某个缓冲区中,这将允许像素完美选择)

更新:

从您的更新后来看,边界球体似乎不是这里的问题,因为它们不应该重叠,除非您的数据是错误的-您应该检查/调试

因此,问题可能实际上在于你的计算。从文档中看,你得到的光线似乎被投影到场景中(即世界空间),因此你也需要将对象的中心转换到世界空间


您当前只应用了位置,但忽略了旋转和缩放,因此生成的位置可能是错误的。我确信有一些内置的转换代码,因此您应该使用该代码,而不是手动转换。请查看文档了解如何进行转换。

位置从何而来?是相机的位置吗用挣来的。你有什么建议吗?我如何在点击屏幕时修复选择的错误型号?@Unmerciful你可能想详细说明一下它有时起作用的实际含义(可能使用屏幕截图).@Unmerciful您能调试距离、位置和半径以确保值正确吗?是的。您认为我应该使用其他方法检查单击的模型吗?Intersector(带三角形)或其他方法?@Unmerciful首先坚持libgdx文档、教程和示例(可能是他们自己的测试)可能会有帮助从这里开始,如果它适用于三角形,它也应该适用于边界球体,所以如果有一个使用三角形的例子,我建议先使用它,然后切换到另一种方法,并检查差异。