平面投影中的二维纹理变形



我很难弄清楚我的纹理是怎么回事:

基本上,我在OpenGL中获取一个网络摄像头流作为我的底层2d纹理画布,在我的paintGL()中,我在上面绘制东西(作为带有GL_BLEND的RGBA图像)。因为我使用Kinect作为数据源,所以我也可以从追踪的骨骼(人)获得深度值,并将其转换为GL值(XYZ在0.0f和1.0f之间变化)。所以我的目标是,例如,加载的2D纹理(如衬衫)现在可以正确地跟踪我的RGB输出显示中的人。但似乎我对正射影的理解是错误的:

我不断地将4个转换的顶点加载到VBO中,但是每当我将纹理放在这个动态四边形的顶部时,它总是面向屏幕。我认为将这个动态四边形放在"背景"画布和相机之间会导致四边形在画布上的正确投影,这将给我一种扭曲的2D纹理的印象,似乎每当人旋转时就会"弯曲"。

但是纹理总是面向摄像机并且不旋转。我也尝试通过矩阵手动旋转并将其设置为我的着色器,但再次,它只旋转顶点四边形本身(因为:旋转只是使纹理更小),然后将纹理放在顶部,而不是旋转纹理。

那么,是否有可能正确地将此应用于纹理?我想过混合透视投影,但实际上不知道如何实现这个…

编辑:

我实际上已经像下面这样设置了我的投影矩阵:

在<<p> em> resizeGL () :
projection.setToIdentity();
projection.ortho(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
projection.translate(0.0f, 0.0f, 3.0f);
在<<p> em> paintGL () :
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);  // turning this on/off makes no difference
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, &textureID);
program.setUniformValue("mvp_matrix", projection);
program.setUniformValue("texture", 0);
//draw 2d background quad
drawQuad();
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// switch to frustum to give perspective view
projection.setToIdentity();
projection.frustum(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
projection.translate(0.0f, 0.0f, 3.0f);
// bind cloth texture and draw ontop 2d quad
clothTexture->bind();
program.setUniformValue("mpv_matrix", projection);
drawShirtQuad();
// reset to ortho view
projection.setToIdentity();
projection.ortho(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
// release texture
clothTexture->release();
glDisable(GL_BLEND);

clothTexture是一个QOpenGLTexture,它已经成功地从文件中加载了RGBA图像。结果:每当我激活视锥体透视时,它都会导致黑屏。我认为一切都是正确设置的:POV在resizeGL()中向正z轴遍历,所有的布料顶点在XYZ中在0和1之间变化,而背景位于:

(0.0, 0.0, -1.0), (1.0, 0.0, -1.0), (1.0, 1.0, -1.0), (-1.0 1.0 0.0 f, f, f)。

所以布料对象总是位于背景平面和POV之间。我是不是在截锥体设置中漏掉了什么?我只是简单地设置了与ortho相同的方式…

编辑:

抱歉没有提到;我使用的矩阵是QMatrix4x4类型:平截头体

这些函数将当前矩阵与您定义为参数的矩阵相乘,这应该产生与我定义视图矩阵相同的结果,例如,然后定义我的着色器统一"mvp_matrix"作为投影*视图,如果我没有弄错的话。也许像lookAt这样的东西会起作用;我还是多玩玩吧。:)

您需要使用透视图投影来实现期望的结果。这里有使用glm创建透视图投影矩阵的示例代码。

不需要移动顶点,因为您将在模型矩阵中应用旋转获得适当的位置。

编辑:在你的代码中,我可以看到.frustum。翻译方法或从库投影对象是什么?它看起来不像你在做投影*视图通过移动截锥矩阵。关于标准矩阵角色的一些信息。

考虑调试如果你得到屏幕黑色而不是GL_COLOR_BUFFER_BIT颜色问题不是矩阵,而是更早。此外,我建议console.log您的视角矩阵并将其与正确的矩阵进行比较(您可以在glm库中获得例如)。

最新更新