我正在尝试为车辆跟踪创建增强现实应用程序。在应用程序中,我想放置一个四边形模型来跟踪车辆。为此,每次更新纹理时,我都会在特定屏幕坐标处绘制一个四边形。问题是,我无法将四边形模型放置在纹理上的确切位置。
下图显示了我到底想要什么
如上图所示,需要将绿色四边形准确放置在车辆后方。
我已经通过以下方式做到了,
视口大小(0、0、1280、720)
- 渲染纹理
- 创建大小为 1280x720 的纹理并使用默认 modelViewProjection(相同矩阵)渲染
GLfloat vVertices[] = { -1.f, 1.f, 0.0f, // Position 0 0.0f, 0.0f, // TexCoord 0 -1.f, -1.f, 0.0f, // Position 1 0.0f, 1.0f, // TexCoord 1 1.f, -1.f, 0.0f, // Position 2 1.0f, 1.0f, // TexCoord 2 1.f, 1.f, 0.0f, // Position 3 1.0f, 0.0f // TexCoord 3 }; GLushort indices[] = { 0, 1, 2, 0, 2, 3 };```
在 3D 世界中绘制四边形
- 我使用了以下模型视图投影
m_unWidth= 1280 m_unHeight = 720 float aspect = (float) m_unWidth / (float) m_unHeight; Mperspective = glm::mat4( 1.0f ); Mperspective = glm::perspective( glm::radians(45.0f), aspect, 0.1f, 100.0f ); Mview = glm::mat4(1.0f); Mview = glm::translate( Mview, glm::vec3(0.0f, 0.0f, -2.0f)); glm::mat4 Mmodel = glm::mat4(1.0f); Mmodel = glm::translate( Mmodel, glm::vec3( POSITION.X, POSITION.Y, 0.0 )); Mmodel = glm::rotate( Mmodel, glm::radians(-80.0f), glm::vec3( 1.0f, 0.0f, 0.0f ));
我已经使用坐标转换函数映射到[-1,1]。
NDCPoint ACCOverlay::ConvertToNDC( unsigned int unX_i, unsigned int unY_i ) {
const int width = m_unWidth;
const int height = m_unHeight;
float x = float(unX_i) * 2 / float(width) - 1;
float y = 1 - float(unY_i) * 2 / float(height);
NDCPoint point;
point.x = x;
point.y = y;
point.z = 1.0f;
return point;
}
您能否解释一下如何在透视投影中将四边形模型映射到纹理的正确位置。