我使用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的新手。
我什么时候按1才点亮,但是当我按下2时,1个灯也亮(而不是2个)...
答案 0 :(得分:0)
我没有完全分析您的代码,也不知道It it sometimes work.
实际意味着什么(例如,在哪种情况下它不起作用?)但是您使用了边界球检测对象是否被点击。
假设你的计算是正确的(正如我所说,我没有深入检查它们)你仍然会有误报或否定因为唯一的形状是由边界球体完美表现的......好吧。一个球体。
这可能是点击检测工作的来源&#34;有时&#34;。
如果是这种情况并且您想要更准确的检测,您应该使用不同的绑定卷,绑定volumne层次结构或基于渲染的方法(即将对象id渲染到某个缓冲区,这将允许像素完美选择)。 / p>
<强>更新强>
从你的帖子更新看来,边界球体似乎不是问题,因为它们不应该重叠,除非你的数据是错误的 - 你应该检查/调试。
所以问题实际上可能在于你的计算。从文档中看,你得到的光线被投射到场景中(即进入世界空间),因此你需要转换你的物体&#39;也是世界空间的中心。
您目前只应用该位置但忽略旋转和缩放,因此产生的位置可能是错误的。我确定有一些内置的转换代码,所以不要手动转换,而应该使用它。请查看有关如何执行此操作的文档。