【问题标题】:The math to render a cube?渲染立方体的数学?
【发布时间】:2013-11-07 18:23:39
【问题描述】:

我和我的朋友在学校的 VB 课上从零开始制作一个 3D 渲染引擎,但我不确定形成立方体的数学是如何工作的。给定六个变量:

    rotX
    rotY
    rotZ
    lenX
    lenY
    lenZ

分别代表 x,y,z 上的旋转和 x,y,z 上的长度,制作立方体的公式是什么?我知道我所要做的就是计算三个段,然后从这些段中创建三个平行四边形,所以我只需要数学来找出这三个段是什么。 谢谢!

【问题讨论】:

  • 取决于您如何进行渲染。 OpenGL 通过将当前矩阵与特定矩阵相乘来执行旋转,其公式在here 中列出。
  • 为了渲染,我只是使用 e.Graphics.DrawPolygon 函数来绘制从可见面相交的 3 个线段派生的 3 个平行四边形中的每一个。
  • 通过“渲染”,我的意思是,获取一个三维点并确定该点将在您的屏幕上绘制的二维坐标。比如,如果我想绘制点 (16,23,42),你的引擎会在哪里绘制像素?你写过代码吗?
  • 不,这实际上是我需要帮助的,现在我想起来了。一旦找到对我有帮助的公式,我可能可以编写公式来进行立方体的 3d 旋转,但我不确定如何将 3d 点绘制到 2d 表面上。

标签: vb.net math graphics 3d render


【解决方案1】:

有 2 个基本的 3D 对象表示,两者都是您的数据不足。

  1. 表面表示

    • 对象是一组表面多边形/顶点/...
    • 对于立方体,它是一组 8 个点 + 6 个面的三角形/四边形
  2. 分析表示

    • 对象是描述对象的一组方程
    • 对于立方体,它是 6 个平面的交集

我认为您正在使用选项 1,所以您需要的是: - 位置 - 方向 - 大小

通常一个轴对齐的立方体看起来像这样:

const double a=1.0; //cube size;
double  pnt[8][3]=  //cube points
    {
    +a,-a,+a,
    +a,+a,+a,
    -a,+a,+a,
    -a,-a,+a,
    +a,-a,-a,
    +a,+a,-a,
    -a,+a,-a,
    -a,-a,-a
    };
int     tab[24]=
    {
    0,1,2,3,    // 1st.quad
    7,6,5,4,    // 2nd.quad
    4,5,1,0,    // 3th.quad ...
    5,6,2,1,
    6,7,3,2,
    7,4,0,3
    };

尺寸和方向很好,您可以应用变换矩阵
或者直接通过方向向量重新计算点

  • 因此您需要记住位置(点)和方向(3 个向量)和大小(标量)
  • 以上所有内容都可以存储在单个 4x4 变换矩阵中
  • 但如果你想要向量,那么点将是这样的:

P(+a,-a,+a) -> +a*I -a*J +a*K

  • 其中 I、J、K 是方向向量
  • a 是立方体大小
  • P(+a,-a,+a) 是上表中的原始轴对齐点

选项 2 实施起来更加棘手,除非你真的需要它(光线追踪渲染)然后忘记它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 2010-10-02
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2015-06-30
    • 2015-08-12
    相关资源
    最近更新 更多