问题标签 [projection-matrix]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
707 浏览

c++ - DirectX 11 直接纹理映射

我正在尝试使用正交投影矩阵在 DirectX 11 (C++ API) 中渲染到纹理。在水平维度中,我正在利用发生的“投影”,但在垂直维度中,我希望我的顶点直接映射到特定的纹素行。

我创建了一个 128x128 的纹理。我将它设置为我的渲染目标并设置如下视口:

我提供了一个这样创建的投影矩阵:

请注意,我的左右值与纹理宽度不匹配,但从下到上的值与高度匹配。有了这个,我希望如果我的顶点着色器使用上面的 SV_Position 投影矩阵转换 Y 值为 0.0f 的坐标,它将被绘制到纹理的顶行。Y 值为 127.0f 的坐标将被绘制到纹理的底行。

但是,在给它提供我希望填充整个纹理的数据之后(我正在绘制许多顶点作为点列表),我的纹理的底行是空白的。而且我注意到我的纹理的第一行似乎不包含我期望的顶点。似乎所有内容都向上移动了一行(或部分行)。

我已经阅读了DirectX 10 Coordinate System上的页面,但我一定不能完全理解这一点。我认为这是在告诉我,我不必像在 DirectX 9 中那样将任何东西偏移 0.5。但也许我倒退了?

控制我的顶点被绘制到哪些纹素行的正确方法是什么?

我不知道这是否有任何后果,但我会注意到我从未将这个纹理渲染到屏幕上。我正在将纹理保存到图像文件中。

0 投票
2 回答
1223 浏览

computer-vision - 相机投影矩阵:为什么要转置旋转矩阵?

在下面的:

http://cvlab.epfl.ch/files/content/sites/cvlab2/files/data/strechamvs/rathaus.tar.gz

有一个 README 文件说:

我记得 3D 到 2D 相机投影矩阵需要 R 旋转,而不是转置 R 矩阵,即我期望:

为什么它说 R^T 而不仅仅是 R ?

0 投票
2 回答
1112 浏览

matrix - 投影矩阵在平面上投影一个点

在此处输入图像描述

如何确定 4x4 S矩阵以使 P 在 XZ (Y=0) 平面上投影到 Q 中?

Q = S P

0 投票
2 回答
1536 浏览

opengl - OpenGL 将屏幕的一部分渲染到纹理

我正在尝试将屏幕的一小部分区域渲染为屏幕外纹理。这是我的应用程序中的屏幕截图功能的一部分,用户在屏幕上选择一个区域并将其保存到图像中。虽然屏幕上的区域可能是 250x250 像素,但保存的图像可能会大很多,例如 1000x1000 像素。

我了解使用 FBO 渲染到纹理的过程。在定义剪辑场景的投影矩阵以便只渲染屏幕截图区域时,我大部分时间都被卡住了。

0 投票
1 回答
973 浏览

translation - 如何从物体空间位置获取近平面上的相机空间位置

如标题所示,我有一个项目在对象空间中的特定位置由单个向量定义。

我想检索该向量在近剪裁平面上的投影在相机空间中的坐标。

换句话说,我需要这个向量和z坐标定义的平面之间的相机空间交点等于-1(我的近平面)。

我需要它来用鼠标在透视投影中线性移动对象

编辑:现在我从对象空间到窗口空间,然后通过将窗口深度 window.z 设置为 0 来从那里到相机空间,即近平面。

请注意,要从 unProject 获取相机空间,我只需将模型视图矩阵作为单位矩阵传入new Mat4(1f)

有没有更好的方法(更有效)来获得它而无需进入窗口空间并返回相机?

0 投票
1 回答
49 浏览

opengl - 将视图体积从一种视图转换为另一种视图

所以我在世界空间中有一个对象和两个视图 A 和 B,它们显示具有不同相机设置的场景。我想将视图体积(近平面)从视图 A 转换为视图 B,这样我就可以获得概览和细节之类的东西。我必须对视点 A 在平面附近的平截头体应用哪些变换才能在视图 B 中显示它?

0 投票
1 回答
251 浏览

opengl - OpenGL:将视图空间坐标投影到 NDC,结果似乎超出 [-1,1] 范围

我一直在尝试按照教程的说明实现屏幕空间环境光遮蔽。当我遇到它们时,我一直在解决我的实施问题,但是这个问题让我现在很难过。

我对方法的理解如下。环境遮挡因子由取自与给定片段法线对齐的半球内的样本确定。为了确定样本是否对环境遮挡因子有贡献,我必须根据视图空间深度纹理(包含在本文图片的左下角)检查样本在视图空间中的深度。所以我知道要从深度纹理中获取哪些坐标,我必须将样本的坐标从视图空间转换为标准化的设备坐标(在 [-1,1] 范围内),然后再转换为 [0 ,1],因此深度纹理​​有效地“映射”到视口。

下图是我的环境遮挡放置在我的场景上。我知道环境遮挡本身存在一个相当明显的问题(我假设半球的方向不正确),我会及时处理,但目前引起我好奇心的是遮挡的外观被“缩小” ',这表明我从视图空间样本坐标移动到纹理坐标的操作是不正确的。

在此处输入图像描述

由于我缺乏稳定的着色器调试器,我可以做的调试仅限于我可以渲染到屏幕上的内容。下一个图像是使用以下代码创建的,其中ndcs是给定样本的标准化设备坐标:

在此处输入图像描述

我希望图像完全是白色的(或者更确切地说,我使用这个着色器的位),但是它似乎表明我正在创建的 NDC 超出了 [-1,1] 范围,我相信一定是不正确的。它也不是屏幕的一致区域,如下图所示,相机非常靠近表面:

在此处输入图像描述

我以前从来没有使用过这个程序来获得 NDC,所以我确信我的逻辑一定是有问题的。我已经下载了教程提供的演示代码,但我看不出我的代码有什么不同。我也在网上搜索过(包括在这个网站上),我似乎无法找到与我症状完全相同的人。

这是我的着色器中的相关代码:

垂直着色器:

片段着色器:

我已经孤立地查看了每个元素,但看不到它们的问题。

  • 我已经将片段自己的视图空间位置替换为投影(而不是样本的视图空间位置),我得到了相同的结果。
  • 投影矩阵是我用来变换模型顶点的透视矩阵(我已经在我的顶点着色器中构建了 MVP 矩阵,以确保投影矩阵能够完整地到达着色器程序,并且确实如此)。
  • 投影操作本身 - 这不是我以前做过的事情,但我已经阅读了网上的文章和有投影问题的人的问题,我看不出我做错了什么。

因此,我只能得出结论,我对透视投影的理解一定有一些基本的东西是有缺陷的,但我就是不知道是什么。如果你们中的任何人可以阐明问题或进一步的途径让我检查,我将不胜感激。如果我遗漏了任何有用的信息或我可以澄清的任何信息,请告诉我。

0 投票
0 回答
494 浏览

opengl - View-Projection 矩阵,Z 的含义

我使用 4x4 透视视图投影矩阵将具有 X、Y、Z 模型坐标的 3D 点投影到 X、Y 图像坐标。只有一个模型,所以它就像一个 MVP 矩阵,其中 M 矩阵是统一的。

是否可以从视图投影矩阵中提取相机位置的坐标(在模型坐标中)。(即视图矩阵的翻译组件)?

另外,投影图像坐标中的 Z 分量到底是什么意思(除以 W 后)?我知道近平面和远平面之间的点在 -1 和 1 之间,但是是否可以从中推断出点到相机的距离(在模型坐标中)?

0 投票
2 回答
504 浏览

opengl - 在 2 个投影矩阵之间转换坐标

我正在使用带有LibGDXBox2D库 的Java编写游戏。

屏幕包含 12*7 块,横向,所以我使用 12 和 7 作为 wiewport 宽度和高度的正交相机。此外,Box2D世界使用此相机。窗口屏幕尺寸为 840 x 490,以便将它们除以 12 和 7 :)。

摄像机跟随主角,所以它的投影矩阵随着摄像机的每次移动而变化。所以我使用batch.setProjectionMatrix(camera.combined)并绘制我的游戏对象。

但是,如果我需要将鼠标屏幕坐标转换为本地 box2D 坐标怎么办?
有没有办法将坐标从一个投影 maxtrix 转换为另一个?
例如,如果我的相机正在注视屏幕中央的 (0; 0),我将在屏幕坐标中找到 (840/2; 490/2) 的点。反之亦然,从 (420; 245) 到 ..whatever,考虑到相机的移动。

0 投票
0 回答
704 浏览

java - LWJGL OpenGL 投影矩阵

我正在使用我在 lwjgl wiki 上为我的 VBO 立方体找到的投影矩阵。

它在大多数情况下都可以正常工作,但是当涉及到我认为的纵横比时,事情就开始变得有趣了。

我的应用程序窗口分辨率是 640 x 480。当我运行程序时,立方体会发生这种情况......

拉伸问题图像

你看到的脸应该是完美的方形,相反,它似乎随着纵横比而被拉伸。

这是我的投影矩阵代码。

这是我修改和翻译所有矩阵的地方。

obj.matrix() 是模型视图矩阵 obj.rotation、object.position 和 object.scale 都是 Vector3f 的 camera.matrix( matrix type ) 要么返回投影矩阵,要么返回视图矩阵

PS degToRad 和 coTan 是类似于 Math.toRadians 和 Math.tan 的方法

这是顶点着色器。

如果您需要我的代码的任何其他部分,请发表评论。