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
相关产品推荐
相关产品推荐

