gpt4 book ai didi

java - 我如何获得在 libGdx 中点击了 3D 世界中的哪个点

转载 作者:行者123 更新时间:2023-11-30 11:03:18 26 4
gpt4 key购买 nike

我正在尝试创建一个 3d 世界,其行为类似于 minecraft,玩家可以在其中 360 度查看,如果他尝试单击一个点(3D 世界中的 X、Y、Z 坐标),则绘制模型有被删除。我对在 LibGdx 中编写 3D 世界非常陌生,所以任何帮助都是有用的。我用这个做相机旋转:

float deltaX = -Gdx.input.getDeltaX() * player.degreesPerPixel;
float deltaY = -Gdx.input.getDeltaY() * player.degreesPerPixel;
if(deltaX>0)
player.camera.rotate(Vector3.Z, (float)1.5);
else if(deltaX<0)
player.camera.rotate(Vector3.Z, (float)-1.5);
player.tmp.set(player.camera.direction).crs(player.camera.up).nor();
player.camera.direction.rotate(player.tmp, deltaY);
player.setDir(player.camera.direction.x, player.camera.direction.y);

谢谢

最佳答案

在 2D 环境中,您通常只使用 Camera.unproject(...),它获取一些屏幕空间点并将其转换回游戏世界坐标。

在 3D 中,这并不容易,因为额外的维度为您的世界增加了一些深度。这就是为什么在 2D 平面(您的屏幕)上单击基本上可以击中 3D 世界中无限多的点。在 libgdx 中,这种可能被点击的点的射线被称为拾取射线。

如果你想要某个平面上的交点,代码可能看起来像他的:

public void hitSomething(Vector2 screenCoords) {
// If you are only using a camera
Ray pickRay = camera.getPickRay(screenCoords.x, screenCoords.y);
// If your camera is managed by a viewport
Ray pickRay = viewport.getPickRay(screenCoords.x, screenCoords.y);

// we want to check a collision only on a certain plane, in this case the X/Z plane
Plane plane = new Plane(new Vector3(0, 1, 0), Vector3.Zero);
Vector3 intersection = new Vector3();
if (Intersector.intersectRayPlane(pickRay, plane, intersection)) {
// The ray has hit the plane, intersection is the point it hit
} else {
// Not hit
}
}

在您的情况下,当您拥有一个类似 minecraft 的世界时,您的代码可能如下所示:

public void hitSomething(Vector2 screenCoords) {
Ray pickRay = ...;

// A bounding box for each of your minecraft blocks
BoundingBox boundingBox = new BoundingBox();
Vector3 intersection = tmp;
if (Intersector.intersectRayBounds(pickRay, boundingBox, intersection)) {
// The ray has hit the box, intersection is the point it hit
} else {
// Not hit
}
}

请注意,在 Minecraft 世界中实际上有成千上万个这样的方 block 。采用这种简单的方法不会很快。您可能不得不最终采用分层解决方案,首先检查大块(包含许多 block 的边界框)是否可能命中,然后开始检查单个 block 。

关于java - 我如何获得在 libGdx 中点击了 3D 世界中的哪个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30447568/

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