如何使用OpenGL知道所有顶点的当前坐标

Posted

技术标签:

【中文标题】如何使用OpenGL知道所有顶点的当前坐标【英文标题】:how to know the current coordinates of all vertices using OpenGL 【发布时间】:2019-10-21 08:17:24 【问题描述】:

我正在使用 Visual C++ 和 OpenGL 编写程序。首先,该程序加载一个 .obj 文件(例如一个立方体),然后将该对象旋转到任意角度。

旋转后,我想知道这个物体所有顶点的新坐标(x,y,z)。

如何使用 OpenGL 做到这一点?

我只想创建一个新的 .obj 文件,但所有顶点都有新值。

新的 .obj 文件最初必须显示相同的对象,但具有该旋转。

编辑: 此时,我可以加载 .obj 文件,然后毫无问题地旋转该对象。到目前为止,一切都很完美。但是我不知道如何读取旋转后所有顶点到达的新坐标。

【问题讨论】:

嗨,奥斯卡。如果您展示您正在使用的数据、您迄今为止尝试过的解决方案,然后确定该解决方案不起作用的原因,您将获得更多帮助。例如。 “这是我的数据,当我尝试这种转换时,只有 x 和 y 顶点被旋转” 嗨,汤姆,非常感谢您的评论。此时,我可以加载 .obj 文件,然后毫无问题地旋转该对象。到目前为止,一切都很完美。但是我不知道如何读取旋转后所有顶点到达的新坐标。 作为渲染旋转立方体的一部分,您的程序必须设置转换矩阵。弄清楚如何从当前代码中提取此矩阵并将其应用于每个顶点。 【参考方案1】:

所以你有一个与你的立方体相关联的模型矩阵。当您旋转模型矩阵时,您的立方体方向会发生变化,但您会注意到这对立方体顶点位置没有影响。获得这些新旋转顶点的一种简单方法是遍历所有顶点,将模型矩阵与每个位置相乘:

for (int i = 0; i < vertices.size(); i++)

    // first convert each vertex position to a vec4 to allow for matrix multiplication
    vec4 pos(vertices.at(i).Position, 1.0f);
    // multiply vec4 vertex by the model matrix (mul. order is important)
    vec4 modelPos = model * pos;
    // convert back to a vec3
    vec3 newPos(modelPos[0], modelPos[1], modelPos[2]);
    // store it in a new vector
    updatedVertices.at(i).Position = newPos; 


【讨论】:

以上是关于如何使用OpenGL知道所有顶点的当前坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何使用屏幕坐标绘制 OpenGL 图元(GL_POINT、GL_LINE 等)?

OpenGL的工作流程

OpenGL |在 UV 坐标处渲染顶点

如何在OpenGL中的对象空间坐标中获得近剪裁平面坐标

opengl 矩阵问题

OPENGL矩阵顺序与调用顺序相反