graphics - 将 y 剪切地平线偏移转换为光线转换器中的俯仰角

标签 graphics 3d trigonometry projection raycasting

我正在编写一个第一人称射击游戏,使用光线转换来渲染世界。我已成功添加 y 剪切,以便我可以向上和向下查看(尽管如预期的那样有一点扭曲)。如果我的 y 间距值为零,则地平线(由细红线表示)位于屏幕的中心。

center

如果我完全向下看,我的 y 间距值等于 -half_screen_height,因为该偏移量会添加到地平线。您可以在顶部附近看到同样细的地平线。

down

对于完全向上查找,则相反。 现在,我面临的问题是我想结合垂直瞄准来瞄准高度高于零的敌人,如下所示:

enter image description here

我能够追踪 2D 射弹,因为我有玩家的视角,从那里我可以在循环中步进一定的 X 和 Y 量,这样 x += cos(theta) *步骤y += sin(theta) * 步骤。这相当容易。但为了在第三维度进行追踪,我需要另一个角度来告诉我向上或向下看的程度。有谁知道如何将 y 节距水平线偏移转换为角度吗?

编辑:澄清一下,一位评论者说这是海拔变化,但事实并非如此。下面的 GIF 演示了 y 剪切(首先显示)和更改玩家高度(第二次显示)之间的差异。对于给定的 y 间距值,它会添加到屏幕上每个墙柱的 y 位置,从而将其向上移动;但这不是海拔变化。

shear vs altitude change

注意:由于 stackoverflow 的 2mb 大小限制,GIF 被高度压缩。

最佳答案

我是这样看的:

triangle

因此,您的目标与剪切力和一些预定义的垂直距离(或到目标的距离)形成直角三角形,因此:

tan(tilt) =      shear/d
    tilt  = atan(shear/d)

剪切已签名,因此倾斜也将签名...

这个想法是,直角三角形中边的比率将为您提供 tanctg (这取决于 2 个角度中的哪一个以及边的顺序)比率)。 atan,actgtan,ctg 的反函数,因此将其应用于比率或 tan 将获得原始倾斜角度...

您凭经验确定:

d=half_screen_w/tan(fov/2.0)

所以就像枪的末端靠近投影平面。

关于graphics - 将 y 剪切地平线偏移转换为光线转换器中的俯仰角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69485992/

相关文章:

opengl - 如何使用 C 或 C++ 与显卡进行接口(interface)?

java - 设置椭圆形 throw 错误

java - 如何显示另一个类的图形

3d - 计算点和矩形框(最近点)之间的距离

c++ - 3d 相机 - 如何改变相机方向?

c++ - 使用 Qt3D 2.0 的广告牌

Java 1.5 使用线条和角度绘制形状的问题

c++ - 计算 3D 平面圆的最小半径

python - 使用 Python 创建一个单位圆计算器?

c# - 如何生成/计算十二面体的顶点?