单击libgdx检查模型

时间:2014-07-16 10:34:55

标签: 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) {  
        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;
}

它有时会起作用。

我的模特是: http://www6.zippyshare.com/v/97501566/file.html

我错了什么?

对我有任何帮助吗?

我是libgdx的新手。

enter image description here

我什么时候按1才点亮,但是当我按下2时,1个灯也亮(而不是2个)...

1 个答案:

答案 0 :(得分:0)

我没有完全分析您的代码,也不知道It it sometimes work.实际意味着什么(例如,在哪种情况下它不起作用?)但是您使用了边界球检测对象是否被点击。

假设你的计算是正确的(正如我所说,我没有深入检查它们)你仍然会有误报或否定因为唯一的形状是由边界球体完美表现的......好吧。一个球体。

这可能是点击检测工作的来源&#34;有时&#34;。

如果是这种情况并且您想要更准确的检测,您应该使用不同的绑定卷,绑定volumne层次结构或基于渲染的方法(即将对象id渲染到某个缓冲区,这将允许像素完美选择)。 / p>

<强>更新

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

所以问题实际上可能在于你的计算。从文档中看,你得到的光线被投射到场景中(即进入世界空间),因此你需要转换你的物体&#39;也是世界空间的中心。

您目前只应用该位置但忽略旋转和缩放,因此产生的位置可能是错误的。我确定有一些内置的转换代码,所以不要手动转换,而应该使用它。请查看有关如何执行此操作的文档。