现代 OpenGL:如何获得立方体的矢量位置?

Posted

技术标签:

【中文标题】现代 OpenGL:如何获得立方体的矢量位置?【英文标题】:Modern OpenGL: How to get the vector position of the cube? 【发布时间】:2019-11-10 08:46:18 【问题描述】:
glm::mat4 yellow_bone_obj_mat = m_bone_animation->get_yellow_mat();
glUniformMatrix4fv(glGetUniformLocation(shader.program, "model"), 1, GL_FALSE, glm::value_ptr(yellow_bone_obj_mat));
bone_obj->obj_color = m_bone_animation->colors[1];
draw_object(shader, *bone_obj);

我使用这段代码创建了一个立方体。

glm::vec3 scale = glm::vec3(1.f, 1.f, 1.f);
m_yellow_mat = glm::mat4(1.0f);
m_yellow_mat = glm::scale(m_yellow_mat, scale);

glm::vec3 pivot = glm::vec3(0.0f, 2.f, 0.0f);

glm::vec3 pos = root_position;

m_yellow_mat = glm::translate(m_yellow_mat, pos);
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angleZ), glm::vec3(0, 0, 1));
m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angleY), glm::vec3(0, 1, 0));

m_yellow_mat = glm::rotate(m_yellow_mat, glm::radians(angleX), glm::vec3(1, 0, 0));


m_yellow_mat = glm::translate(m_yellow_mat, pivot);

m_yellow_mat = glm::scale(m_yellow_mat, scale_vector[1]);

// scale_vector[1] = 0.5f,4.f,0.5f  This is scale_vector[1]
//  root_position =  2.0f,1.0f,2.0f ;

这些是我应用的转换。 这使它能够围绕立方体的端点(底部)旋转。我想找到立方体(顶部)起点的矢量位置。我该怎么做?

【问题讨论】:

【参考方案1】:

一个 4x4 的变换矩阵如下所示:

column 0: Xx, Xy, Xz, 0
column 1: Yx, Xy, Yz, 0
column 2: Zx  Zy  Zz, 0
column 3: Tx, Ty, Tz, 1

翻译存储在列主阶矩阵的第 4 列。

也就是说翻译的xyz分量是m_yellow_mat[3][0]m_yellow_mat[3][1]m_yellow_mat[3][2]

glm::vec3 trans = glm::vec3(m_yellow_mat[3]);

如果你想知道模型某个顶点坐标的世界位置,那么你必须通过模型矩阵来转换模型坐标:

glm::vec3 vertex_corodiante;
glm::vec3 world_coordiante = glm::vec3(m_yellow_mat * glm::vec4(vertex_corodiante, 1.0f));

【讨论】:

以上是关于现代 OpenGL:如何获得立方体的矢量位置?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中立方体的位置

在opengl es android中的随机位置绘制多个立方体

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

立方体侧面的纹理与opengl

带有立方体贴图的 OpenGL 点光阴影映射

在 3D 中查找 X、Y 和 Z 轴的角度 - OpenGL/C++