gpt4 book ai didi

java - 单击 libgdx 检查模型

转载 作者:太空宇宙 更新时间:2023-11-04 14:42:36 25 4
gpt4 key购买 nike

我正在使用 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)...

最佳答案

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

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

这可能是点击检测“有时”起作用的来源。

如果是这种情况并且您想要更准确的检测,您应该使用不同的边界体积、边界体积层次结构或基于渲染的方法(即将对象 ID 渲染到某个缓冲区中,这将允许像素完美选择)。

更新:

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

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

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

关于java - 单击 libgdx 检查模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com