为什么我的 C# 光线投射渲染引擎在它们应该是直的时候却产生了曲线?

问题描述 投票:0回答:1

目前正在用 C# 编写基于 Wolfenstein 3D 引擎的简单光线投射引擎。它以 string[] 作为地图并渲染相机将看到的内容。完成此操作的方法是投射 960 条光线,输出窗口中的每个像素垂直切片投射一条光线,并测量光线传播的距离。然后它通过一个函数运行该值并将其转换为为该垂直切片呈现的一像素宽矩形的高度。我的问题是,对于非常靠近的墙壁,视图会扭曲墙壁的直边,使其弯曲,类似于 y=ln(x) 图。

地图(c是相机,面向正东):

输出(带注释):

我觉得奇怪的是,这样的系统会错误地渲染这个小部分,而其余部分渲染良好。我已经为光线投射长度添加了欧几里德距离校正计算,见下文。

float adjusted_dist = (float)Math.Cos(angle) * length;

这修复了类似的鱼眼效果,但没有解决这个问题。

我的光线投射代码工作正常,如我渲染的这张自上而下的调试图像所示:

屏幕尺寸为960px x 540px,我根据这个公式将光线的距离转换为屏幕切片的高度:

int pixels = (int)(540 - (540 * heights[i] / max_dist));

其中

max_dist
是一个值为 150 的常数。我的推理是,这将准确地将光线的长度从范围 (0-150) 转换为范围 (0-540),因为我目前没有任何内容距离相机超过 150 个单位的场景。 (地图中的每个字符都是一个 10 单位乘 10 单位的正方形)。但是,这是我怀疑错误源自的那一行,但是确切的原因让我避而不谈。会喜欢一些输入和潜在的其他方法来将光线长度转换为像素切片高度。

我已经排除了大部分渲染代码,因为它工作正常,但是如果需要更多代码,我可以提供更多片段。

c# rendering raycasting
1个回答
0
投票

我认为这里的主要问题是:

int pixels = (int)(540 - (540 * heights[i] / max_dist));

只会在光线的长度为 0 时达到最大值 (540)。首先,这在任何情况下都不会发生(通过查看调试渲染),其次:我认为你会想要在比完全没有距离更远的距离处绘制最大像素高度。查看输出,屏幕右侧大约三分之一的像素高度已经达到最大。

我不确定如何才能做得更好,我的一个想法是从射线长度中减去一些量(当然最小值为 0),但这可能无法解决核心问题,一切看起来都一样如果离得近,也许值得一试。

希望我的意见有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.