c++ - 在纹理图像上渲染四边形模型
问题描述
我正在尝试为车辆跟踪创建增强现实应用程序。在应用程序中,我想放置一个四边形模型来跟踪车辆。为此,每次更新纹理时,我都会在特定屏幕坐标处绘制一个四边形。问题是,我无法将四边形模型放置在纹理上的确切位置。
下图显示了我到底想要什么
如上图所示,需要将绿色四边形准确放置在车辆后方。
我已经通过以下方式做到了,
视口大小(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;
}
您能否解释一下如何在透视投影中将四边形模型映射到纹理的正确位置。
解决方案
推荐阅读
- mongodb - 在 Mongo-go-driver 中创建一个独特的字段
- python-3.x - Spacy 相似性警告:“基于空向量评估 Doc.similarity。”
- hive - HiveAccessControlException 权限被拒绝:用户没有 [ALL] 权限
- gnuplot - Gnuplot 整数溢出
- java - 忽略 JSON 到 XML 转换中的键
- java - 在具有命名空间的 Java 中针对模式的 XML 验证失败
- tfs - 我应该将自定义构建步骤放在 MSBuild 还是 TFS/Azure DevOps 构建管道中?
- android - 为什么来自 PWA 的 web apk 没有 Internet 权限?
- python - 如何确定客户端是否在 tkinter 消息框中选择了“ok”?
- python-3.x - 如何在 Python 中使用“尝试写入小于 Content-Length 的 x 字节”来修复龙卷风错误