作为我项目的一部分,我需要使用android studio在android中绘制2D和3D功能。我知道如何绘制2D功能,但我正在努力学习3D功能。
绘制3D功能的最佳方法是什么?我需要什么,从哪里开始?
我不是在寻找完成所有工作的代码或外部库,我只需要知道自己需要学习什么才能自己完成。
提前致谢。
答案 0 :(得分:1)
我知道如何绘制2D功能,但我正在努力使用3D功能。
绘制3D功能的最佳方法是什么?我需要什么,从哪里开始?
我不是在寻找能够完成所有工作的代码或外部库,我只需要知道自己需要学习什么才能自己完成。
由于您已经了解2D并希望进入3D,因此有一种简单且非最佳的方法:
决定你想要多少 z 深度:
EG:目前你在绘图功能中对x和y的限制是1920和1080(甚至是4096x4096),如果你想节省内存并且有点低分辨率使用大小为1920x1080x1000 - 这将使用1000x更多内存并具有 潜力 ,可将部分调用的绘制时间增加1000倍 - 但这是3D的成本。
更实用的限制是8192,8192,16384的矩阵,但要注意那个分辨率为need 4-6GB graphic cards的视频游戏能够正常工作(更好一点) - 所以你从那个大小开始,我会嚼掉一些主要的记忆。
实现较小的绘图空间并简单地增加您的分配并限制变量很容易,这不仅可以测试未来的增加是否会顺利进行,而且可以让您在整理错误时更快地运行所有内容。 / p>
为函数添加第三维:
EG:而不是简单地将line_draw(x,y)更改为line_draw(x,y,z)的函数,而是使用全局变量z_limit(或者你决定命名它的任何东西)来测试z不做'超过限制。
您需要确定最大距离处的物体是否为点或不可见。测试时所有 z 超过限制值(因此使它们成为可见点)的测试非常有用。对于成品,一旦超过您正在实施的限制,最好不会看到它。
首先分配绘图缓冲区并首先实现单个函数,没有任何意义(并且可能非常沮丧)改变一切并希望它能够正常工作 - 它应该但是如果它如果每个功能都有一个共同的错误,你不会在你的盘子上有很多。
一旦你有一个3D图像缓冲区填充图像(从一些3D线开始,例如全屏大小的“X”和“+”),你可以通过开始绘制到2D屏幕X,Y首先在 Z 的最大值(EG:z = 1000)。完成图层递减 z 并继续后,绘制每个图层直到达到零,即最接近您的图层。
这是确保最近的物体遮挡最远物体的最简单(也是最慢)的方法。
现在看起来好吗?您不希望远程对象与最近的对象具有相同的大小(或更大),您希望确保缩放它们。
选择8192等数字的原因是因为 在 C (或您选择的任何一种语言)中编写功能后,您需要使用多个版本对其进行优化每个,用汇编语言编写,针对特定的CPU和GPU架构进行了优化。如果没有专门优化的版本,一切都将非常缓慢。
我知道你不想使用图书馆,但是看几个应该让你了解所涉及的工作以及如何实现自己的工作。无需复制,改进。
有类似的问题和答案可能填补空白:
Reddit - “I want to create a 3D engine from scratch. Where do I start?”
达沃斯 - “Tutorial series: learning how to write a 3D soft engine from scratch in C#, TypeScript or JavaScript”
GameDev.StackExchange - “How to write my own 3-D graphics library for Windows? [closed]”