java - 了解此 2D 像素操作代码背后的数学原理
问题描述
我最近一直在尝试扩展我对旧/新复古渲染技术的了解,并且我偶然发现了一种创建 3D-ish(想想 DOOM)渲染方法的方法。但是,我不完全确定它是如何工作的。如果能深入了解这段代码实际工作背后的数学原理,我将不胜感激。
我了解 x,y 值的操作,这些值循环遍历整个屏幕像素集,然后偏移它们以标准化正在创建的“新”假 3D 空间,但是深度是如何包含在其中的?为什么它起作用。我到处寻找一个可靠的解决方案。任何帮助是极大的赞赏。
要获得以下代码的进一步帮助,变量 height=480 和 width=640。我什至用它写过纸,只是无法绕开它。我知道一些事情是从一般的透视方程中得出的。但我很迷茫。
double ceilingHeight = 8.0;
double floorHeight = 4.0;
for(int y = 0; y < height; y++) {
double yD = y - height / 2.0;
double z = floorHeight / yD;
if(yD < 0)
z = ceilingHeight / -yD;
for(int x = 0; x < width; x++) {
double xD = x - width / 2.0;
xD *= z;
int xx = (int)xD & 15;
int yy = (int)z & 15;
pixels[x + y * width] = (xx * 16) | (yy * 16) >> 8;
}
}
解决方案
推荐阅读
- c# - C# MSChart 轴高度
- f# - F# Api crawler using recursion or loop
- html - 页脚下的绝对 div
- c# - WebUtility.HtmlEncode 和 AntiXssEncoder.HtmlEncode 有什么区别?
- optaplanner - OptaPlanner 日志求解器相变
- javascript - 如何通过ajax处理更改数据库中的布尔字段?
- database - PostgreSQL - MVCC(多版本并发控制) - 何时获取实际锁?
- node.js - 使用 multer 将文件上传到 S3 存储桶期间的 CRC32 检查
- testing - 当所有测试都完成运行时,我如何调用一个函数?
- apache-spark - GeoMesa Spark 无法使用 UDF 函数