我是游戏开发和使用 jMonkey 引擎的新手。我开始开发一款无尽的跑步型游戏。为了运行,我用blender创建了一个地图并将其导入jME。
截图显示,我已将其添加到地形并制作了一些山脉。现在我需要获得地图的精确矢量点(A点像屏幕截图上的点)。
这将帮助我检测正在运行的对象是否在地图上。有人可以给我一个答案或告诉我专家使用的替代方案吗?
更新
我想检测运行物体是否在银色道路上。我怎么能这样做?
答案 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