我想制作一个 3D 模型,我可以用搅拌机、sketchup 等工具制作它,并将其离散化为 3D 矩阵。
你可以说我想“Minecraftise”一个任意对象。(模拟的除外)
一个例子:这是一个带有半球形末端的离散圆柱体:
我目前的想法是获取描述对象的顶点列表,并查看它们将占据矩阵中的哪些单元格,然后将其标记为被对象占据。
1)这是一个好方法吗?
2)如果是这样,完成这项任务最简单的模型格式是什么,是否有一些标准的优质库?
谢谢
我想制作一个 3D 模型,我可以用搅拌机、sketchup 等工具制作它,并将其离散化为 3D 矩阵。
你可以说我想“Minecraftise”一个任意对象。(模拟的除外)
一个例子:这是一个带有半球形末端的离散圆柱体:
我目前的想法是获取描述对象的顶点列表,并查看它们将占据矩阵中的哪些单元格,然后将其标记为被对象占据。
1)这是一个好方法吗?
2)如果是这样,完成这项任务最简单的模型格式是什么,是否有一些标准的优质库?
谢谢
直接为您的模型创建渲染引擎到 3D 矩阵而不是在屏幕上(体积渲染)
要么使用自己的软渲染或OpenGL + GLSL或其他任何东西......
清除矩阵
颜色为空
将您的模型渲染为矩阵
没有CULL_FACE
移除,没有Z buffer
也没有透视投影!
填充网格内部
为矩阵的每一行投射光线,并将里面的所有内容设置为已填充。在射线的开始,体素在外面,当你击中任何填充的体素时,它从那个点开始在里面。当您再次击中任何填充的体素时,它就在该点之外,依此类推......
在软件渲染中,写入像素是这样的:
DWORD scr[ys][xs],DWORD zed[ys][xs]; // screen and Z buffers xs,ys is resolution
void setpixel(DWORD x,DWORD y,DWORD z,DWORD color) // x,y,z, are already projected
{
if ((x>=0)&&(x<xs)) // cut off out of screen pixels
if ((y>=0)&&(y<ys))
if (z<=zed[y][x]) // test Z buffer
scr[y][x]=color; // write color to pixel
}
所以只需将其更改为:
DWORD vox[zs][ys][xs]; // voxel buffer (your 3D matrix)
void setpixel(DWORD x,DWORD y,DWORD z,DWORD color) // x,y,z, are already projected
{
if ((x>=0)&&(x<xs)) // cut off out of volume pixels
if ((y>=0)&&(y<ys))
if ((z>=0)&&(z<zs))
vox[z][y][x]=color; // write color to voxel
}
在OpenGL中,您可以绘制纹理数组或使用 3D 纹理……我不使用DirectX,但我认为它也可以在那里实现。这是我的GLSL示例: