如何检查物体是否在路上?

时间:2014-09-21 06:36:45

标签: 3d blender jmonkeyengine

我是游戏开发和使用 jMonkey 引擎的新手。我开始开发一款无尽的跑步型游戏。为了运行,我用blender创建了一个地图并将其导入jME。

截图显示,我已将其添加到地形并制作了一些山脉。现在我需要获得地图的精确矢量点(A点像屏幕截图上的点)。

这将帮助我检测正在运行的对象是否在地图上。有人可以给我一个答案或告诉我专家使用的替代方案吗?

这是screenshot

更新

我想检测运行物体是否在银色道路上。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

该问题的一个常见解决方案是使用光线投射,其中测试假想线以确定与头像(运行对象)下方的对象(地面,道路)的交叉点。

这是一个使用jMonkeyEngine 3提供的机制的示例:

public boolean isOnRoad(Vector3f avatarPosition, Geometry road) {
    // Pointing downwards (assuming that the Y-axis is facing upwards in your game)
    Vector3f direction = new Vector3f(0, -1, 0);

    // Create a line that starts at 'avatarPosition' and has a direction
    Ray ray = new Ray(avatarPosition, direction);

    // Results of the collision test are written into this object
    CollisionResults results = new CollisionResults();

    // Test for collisions between the road and the ray
    road.collideWith(ray, results);

    // If there is a collision, avatarPosition is above the road
    return results.size() != 0;
}

您需要将头像的位置传递给该功能 avatarPosition = avatar.getLocalTranslation();

如果您的道路由多个Geometries打包到Node中,您也可以将Node而不是单个Geometry传递给该函数。在节点上调用collideWith()将测试其所有子节点 如果节点还包含场景的其他部分,则上述功能可能无法正常工作。

road.collideWith(ray, results)的调用将在第一次使用时为网状网格隐式构建BIH树(Bounding Interval Hierarchy树)。这将加速碰撞测试,因为它不必检查光线对着道路的每个三角形。它足够快,可以在每个更新周期中完成。


此外,您可以使用碰撞测试的结果 这将返回最接近起点的交叉点的确切点:

Vector3f p = results.getClosestCollision().getContactPoint();

使用迭代器,您可以单独处理所有碰撞,从最近碰撞到最远碰撞排序:

Iterator<CollisionResult> it = results.iterator();
while(it.hasNext())
{
    CollisionResult collisionResult = it.next();
    Vector3f p    = collisionResult.getContactPoint();
    Geometry geom = collisionResult.getGeometry();
    // Do something with contact point and geometry
}

有关碰撞的更多信息:
http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:collision_and_intersection

光线投射还用于使用十字准线或鼠标选择3D场景中的对象 这称为拣选:
http://hub.jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_picking