2012-02-02 2 views
2

나는 중심점을 중심으로 삼각형을 회전하려고합니다. 중간 점을 원점으로 변환 한 다음 회전하고 뒤쪽으로 번역해야하므로 OpenGL이 원점을 중심으로 회전한다는 것을 알고 있습니다. 나는 그것이 최소한 원점의 중심을 중심으로 회전하도록이 마지막 줄을 주석 처리했습니다. 그렇지 않습니다. 번역에도 불구하고 오래된 원점을 중심으로 회전하는 것처럼 보입니다 ... ccc4와 ccp는 수레를 생성합니다. 여기OpenGL에서 트라이앵글 회전

ccColor4B colors[] = { 
    ccc4(255, 0, 0, 255), 
    ccc4(0, 255, 0, 255), 
    ccc4(0, 0, 255, 255) 
}; 

CGPoint vertices[] = { 
    ccp(0,0), 
    ccp(50,100), 
    ccp(100,0), 
}; 

CGPoint middle[] = {ccp(50,50)}; 
CGPoint origin[] = {ccp(0,0)}; 

// Rotate the triangle 
glPushMatrix(); 
glTranslatef(-50, -50, 0); 
glRotatef(45, 0, 0, 1.0); 
// glTranslatef(50, 50, 0); 

// Draw the triangle 
glLineWidth(2); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors); 
glColor4ub(0, 0, 255, 255); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

// Revert rotation, we only want triangle to rotate 
glPopMatrix(); 

// Draw the points 
glDisableClientState(GL_COLOR_ARRAY); 

glPointSize(5); 
glColor4ub(255, 255, 255, 255); 
glVertexPointer(2, GL_FLOAT, 0, middle); 
glDrawArrays(GL_POINTS, 0, 1); 

glPointSize(5); 
glColor4ub(0, 255, 0, 255); 
glVertexPointer(2, GL_FLOAT, 0, origin); 
glDrawArrays(GL_POINTS, 0, 1); 

glEnableClientState(GL_COLOR_ARRAY); 
// End points 

를 출력입니다 : 여기 내 코드는

1 2

+0

이제 삼각형이 눈에 띄지 않게되었습니다. 나는 equilateral의 중심점에 대해 sqrt (3)/6을 계속 유지합니다 ... –

+0

증명에 대한 링크가 있습니까? –

+0

@AramKocharyan : 미안하지만, 내가 너에게 부랑자를 줬어. 그것은 삼각형의 높이입니다. 중심은 아닙니다. Vyktor의 설명에 따라 y 축에서 단지 1/3 인 중심입니다. –

답변

6

당신은 당신이 그들을 호출하는 순서에 반대 상대에 적용되는 것으로 변환을 생각해야합니다.

사실, 당신이 정신적으로 그들이이라고하고 순서대로 변환을 적용 할 수 있습니다 로컬 좌표 시스템 (LCS)가 아닌 객체를 변환의 관점에서 생각하는 것이 더 쉽습니다. 중앙을 중심으로 회전하려면 LCS를 가운데로 회전하고 회전 한 다음 다시 번역하십시오.

glTranslatef(50, 50, 0); 
glRotatef(45, 0, 0, 1); 
glTranslatef(-50, -50, 0); 
+0

건배! 나는 그 사고 방식으로 생각하는 것을 기억할 것입니다. 지금은 의미가 있습니다. LCS를 그리는 것은 추후 무승부 또한이 LCS를 의미합니다. –

+0

@AramKocharyan : 맞습니다. 또한 나중에 * 변환 *이 LCS 인 것을 의미합니다. 예를 들어, ID 변환으로 시작한 다음'glScale (20, 20, 20)'다음에'glRotate (45, 0, 0, 1)'을 호출한다고 상상해보십시오. 'glTranslate (1, 0, 0)'을 호출하면, LCS는 세계에 대해 오른쪽으로 대각선 방향으로 20 단위 이동합니다. –

+0

감사합니다. Marcelo 예제 역시 의미가 있습니다. –

관련 문제