我正在使用libgdx和自定义模型。
模型有很多对象(房间)。
我使用ModelInstance的中心来检测被点击的对象。
Ray ray = cam.getPickRay(screenX, screenY);
int result = -1;
float distance = -1;
Array<Room> instances = buildingContainer.getAllRooms();
for (int i = 0; i<instances.size ; i++) {
Room room = instances.get(i);
if(room.floor == this.last_render_floor && room.is_room) {
GameObject instance = instances.get(i).model;
instance.transform.getTranslation(position);
position.add(instance.center);
final float len = Math.abs(ray.direction.dot(position.x-ray.origin.x, position.y-ray.origin.y, position.z-ray.origin.z));
float dist2 = Math.abs(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;
}
}
}
clicked ++;
return result;
一切正常,直到我改变相机位置。
我选错了房间。我认为与Ray的距离和房间的中心有问题。
任何消化如何修复它?
答案 0 :(得分:0)
长度计算对我来说是错误的。矢量的长度是其点积与其自身的平方根,因此我不知道光线方向与它有什么关系。我会做的
final float len = tmpVec3.set(position).sub(ray.origin).len();
顺便说一下,不必采用dst2的绝对值。