计算机图形操作的矩阵

时间:2016-05-04 15:20:40

标签: java opengl math graphics 3d

我想做什么

我只使用Java AWT实现自己的查看管道,模仿OpenGL的行为。

在底线,我能够通过整个pipleline过程转换世界坐标系中的三维多边形,并在Viewport坐标系的2D屏幕上输出它们。

我也有能力在我的世界上进行缩放,旋转或翻译。

优化 - 问题的主体

我已经读过OpenGL为每次转换保存内部矩阵(世界观看,查看到投影,投影到设备/视口 - 我没有模型坐标,我从世界开始一切坐标 - 所有三维多边形已经在相同的世界坐标上,所以请忽略模型世界转换)。

现在,如果我想以编程方式模仿,我该如何实现呢?

如果我只是按住3个矩阵,并且每次向世界应用缩放/旋转/变换时,我必须:

  1. 循环遍历世界坐标和每个坐标:

    1.1将坐标与世界视图矩阵相乘

    1.2将坐标与投影矩阵(到2D)相乘

    1.3将视口矩阵与坐标矩阵相乘

  2. 最终点位于屏幕坐标中,只需使用Java AWT打印到屏幕

  3. 这是合适的方法吗?

    我可以将前方的世界视图矩阵,投影矩阵和投影视口矩阵乘以单个矩阵M,并且每个点只有多个M?我想我不能,因为第一个矩阵是4x4,第二个是4x4,第三个是3x3(不再是Z值)。

1 个答案:

答案 0 :(得分:0)

请记住"循环每个坐标并将它们乘以各自的矩阵:

  1. OpenGL在其固定功能管道中的作用
  2. 大多数顶点着色器在可编程管道中的作用
  3. 事实上,你可以提前将矩阵预乘在一起以减少计算 - 一些顶点着色器只需要一个" MVP"投影,视图和模型矩阵一起预乘。如果您只是设置' z'那么视口矩阵应该是可重构的。组件为0并构造一个4x4矩阵,从而允许它与其他矩阵相乘。

    如果我是你,尝试在软件层面上重新创建OpenGL的功能,我将专注于OpenGL的可编程管道功能,即为着色器获取源或二进制文件并将其解析为应用于数据的函数,而不是您使用的预定义矩阵。 OpenGL的立即模式确实维护了你想到的矩阵,但立即模式已有二十多年了,如果你想要你学习的东西是有意义的,你应该建立你的现代OpenGL周围的管道,而不是20年前的OpenGL。