如何使用Java配合OpenGL实现图片围绕偏离中心的锚点旋转
问题原因与解决方案
你当前的代码逻辑是将图片中心对齐到(x,y)坐标后围绕该点旋转,要改为围绕自定义锚点(头部位置)旋转,只需调整矩阵变换顺序,额外叠加锚点偏移的变换即可。你修改偏移后图片不渲染通常是两种原因:一是偏移值过大将图片移出了视口可见范围,二是变换后没有正确逆复位导致后续矩阵状态错乱。
具体修改步骤
- 先测量你要设置的旋转锚点(头部)相对于当前图片中心的偏移值:
- 你当前的图片顶点是从
(-width/2, -height/2)到(width/2, height/2),默认中心为坐标原点 - 假设头部在原点的左上方
(-20, 30)位置,你可以先取小值测试,再微调得到准确偏移
- 你当前的图片顶点是从
- 调整变换逻辑,正确的自定义锚点旋转变换顺序为:
- 平移到目标绘制坐标
(x,y) - 平移锚点偏移量,将锚点对齐到当前原点
- 执行旋转
- 回移抵消锚点偏移,恢复图片自身的坐标体系
- 平移到目标绘制坐标
- 逆变换还原矩阵时要按相反顺序操作,避免矩阵状态污染
修改后的代码示例
// 新增anchorOffsetX、anchorOffsetY两个参数,传入你测得的头部相对于图片中心的偏移 public static void drawImage(ImageResource image, float x, float y, float width, float height, float anchorOffsetX, float anchorOffsetY) { GL2 gl = EventListener.gl; Texture texture = image.getTexture(); if(texture != null) { gl.glBindTexture(GL2.GL_TEXTURE_2D, texture.getTextureObject()); } // 1. 平移到目标绘制位置 gl.glTranslatef(x, y, 0); // 2. 平移锚点偏移,让锚点对齐到当前原点,后续旋转就会围绕该点执行 gl.glTranslatef(anchorOffsetX, anchorOffsetY, 0); // 3. 执行旋转 gl.glRotatef(rotation, 0, 0, 1); // 4. 回移抵消锚点偏移,恢复图片自身坐标 gl.glTranslatef(-anchorOffsetX, -anchorOffsetY, 0); gl.glColor4f(red, green, blue, alpha); gl.glBegin(GL2.GL_QUADS); gl.glTexCoord2f(0, 1); gl.glVertex2f(-width / 2, -height / 2); gl.glTexCoord2f(1, 1); gl.glVertex2f(width / 2, -height / 2); gl.glTexCoord2f(1, 0); gl.glVertex2f(width / 2, height / 2); gl.glTexCoord2f(0, 0); gl.glVertex2f(-width / 2, height / 2); gl.glEnd(); gl.glFlush(); gl.glBindTexture(GL2.GL_TEXTURE_2D, 0); // 逆变换要按相反顺序执行,还原矩阵状态 gl.glTranslatef(anchorOffsetX, anchorOffsetY, 0); gl.glRotatef(-rotation, 0, 0, 1); gl.glTranslatef(-anchorOffsetX, -anchorOffsetY, 0); gl.glTranslatef(-x, -y, 0); }
如果不想新增参数,也可以直接把锚点偏移值写死在代码里微调,直到旋转中心对齐到头部位置即可。
内容的提问来源于stack exchange,提问作者IcyRelic
相关产品推荐
相关产品推荐

