我正在制作我正在制作的游戏中实施raycaster,我遇到了一个非常棘手的问题。我有一个玩家(黑点),我需要为玩家找到最近的交点。在下图中,箭头指向我需要的交叉点。
我想我想说的是我需要一个像这样的函数:
// Each line would take in 2 map values for it's 2 points
// In turn, the map would have to have an even number of points
public Point getNearestIntersection(int playerX, int playerY, int lineDir, Point[] map) {
// whatever goes here
}
我将不得不每帧做约50次,大约100行。如果可能的话,我希望至少得到40 fps ...即使我把它分成线程,我仍然觉得它会导致很多延迟。
答案 0 :(得分:2)
班级Point
有一个名为distance
的方法,用于计算两个点的距离。然后你可以循环所有点以获得最近的点。可能是这样的:
Point currentNearestIntersection;
double smallestDistance;
for (Point inter : intersections) {
double distance = player.distance(inter );
if (distance < smallestDistance) {
currentNearestIntersection= inter;
smallestDistance = distance;
}
}
答案 1 :(得分:0)
轴/线交叉实际上正在解决:
p(t)=p0+dp*t
q(u)=q0+(q1-q0)*u
p(t)=q(u)
t=? u=?
其中:
p0
是您的光线起点(矢量)dp
是光线方向(矢量)q0,q1
是行端点(向量)p(t),q(u)
是轴上的点,行t,u
是行参数(标量)这是2个线性方程组的简单系统(但在向量中)所以它导致N个解,其中N是问题的维数,因此选择不被零除的那个......有效的结果是if:
t>=0
和u=<0.0,1.0>
如果您使用单位dp
向量作为光线方向,那么从计算轴与线之间的交点时,t
参数与光线起点直接相距。所以你可以直接使用它......
如果你需要加速交叉点计算,请参阅
而不是记住所有交叉点,而不是存储最小但非负的t
......
<强> [注释] 强>
如果您将某些线条作为网格,那么您可以使用 DDA 算法更快地计算并使用实线/线交叉仅用于不规则的休息...这样的好例子是Wolfenstein伪3D raycaster问题,如this