java - 数学 vector 矩阵乘法

标签 java opengl

据我所知,opengl 视口(viewport)的坐标系是二维的,在 x 和 y 方向上的范围在 -1 和 1 之间。要将 3DVector 的位置从“世界空间”映射到视口(viewport)坐标,您可以编写 f.e

片段着色器中的“gl_position=uModelViewProjectionMatrix * vPosition”。

我的问题是如何将 3DVector 乘以 4D 矩阵并得到 2DVector 作为结果 - 更重要的是 - 是否有在 CPU 端执行此操作的功能(尤其是 android 中 java 的库/类)

最佳答案

只是澄清几个术语:

  • 视口(viewport)是您正在绘制的窗口内的区域。它以像素为单位指定。
  • 光栅化器需要标准化设备坐标中的坐标,即 -1 到 1。然后将这些映射到视口(viewport)区域。
  • gl_Position 必须在剪辑空间 中采用 4D vector 。这是裁剪的空间三角形(例如,特别是如果它们与近平面相交)。这与规范化的设备坐标是分开的,因为透视划分还没有发生。自己执行此操作将是 pos/= pos.w,但这会丢失 OpenGL 裁剪、深度和插值所需的一些信息。

这让我找到了答案。你是对的,你不能将 3D vector 乘以 4x4 矩阵。它实际上是在使用 homogeneous coordinates 并且 vector 是 4D,末尾有 1。 4D 结果用于裁剪空间。光栅化器仅使用 2D 位置创建片段,但 w 用于透视正确插值,z 用于深度测试。

最后,ModelViewProjection 矩阵意味着引入了另外三个空间。这些纯粹是惯例,但有充分的理由存在。网格顶点在对象空间中给出。您可以使用模型 转换矩阵将对象放置在世界中。您使用 View 矩阵提供相机在世界中的位置和旋转。然后投影矩阵通过缩放裁剪空间的所有内容来定义观察体积。将 View 矩阵和投影矩阵分开的一个原因是为了眼空间中的操作,例如光照计算。

我不会详细介绍,但希望这能让您走上正确的道路。

关于java - 数学 vector 矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828133/

相关文章:

java - SharedPreference 中的 Android 列表

java - 将 channel 链接在一起会删除 file_originalFile header

c - GLUT 问题

java - LWJGL 游戏未正确结束

java - 如何在Spring中的TestContext中使用服务器数据库而不是内存中的h2数据库?

java - 如何在java中比较两个通用列表的元素?

java - Spring Boot - 忽略属性 server.contextPath

c++ - 为什么我的 OpenGL 3.3 应用程序不绘制任何东西?

c++ - 如何在 OpenGL 中绘制立方体?

c++ - 绘制和加载 GL_DEPTH_COMPONENT 纹理