我的问题在计算机图形学领域很基本,但不知怎么的,我找不到答案。
Prolog:
我想写一个在画布上打印多边形的程序,我想让用户可以玩多边形——缩放、平移和旋转(围绕x/y/z轴)。
我应该只使用java AWT;而不是JOGL(用于openGL的java库)。
我通过程序的输入文件将多边形接收为三维世界坐标,以及"相机"属性,如相机坐标、视点、上矢量和窗口大小(用于从三维到二维的投影)。
第一个问题:
我的第一个问题是编写查看管道,因此三维世界坐标将转换为查看坐标(相机坐标),然后将其投影到二维坐标上,并执行剪裁以创建透视图。我看过无数的视频和方法,但我无法决定最终的矩阵。
第二个问题:
我的第二个问题是,在哪里应用三维变换矩阵。转换应该应用于原始世界坐标(然后当然继续查看管道)还是直接应用于查看坐标(然后从该点继续管道)?
为了澄清,让我们将查看管道表示为A->B->C->D,这是在每个用户转换上重新计算的,将用户发起的转换(可以是上面的任何一个)表示为T.
我关心的是是是做T->B->C->D还是A->T-B->C-C>D。
谢谢你的帮助。
通常从顶点坐标到屏幕坐标的方法是通过
(1) vertex -> (2) model -> (3) world -> (4) view -> (5) screen
举个例子:
- 最初指定的多边形坐标
- 也许你可以缩放/旋转/剪切点来创建你的模型
- 你把你的模特放在世界上
- 你把你的相机放在世界上(或者更确切地说,你移动世界以适应你的相机位置)。这就是放置lookAt矩阵的地方
- 你把它投影到屏幕上
当我们向右相乘时,当我们在程序中写入它时,我们需要切换顺序。最后的声明是这样的:
outPosition = screenProjection*worldToView*modelToWorld*polygonToModel*inPosition
因此,您可以看到,无论使用TA->B->C->D
还是A->TB->C->D
,都会产生两种不同的效果:第一种效果与我上面示例的效果相似(即T将作为polygonToModel
工作),或者它将作为modelToWorld
转换工作。两者都有效,只是产生了不同的结果。
注意,这里的所有变换都是4乘4的矩阵。步骤2-4中的变换都可以是单位矩阵(即没有缩放/剪切/旋转或任何东西),但对于投影,您需要创建一个截头体。您可以通过使用这里所述的东西来自己创建这个,但只使用java的3D数学库可能会更容易。