我的问题在计算机图形领域非常基础,但不知怎的,我找不到答案。
的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.
感谢帮助者。
答案 0 :(得分:0)
通常从顶点坐标到屏幕坐标的方式是
(1) vertex -> (2) model -> (3) world -> (4) view -> (5) screen
所以举例说明:
当我们向右移动时,我们需要在程序中编写时切换顺序。最终陈述如下:
outPosition = screenProjection*worldToView*modelToWorld*polygonToModel*inPosition
所以你看,你是否会使用TA->B->C->D
或A->TB->C->D
会产生两种不同的效果:第一种类似于我上面举例说明的效果(即T将作为polygonToModel
使用),否则它将作为modelToWorld
转换。两者都有效,它们只会产生不同的结果。
请注意,此处的所有转换都是4 x 4矩阵。步骤2 - 4中的变换都可以是单位矩阵(即没有缩放/剪切/旋转或任何东西),但是对于投影,您需要创建截锥体。您可以使用类似于here之类的内容自己创建这个,但是为java使用3D数学库可能更容易。