有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在OpenGL中围绕点旋转直线

我试图绕一个不是(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) 个答案

  1. # 1 楼答案

    通常,你可以通过转换为(0,0),围绕(0,0)旋转,然后再转换回来。因此,这是一个三步过程:

    1. 从你的分数中减去
    2. 用三角法绕(0,0)旋转。(我假设你已经知道怎么做了,或者你可以查一下。)
    3. 再把(你,你)加回到你的观点上

    就你而言,我认为你的代码已经基本正确了。你缺少的是直线长度的乘法。使用距离公式计算(xOne,yOne)和(xTwo,yTwo)之间的距离,并将该距离乘以正弦和余弦值,然后再将xOne和yOne相加

  2. # 2 楼答案

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

    转换涉及一个系统如何以两种不同的方式表示。所以一个位于(3,4)的点可以转化为一个位于(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中旋转,首先要将所有点变换为一个新原点,即旋转原点。然后围绕原点旋转。然后将所有点从新原点转换回旧原点

    就像詹姆斯在上面说的,我只是用了更多的词