android - 在 Android 中绘制 3D 数学函数
问题描述
作为我项目的一部分,我需要使用 android studio 在 android 中绘制 2D 和 3D 函数。我知道如何绘制 2D 函数,但我正在努力使用 3D 函数。
绘制 3D 函数的最佳方法是什么?我需要什么,从哪里开始?
我不是在寻找可以完成所有工作的代码或外部库,我只需要知道我需要学习什么才能自己完成。
提前致谢。
解决方案
我知道如何绘制 2D 函数,但我正在努力使用 3D 函数。
绘制 3D 函数的最佳方法是什么?我需要什么,从哪里开始?
我不是在寻找可以完成所有工作的代码或外部库,我只需要知道我需要学习什么才能自己完成。
由于您已经了解 2D 并希望进入 3D,因此有一个简单且非最佳的方法:
决定你想要多少z深度:
EG:目前,您在绘图函数中对 x 和 y 的限制是 1920 和 1080(甚至 4096x4096),如果您想节省内存并且分辨率有点低,请使用 1920x1080x1000 的大小 - 这将使用 1000 倍以上的内存和有可能将某些调用的绘制时间增加1000 倍——但这就是 3D 的成本。
一个更实际的限制是 8192,8192,16384 的矩阵,但请注意,该分辨率的视频游戏需要 4-6GB 显卡才能正常工作(越多越好) - 所以你会开始咀嚼一些主内存在那个尺寸。
实现更小的绘图空间并在以后简单地增加分配和限制变量是很容易的,这不仅可以测试未来的增加是否会顺利进行,而且它可以让一切运行得更快,同时你正在消除错误。
向函数添加第三维:
EG:不要简单地将函数 line_draw(x,y) 更改为 line_draw(x,y,z),而是使用全局变量 z_limit(或您决定命名的任何名称)来测试 z 是否不超过限制。
您需要确定最大距离处的对象是点还是不可见。虽然测试将所有z超过限制更改为限制值(从而使它们成为可见点)是有用的。对于成品,一旦超过了您正在实施的限制,最好不要看到它。
首先分配绘图缓冲区并首先实现一个函数,没有意义(并且可能非常沮丧)改变一切并希望它能够正常工作 - 它应该但是如果它没有,你会有很多事情要做每个功能都有一个共同的错误。
一旦这个 3D 缓冲区填充了图像(从几条 3D 线开始,例如全屏大小的“X”和“+”),您从 Z 的最大值开始绘制到 2D 屏幕X 、Y首先(例如:z=1000)。一旦你完成该层递减z并继续,绘制每一层直到你达到零,即离你最近的对象。
这是确保最近的物体遮挡最远的物体的最简单(也是最慢)的方法。
现在看起来还好吗?您不希望远处的对象与最近的对象大小相同(或更大),您希望确保缩放它们。
选择诸如 8192 之类的数字的原因是因为在用C (或您选择的任何一种语言)编写函数之后,您需要使用多个版本来优化它们,每个版本都是用汇编语言编写的,针对特定的 CPU 和 GPU 架构进行了优化。如果没有特别优化的版本,一切都会非常缓慢。
我知道您不想使用库,但是查看几个库应该可以让您了解所涉及的工作以及如何实现自己的库。无需复制,只需改进即可。
有类似的问题和答案可能会填补空白:
Reddit - “我想从头开始创建一个 3D 引擎。我从哪里开始? ”
Davrous -“教程系列:学习如何用 C#、TypeScript 或 JavaScript 从头开始编写 3D 软引擎”
GameDev.StackExchange -“如何为 Windows 编写我自己的 3-D 图形库?[关闭] ”
推荐阅读
- git - 在 git 提交中看到“此用户尚未上传他们的公钥”,但我的 gpg 密钥已上传
- php - 从 Firebase 中删除多个数据
- python - 有没有办法根据行/列为数据框绘制热图?
- c - 税级计算器自我分配
- python - Python-删除2列为空/空的行
- data-visualization - 如何使用 Tableau 为赛车条形图创建动态 x 轴
- mysql - 查找日期重叠:如何在 mysql 中查找用户与其他用户重叠的日期?
- c - 我们的教授要求我们编写一个 C 程序,该程序将使用 while 循环显示数字的立方体
- gulp - Gulp 或 grunt 插件来增加一个值?
- r - 按向量 R 的顺序查找先前最大值的列表