OpenGL - 将变换应用于 3D 空间中的多边形

Posted

技术标签:

【中文标题】OpenGL - 将变换应用于 3D 空间中的多边形【英文标题】:OpenGL - Apply transformation to polygon in 3D space 【发布时间】:2018-05-09 19:14:55 【问题描述】:

我正在尝试在 3D 空间中旋转四边形。以下代码显示了用于绘制四边形的顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;

out vec3 ourColor;

uniform mat4 transform;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()

    gl_Position = transform*(projection*view*model*vec4(aPos, 1.0f));
    ourColor = aColor;

transform不乘以projection*view*model*vec4(aPos,1.0f)时显示四边形,但如上相乘时不显示。 转换代码:

trans=glm::rotate(trans,(float)(glfwGetTime()),glm::vec3(0.0,0.0,1.0));
float scaleAmount = sin(j*0.3);j=j+0.035;
trans=glm::scale(trans,glm::vec3(scaleAmount,scaleAmount,scaleAmount));
unsigned int transformLoc = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

我也在顶点着色器中设置了统一。为什么当我将 transform(projection*view*model*vec4(aPos,1.0f)) 相乘时它不旋转和缩放,甚至不出现? 编辑:我发现问题在于缩放,因为代码仅适用于旋转。该代码不适用于仅缩放。

【问题讨论】:

试试gl_Position = projection * view * transform * model * vec4(aPos,1.0f) @Ripi2 不起作用。 你了解“转换”吗?如果没有,请查看this。 @Rabbid76 第一条评论。另外,我发现问题与缩放有关。 我明白了!我将j 变量初始化为整数。因此,对于缩放功能,j=j+0.035 始终为 0。因此,四边形没有出现。抱歉给您带来了麻烦,感谢您的帮助。 【参考方案1】:

让我们只考虑二维。

四边形在“世界”坐标中定义。要围绕某个点旋转它将四边形移动到该点,然后旋转和缩放它,然后将其移回。

使用矩阵执行此操作与 transform * model 相同,其中 transform 类似于

transform = moveback * scale * rotate * movetopoint

【讨论】:

我试过了。我注意到该代码仅适用于旋转而不适用于仅缩放。它与四边形的缩放有关。【参考方案2】:

如果scaleAmount == 0.0:

glm::mat4 trans( 1.0f );
float scaleAmount = 0.0f;
trans=glm::scale(trans,glm::vec3(scaleAmount,scaleAmount,scaleAmount));

那么这将导致trans

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1

由于sin(0.0) == 0.0 必须确保在sin(j*0.3); 的情况下j 不等于0.0。

【讨论】:

是的,就是这样。我已将 j 初始化为整数。所以 j+0.035,没有区别,j 仍然是 0。

以上是关于OpenGL - 将变换应用于 3D 空间中的多边形的主要内容,如果未能解决你的问题,请参考以下文章

✠OpenGL-3-数学基础

OpenGL里的坐标系统以及其变换

OpenGL 六 - 3D数学基础 - 向量矩阵及OpenGL中的变换

使用 C++ 在 OpenGL 中移动自动旋转的 3d 多边形

OpenGL学习脚印: 视变换(view transformation)

OpenGL 鼠标在 3D 空间中的位置