如何在其位置缩放矩形

Posted

技术标签:

【中文标题】如何在其位置缩放矩形【英文标题】:How to scale a rectangle at its position 【发布时间】:2020-04-30 11:09:56 【问题描述】:

我正在绘制一个矩形,当我缩放它时,矩形开始向屏幕中心移动。

float vertices[] = 
         10.0f,  5.5f, 1.0f, 0.0 , 0.0,  // top right
         10.0f, 0.0f, 1.0f, 0.0 , 0.0,  // bottom right
         5.0f, 0.0f, 1.0f, 0.0 , 0.0,  // bottom left
         5.0f, 5.5f, 1.0f , 0.0 , 0.0  // top left 
    ;

    unsigned int indices[] =   // note that we start from 0!
        0, 1, 3,  // first Triangle
        1, 2, 3   // second Triangle
    ;

绘图函数的代码。

    glm::mat4 model = glm::mat4(1.0f);      
    glm::mat4 view = camera1.GetViewMatrix();
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
   shader.setMat4("model", model);
   model = glm::scale(model, glm::vec3(0.2f, 0.2f, 0.2f));
   shader.setMat4("model", model);
   glBindVertexArray(VAO);
   glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
   glBindVertexArray(0);

顶点着色器中的矩阵乘法

gl_Position =   projection * view * model * vec4(aPos , 1.0 );

如何在不向中心移动的情况下缩放我的矩形?

我尝试先将对象居中,然后再应用变换。

model = glm::translate(model, glm::vec3(-7.75, 0.0, 0.0));
        model = glm::scale(model, glm::vec3(0.2f, 0.2f, 0.2f));
        model = glm::translate(model, glm::vec3(7.75, 0.0, 0.0));
        shader.setMat4("model", model);
        glBindVertexArray(VAO);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glBindVertexArray(0);

【问题讨论】:

【参考方案1】:

这似乎是正确的行为。对于您想要的,您需要首先将您的对象完美地居中于原点 (0,0,0)。您的模型转换必须按此顺序应用,首先将其居中于原点,缩放和旋转首先围绕该原点发生,然后平移它。本质上,这些是您想要对对象执行的转换步骤的顺序(对象空间,也称为模型转换)。

【讨论】:

我已经尝试了你提到的方式并更新了代码,但它仍然从它的位置移动。 您只将形状的 X 轴居中。为了让它按照你想要的方式运行,你想让你的对象完全居中,所以三角形的中心必须在 0,0,0。所以你需要在 y 中翻译 -2.75,在 z 中翻译 -0.5。

以上是关于如何在其位置缩放矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持圆周围位置的同时缩放多边形

如何将矩形添加到缩放的画布区域?

如何从iText 7中的PDF格式的轮廓/书签访问矩形,拟合类型,缩放,页码

如何根据 CGSize 更改缩放 CGPoint?

java drawImage 如何实现旋转和缩放

C ++ Opencv重新缩放边界矩形