2017-01-20 3 views
1

(0,0)이 아닌 점을 중심으로 선을 회전하려고합니다.OpenGL의 한 점을 중심으로 선 회선

이 프로그램에서는 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)는 당신이 번역하여이 작업을 수행 할 것 고정 점 보통

답변

1

이다 (0,0), 주위 회전 (0,0) , 그리고 다시 번역. 따라서 3 단계 프로세스입니다.

  1. 포인트에서 (xOne, yOne)을 뺍니다.
  2. 삼각법을 사용하여 (0,0) 주위를 회전합니다. (나는 당신이 이미 이것을하는 방법을 알고 있다고 가정하고 있거나 그것을 볼 수 있습니다.)
  3. 포인트를 다시 (xOne, yOne) 추가하십시오.

귀하의 경우 귀하의 코드가 이미 거의 정확하다고 생각됩니다. 당신이 누락 된 것은 라인의 길이에 의한 곱셈입니다. 거리 공식을 사용하여 (xOne, yOne)과 (xTwo, yTwo) 사이의 거리를 찾고 xOne 및 yOne을 추가하기 전에 사인 값과 코사인 값을 곱합니다.

+0

죄송합니다. 그 내용을 이해하지 못했습니다. – kimchiboy03

+0

@ kimchiboy03 그건별로 유익하지 않습니다. 도움을 얻으려면 정확하게 이해하지 못하는 것을 알려주십시오. – HolyBlackCat

+0

@ kimchiboy03 나는 당신의 질문에 대답했다. 그러나 나는 당신의 코드를 고치는 것을 선호했을 것 같은 느낌이 들었다. 나는 당신에게 그 제안을하기 위해 나의 대답을 수정했다. –

0

OpenGL에서 효과적으로 작업하려면 변환 이해가 필요합니다.

변형은 하나의 시스템을 두 가지 방식으로 표현할 수있는 방법을 다룹니다. 그래서 (3,4)에있는 점은 원점이 (3,4)에있는 "대체 우주"에서 (0,0)에있는 점으로 변형 될 수 있습니다. 점 주위에 회전

는 기본적으로

(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))) 

처럼 정말 쉽게 반전 할 수있는 공식이다, 아주 쉽게이다 origi 주위에 라디안으로 회전 된 점에 대해 새 x '와 y'를줍니다. 엔.

OpenGL에서 회전하려면 먼저 모든 원점을 회전 원점 인 새로운 원점으로 변환해야합니다. 그런 다음 그 원점을 중심으로 회전합니다. 그런 다음 모든 점을 새로운 원점에서 이전 원점으로 다시 변환합니다.

제임스가 위에서 말했듯이, 나는 더 많은 단어를 사용하고 있습니다.

+0

제안 해 주셔서 감사합니다. – kimchiboy03

관련 문제