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

如何使用Java配合OpenGL实现图片围绕偏离中心的锚点旋转

问题原因与解决方案

你当前的代码逻辑是将图片中心对齐到(x,y)坐标后围绕该点旋转,要改为围绕自定义锚点(头部位置)旋转,只需调整矩阵变换顺序,额外叠加锚点偏移的变换即可。你修改偏移后图片不渲染通常是两种原因:一是偏移值过大将图片移出了视口可见范围,二是变换后没有正确逆复位导致后续矩阵状态错乱。

具体修改步骤

  1. 先测量你要设置的旋转锚点(头部)相对于当前图片中心的偏移值:
    • 你当前的图片顶点是从(-width/2, -height/2)到(width/2, height/2),默认中心为坐标原点
    • 假设头部在原点的左上方(-20, 30)位置,你可以先取小值测试,再微调得到准确偏移
  2. 调整变换逻辑,正确的自定义锚点旋转变换顺序为:
    • 平移到目标绘制坐标(x,y)
    • 平移锚点偏移量,将锚点对齐到当前原点
    • 执行旋转
    • 回移抵消锚点偏移,恢复图片自身的坐标体系
  3. 逆变换还原矩阵时要按相反顺序操作,避免矩阵状态污染

修改后的代码示例

// 新增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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:18:04