Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL-将变换应用于三维空间中的多边形_C++_Opengl_Transformation_Glm Math - Fatal编程技术网

C++ OpenGL-将变换应用于三维空间中的多边形

C++ OpenGL-将变换应用于三维空间中的多边形,c++,opengl,transformation,glm-math,C++,Opengl,Transformation,Glm Math,我正在尝试在三维空间中旋转四边形。以下代码显示用于绘制四边形的顶点着色器: #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(

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

#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;
}
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)
相乘时,将显示该四元组,但如上所述相乘时,不会显示该四元组。

转换代码:

#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;
}
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);

我还设置了顶点着色器中存在的一致性。
为什么它不旋转和缩放,或者甚至在我使用
乘以
时出现(投影*视图*模型*向量4(aPos,1.0f))

编辑:我发现问题在于缩放,因为代码只适用于旋转。该代码不能仅用于缩放。

让我们只考虑2D。 四边形在“世界”坐标中定义。若要围绕某个点旋转,请将四边形移动到该点,然后旋转并缩放它,然后将其向后移动 使用矩阵执行此操作与
transform*model
相同,其中
transform
类似

transform = moveback * scale * rotate * movetopoint

如果
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。

试试
gl\u Position=projection*view*transform*model*vec4(aPos,1.0f)
@Ripi2不起作用。你懂“transformations”吗?如果没有,请看第一条评论。另外,我发现问题与缩放有关。我知道了!我将
j
变量初始化为整数。因此,对于比例函数,
j=j+0.035
始终为0。因此,quad没有出现。我为所有的麻烦感到抱歉,并感谢您的帮助。我试过了。我注意到该代码只适用于旋转,而不适用于缩放。这和四方形的缩放有关。是的,就是这样。我已将j初始化为整数。所以j+0.035,没有什么区别,j仍然是0。