Java 单击libgdx检查模型
我正在使用libgdx进行简易3D游戏,我需要检查模型是否被单击。 这是我的代码: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) {
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文档、教程和示例(可能是他们自己的测试)可能会有帮助从这里开始,如果它适用于三角形,它也应该适用于边界球体,所以如果有一个使用三角形的例子,我建议先使用它,然后切换到另一种方法,并检查差异。