在OpenGL中围绕一个点旋转一条线

时间:2017-01-20 21:11:20

标签: java opengl trigonometry

我试图围绕一个不是(0,0)的点旋转一条线。

对于这个程序,我试图不使用glRotatef()并尝试使用三角函数。但是,线的长度总是会改变。

有什么建议吗?

这是我的代码:

public class World implements GLEventListener, KeyListener
{
    double xOne = 0.1;
    double yOne = 0.1;
    double xTwo = 0;
    double yTwo = 0.01;

    double i = 220.987;

    public World()
    {

    }

    public void init(GLAutoDrawable gld)
    {
        Animator theAnimator = new Animator(gld);
        theAnimator.start();
    }

    public void display(GLAutoDrawable gld)
    {
       GL gl = gld.getGL();
       gl.glEnable(gl.GL_BLEND);
       gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

       gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

       gl.glBegin(gl.GL_LINES);
        gl.glColor3d(1,0,0);
        gl.glVertex2d(xOne ,yOne);
        gl.glColor3d(0,0,1);
        gl.glVertex2d(xTwo, yTwo);
       gl.glEnd();

       gl.glFlush();
       //UPDATE
    }

    public void reshape(GLAutoDrawable gLAutoDrawable, int _int, int _int2, int _int3, int _int4) 
    {

    }

    public void displayChanged(GLAutoDrawable gLAutoDrawable, boolean _boolean, boolean _boolean2)
    {

    }

    public void keyTyped(KeyEvent ke)
    {

    }

    public void keyPressed(KeyEvent ke)
    {
        if(ke.getKeyCode() == KeyEvent.VK_SPACE)
        {
            xTwo = (Math.cos(Math.toRadians(i))+xOne);
            yTwo = (Math.sin(Math.toRadians(i))+yOne);
            i++;
        }
    }

    public void keyReleased(KeyEvent ke)
    {

    }
}

顺便说一句,(xOne, yOne)是固定点

2 个答案:

答案 0 :(得分:1)

通常你可以通过转换为(0,0),转动(0,0)并平移回来来做到这一点。所以这是一个分为三步的过程:

  1. 从您的积分中减去(xOne,yOne)。
  2. 使用三角法绕(0,0)旋转。 (我假设你已经知道如何做到这一点,或者你可以查一查。)
  3. 再次将(xOne,yOne)添加回您的积分。
  4. 在您的情况下,我认为您的代码几乎已经正确。你缺少的是乘以线的长度。使用距离公式查找(xOne,yOne)和(xTwo,yTwo)之间的距离,并在添加xOne和yOne之前将该距离乘以正弦和余弦值。

答案 1 :(得分:0)

了解转换是在OpenGL中有效工作的必要条件。

转换处理一个系统如何以两种不同的方式表示。因此,(3,4)处的一个点可以转换为一个在(#0)交替的宇宙中的点(0,0)"原点在(3,4)。

围绕一个点旋转非常容易,它基本上就是公式

(x', y') = (x-a, y-a) (where x's is the "new x" and x is the "old" x)

同样,这可以很容易地逆转

(x, y) = (x'+a, y'+a)

旋转变换看起来像

(x', y') = ((x*cos(a) + y*sin(a)), (-x*sin(a)+y*cos(a)))

给你一个新的x'和y'对于在原点周围旋转一个弧度的点。

因此,要在OpenGL中旋转,首先要将所有点转换为具有新原点(旋转原点)。然后围绕该原点旋转。然后,将所有点从新原点转换回旧原点。

就像詹姆斯上面说的那样,我只是在用更多的词语。