查看管道和3D转换

时间:2016-04-18 20:46:07

标签: java math matrix graphics transformation

我的问题在计算机图形领域非常基础,但不知怎的,我找不到答案。

的Prolog:

我想编写一个在画布上打印多边形的程序,我想让用户使用多边形 - 缩放,平移和旋转(围绕x / y / z轴)。

我应该只使用java AWT;不是JOGL(java的openGL库)。

我将多边形作为3d世界坐标通过输入文件接收到程序,以及“相机”属性,如相机坐标,查看点,向上矢量和窗口大小(用于投影从3d到2D)。

第一个问题:

我的第一个问题是编写查看管道,因此3d世界协调将转换为查看坐标(相机坐标),然后将其投影到2d坐标并执行剪裁以创建透视。我已经看过无数的视频和方法,但我无法决定最终的矩阵。

第二个问题:

我的第二个问题是,在哪里应用3D转换矩阵。 转换是应该应用于原始世界坐标(然后当然是继续查看管道)还是直接查看坐标(并从那一点继续管道)?

为了澄清,让我们将观看管道表示为A-> B-> C-> D,其在每个用户变换上重新计算,并且用户发起的变换(可以是上述任何一个)作为T

我关心的是是否进行T A-> B-> C-> D或A-> T B-> C-> D.

感谢帮助者。

1 个答案:

答案 0 :(得分:0)

通常从顶点坐标到屏幕坐标的方式是

(1) vertex -> (2) model -> (3) world -> (4) view -> (5) screen

所以举例说明:

  1. 您最初指定的多边形坐标
  2. 也许您缩放/旋转/剪切点以创建模型
  3. 您将模型置于世界
  4. 您将相机放置在世界中(或者更确切地说,您移动世界以适应您的相机位置)。这是您放置lookAt矩阵的地方。
  5. 您在屏幕上投影
  6. 当我们向右移动时,我们需要在程序中编写时切换顺序。最终陈述如下:

    outPosition = screenProjection*worldToView*modelToWorld*polygonToModel*inPosition
    

    所以你看,你是否会使用TA->B->C->DA->TB->C->D会产生两种不同的效果:第一种类似于我上面举例说明的效果(即T将作为polygonToModel使用),否则它将作为modelToWorld转换。两者都有效,它们只会产生不同的结果。

    请注意,此处的所有转换都是4 x 4矩阵。步骤2 - 4中的变换都可以是单位矩阵(即没有缩放/剪切/旋转或任何东西),但是对于投影,您需要创建截锥体。您可以使用类似于here之类的内容自己创建这个,但是为java使用3D数学库可能更容易。