我试图计算另一个实体的命中率。
我有我目前的职位和实体职位。
我想问一下如何计算显示器中间线到实体。
我想如果这个line > 1
那么它必须是一个打击。
任何人都知道我是如何从我的显示器的2D中间到3D部分的线条以及该线的长度是多长时间?
答案 0 :(得分:0)
根据您的问题,我假设您要将2D视口坐标(在您的示例中为视口/窗口的中心)取消投影到3D世界空间中的光线中,并将该光线与您世界中代表的几何形状相交你的“实体”。
如果是这种情况,假设你说你使用LWJGL / Java,那么你可以使用JOML这样做:
/* Given the view-projection matrix, obtain the "view ray"
at the center of the viewport/window/screen */
Matrix4f viewProjectionMatrix = ...;
Vector3f rayOrigin = new Vector3f();
Vector3f rayDir = new Vector3f();
int mouseX = 400; // <- viewport pixel X coordinate
int mouseY = 300; // <- viewport pixel Y coordinate
int winWidth = 800; // <- viewport pixel width
int winHeight = 600; // <- viewport pixel height
viewProjectionMatrix.unprojectRay(mouseX, mouseY,
new int[] { 0, 0, winWidth, winHeight }, rayOrigin, rayDir);
/* Intersect the ray with your entity (here a simple AABB) */
Vector3f aabbMin = new Vector3f(-1,-1,-1); // <- min corner of the AABB
Vector3f aabbMax = new Vector3f(+1,+1,+1); // <- max corner of the AABB
Vector2f minMaxHit = new Vector2f();
if (Intersectionf.intersectRayAab(rayOrigin, rayDir, aabbMin, aabbMax, minMaxHit)) {
Vector3f hitPosition = new Vector3f(rayDir).mul(minMaxHit.x).add(rayOrigin);
System.out.println("Hit was here: " + hitPosition);
}