1

我想制作一个 3D 模型,我可以用搅拌机、sketchup 等工具制作它,并将其离散化为 3D 矩阵。

你可以说我想“Minecraftise”一个任意对象。(模拟的除外)

一个例子:这是一个带有半球形末端的离散圆柱体:

在此处输入图像描述

我目前的想法是获取描述对象的顶点列表,并查看它们将占据矩阵中的哪些单元格,然后将其标记为被对象占据。

1)这是一个好方法吗?

2)如果是这样,完成这项任务最简单的模型格式是什么,是否有一些标准的优质库?

谢谢

4

1 回答 1

1
  1. 直接为您的模型创建渲染引擎到 3D 矩阵而不是在屏幕上(体积渲染

    要么使用自己的软渲染或OpenGL + GLSL或其他任何东西......

  2. 清除矩阵

    颜色为空

  3. 将您的模型渲染为矩阵

    没有CULL_FACE移除,没有Z buffer没有透视投影!

  4. 填充网格内部

    为矩阵的每一行投射光线,并将里面的所有内容设置为已填充。在射线的开始,体素在外面,当你击中任何填充的体素时,它从那个点开始在里面。当您再次击中任何填充的体素时,它就在该点之外,依此类推......

在软件渲染中,写入像素是这样的:

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示例:

于 2014-05-22T05:34:08.050 回答