【发布时间】:2018-07-16 01:19:03
【问题描述】:
我正在尝试使用 Frustum 来检测一个对象是否在屏幕的正方形部分内(见下图)这是一个 UI 图像,作为目标框而不是 3D 对象。
原帖在这里:Detect if an object in 3D space is within/touches a UI image's bounds
现在我可以让 Frustum 和绘制盒子工作,但只看一个方向。
我需要能够在相机转动时计算新点,但我不知道如何计算。
下面的代码有点工作,但我需要偏移位置,以便在相机移动时它们与视图对齐。
编辑:现在什么都不应该发生,只是画出盒子并让它工作。碰撞检测紧随其后。
// Draw aimbox
Vector3 camPosOffset = camPos + cam.transform.forward * maxDistance;
float frustumHeight = (2.0f * maxDistance * Mathf.Tan(cam.fieldOfView * 0.5f * Mathf.Deg2Rad));
cubeVerts[0] = new Vector3(camPos.x, camPos.y, camPos.z);
cubeVerts[1] = new Vector3(camPos.x, camPos.y, camPos.z);
cubeVerts[2] = new Vector3(camPos.x, camPos.y, camPos.z);
cubeVerts[3] = new Vector3(camPos.x, camPos.y, camPos.z);
cubeVerts[4] = new Vector3(camPosOffset.x - frustumHeight, camPosOffset.y + frustumHeight, camPosOffset.z);
cubeVerts[5] = new Vector3(camPosOffset.x + frustumHeight, camPosOffset.y + frustumHeight, camPosOffset.z);
cubeVerts[6] = new Vector3(camPosOffset.x - frustumHeight, camPosOffset.y - frustumHeight, camPosOffset.z);
cubeVerts[7] = new Vector3(camPosOffset.x + frustumHeight, camPosOffset.y - frustumHeight, camPosOffset.z);
for (int i = 0; i < edges.Length; i += 2)
{
Debug.DrawLine(cubeVerts[edges[i]], cubeVerts[edges[i + 1]], Color.red);
}
【问题讨论】:
-
为什么不把盒子碰撞器(Aimbox)加长,只检测物体是否完全在盒子内?
-
@Hristo 因为沿着那条路线走,盒子的末端会变得越来越小,目标越远,无论如何在视觉上都很好。所以瞄准框会因为透视而关闭。
标签: c# unity3d camera rotation frustum