Math 光线投射';s公式
我正在使用光线投射(只是重新制作旧的好wolf3d游戏)进行项目。我由一个指导老师带领。我被困在理解他所用的数学中。我试着进入它,花了很多时间在谷歌上搜索、画画和解决它,但我没有得到那个结果。在这里提问,因为math和gamedev社区看起来人口较少。gamedev社区也有和我一样的问题,但仍然没有答案。所以,也许有数学好的人可以解释一下 下面是一篇教程的内容: 当从几何角度推导deltaDistX时,使用毕达哥拉斯,可以得到公式“sqrt(1+(rayDirY*rayDirY)/(rayDirX*rayDirX)),但这可以简化为abs(1/rayDirX)。类似地,deltaDistY是“sqrt(1+(rayDirX*rayDirX)/(rayDirY*rayDirY)),可以简化为abs(1/rayDirY) rayDirX和rayDirY是光线的X和Y坐标。网格的每一侧都是1。我想这与重新调整毕达哥拉斯定理有关。但这是如何简化为这个的呢 abs(1/rayDirX)和abs(1/rayDirY)Math 光线投射';s公式,math,2d,trigonometry,raycasting,Math,2d,Trigonometry,Raycasting,我正在使用光线投射(只是重新制作旧的好wolf3d游戏)进行项目。我由一个指导老师带领。我被困在理解他所用的数学中。我试着进入它,花了很多时间在谷歌上搜索、画画和解决它,但我没有得到那个结果。在这里提问,因为math和gamedev社区看起来人口较少。gamedev社区也有和我一样的问题,但仍然没有答案。所以,也许有数学好的人可以解释一下 下面是一篇教程的内容: 当从几何角度推导deltaDistX时,使用毕达哥拉斯,可以得到公式“sqrt(1+(rayDirY*rayDirY)/(rayDi
非常感谢您提供的任何帮助和信息。我在遵循《洛德夫指南》时也遇到了同样的问题。他问自己。这是他的回答: 为了简洁起见,我们把rayDirX和rayDirY分别称为x和y。然后:
sqrt(1 + y * y / (x * x)) = sqrt((x * x + y * y) / (x * x))
但是我们知道rayDir的长度总是1,所以(x*x+y*y)
是1
这就给出了
sqrt(1/(x*x))
,它等于abs(1/x)
当我遵循洛德夫指南时,我也有同样的问题。他问自己。这是他的回答:
为了简洁起见,我们把rayDirX和rayDirY分别称为x和y。然后:
sqrt(1 + y * y / (x * x)) = sqrt((x * x + y * y) / (x * x))
但是我们知道rayDir的长度总是1,所以(x*x+y*y)
是1
这样就得到了
sqrt(1/(x*x))
,它等于abs(1/x)
参见。。。IIRC简化是简单的tan
方程,当一个轴为1
时,另一个轴转换为tan(a)=dy/1
或tan(a)=1/dx
。。。其中a
是投射光线的角度。。。因此,您应该以类似于dy=tan(a)
和dx=1/tan(a)
的方式结束。。。并且tan(a)
和1/tan(a)
都可以在某些LUT中预先计算速度(通常在固定点中以避免FPU和分割)。。。您的简化方程式已经可以缩放,因此缺少tan
。@Spektre感谢您的反馈!这可能是因为晒黑的缘故,但无论如何,我不介意把它放在正确的地方,让它工作起来。代码中没有与tan相关的内容。但我看到了在计算中使用tan来获得这个距离的指南。不管怎样,我很高兴你回答了这个:)看。。。IIRC简化是简单的tan
方程,当一个轴为1
时,另一个轴转换为tan(a)=dy/1
或tan(a)=1/dx
。。。其中a
是投射光线的角度。。。因此,您应该以类似于dy=tan(a)
和dx=1/tan(a)
的方式结束。。。并且tan(a)
和1/tan(a)
都可以在某些LUT中预先计算速度(通常在固定点中以避免FPU和分割)。。。您的简化方程式已经可以缩放,因此缺少tan
。@Spektre感谢您的反馈!这可能是因为晒黑的缘故,但无论如何,我不介意把它放在正确的地方,让它工作起来。代码中没有与tan相关的内容。但我看到了在计算中使用tan来获得这个距离的指南。无论如何,我很高兴你回答了这个问题:)