You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中保持初始位置缩放矩形的实现疑问

OpenGL中保持初始位置缩放矩形的实现疑问

嗨,我来帮你搞定这个缩放后矩形跑偏的问题~

你现在遇到的问题很典型:直接对顶点做缩放变换时,默认是围绕坐标原点(0,0)进行的,但你的矩形中心不在原点,所以缩放后整个矩形会朝着原点移动,自然就偏离了原来的位置。要让矩形在原地缩放,得用「平移-缩放-平移」的组合变换,步骤如下:

  • 先算出你这个矩形的中心坐标
  • 把所有顶点平移,让矩形中心移动到原点(相当于把每个顶点的坐标减去中心坐标)
  • 对平移后的顶点执行缩放操作
  • 再把缩放后的顶点平移回原来的中心位置(把每个顶点的坐标加上中心坐标)

修正后的代码实现

我帮你调整了scaling函数,按照上面的步骤来实现:

def scaling(sc):
    # 1. 计算矩形的中心坐标
    x_center = (325 + 460) / 2
    y_center = (320 + 150) / 2

    # 定义平移到原点的矩阵:把每个点减去中心坐标
    translate_to_origin = np.array([
        [1, 0, -x_center],
        [0, 1, -y_center],
        [0, 0, 1]
    ])
    # 定义缩放矩阵
    scale_matrix = np.array([
        [sc, 0, 0],
        [0, sc, 0],
        [0, 0, 1]
    ])
    # 定义平移回原中心的矩阵:把每个点加上中心坐标
    translate_back = np.array([
        [1, 0, x_center],
        [0, 1, y_center],
        [0, 0, 1]
    ])

    # 组合变换矩阵:平移回中心 → 缩放 → 平移到原点(矩阵乘法顺序要注意,从右往左执行)
    transform_matrix = np.matmul(translate_back, np.matmul(scale_matrix, translate_to_origin))

    # 原始顶点
    v1 = np.array([[325], [320], [1]])
    v2 = np.array([[460], [320], [1]])
    v3 = np.array([[460], [150], [1]])
    v4 = np.array([[325], [150], [1]])

    # 应用组合变换
    v11 = np.matmul(transform_matrix, v1)
    v22 = np.matmul(transform_matrix, v2)
    v33 = np.matmul(transform_matrix, v3)
    v44 = np.matmul(transform_matrix, v4)

    glColor3f(1.5, 0.17, 0)
    glBegin(GL_QUADS)
    glVertex2f(v11[0][0], v11[1][0])
    glVertex2f(v22[0][0], v22[1][0])
    glVertex2f(v33[0][0], v33[1][0])
    glVertex2f(v44[0][0], v44[1][0])
    glEnd()

关键说明

  • 矩阵乘法的顺序很重要:OpenGL里的变换是从右到左执行的,所以我们的组合矩阵是平移回中心 × 缩放 × 平移到原点,对应实际执行顺序是先把矩形移到原点,再缩放,最后移回原位置。
  • 如果你之后需要修改矩形的顶点,只需要重新计算中心坐标就行,不用改变换逻辑,通用性更强。

这样修改后,你调用scaling函数时,矩形就会围绕自己的中心缩放,保持在原来的位置啦~

备注:内容来源于stack exchange,提问作者Anonymous Stranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:09:40