2011-12-19 4 views
1

openTk를 사용하여 첫 번째 프로젝트를 진행하고 있습니다. 저는 3D 모델 회전을위한 가상의 arcball을 만들고 있습니다. 잘 작동하지만 모델과 함께 회전하지 않는 원을 추가해야합니다. 이 원은 arcball을 시각화해야합니다. 회전을 달성하기 위해 내 코드는 다음과 같습니다OpenTK 원 회전

private void SetCamera() 
{ 
    GL.MatrixMode(MatrixMode.Modelview); 
    Matrix4 scale = Matrix4.Scale(magnification/diameter); 
    Matrix4 translation1 = Matrix4.CreateTranslation(-center); 
    Matrix4 rotation = Matrix4.CreateFromAxisAngle(axisOfRotation, angleOfRotation*(float)numericSensitivity.Value); 
    Matrix4 translation2 = Matrix4.CreateTranslation(0.0f, 0.0f, -1.5f); 
    if (rotationChanged) 
    { 
     oldRotation *= rotation; 
     rotationChanged = false; 
    } 
    modelview = translation1 * scale * oldRotation * translation2; 
    GL.LoadMatrix(ref modelview); 
} 

그래서 나는이 rotattion 영향을받지 줘야 원을 그리는 방법을 몇 가지 방법이 있는지 묻고 싶다 (화면에 같은 위치에있을 것입니다).

+0

그들이 과거에 해왔 던 방식으로 ... 일반 Projecton 행렬을 사용하여 모든 3D 물건을 렌더링 한 다음 "2D 행렬"로 바꾸고 나머지 UI를 렌더링해야합니다 – mpen

답변

0

질문을 올바르게 이해했다면 원을 그리기 전에 modelview 행렬을 ID로 다시 설정하면됩니다. PushMatrix() 및 PopMatrix() 함수를 사용하면 쉽게 할 수 있습니다. 이런 일 :

//Draw normal things 

GL.MatrixMode(MatrixMode.Modelview); 
GL.PushMatrix(); 
GL.LoadIdentity(); 

//Draw un-rotated circle 

GL.PopMatrix(); 

PushMatrix()는 스택 상에 현재의 행렬을 저장하고, PopMatrix()는 그 스택 오프 상단 매트릭스 나옵니다. 즉, 원을 다 마친 후에 PopMatrix()가 회전 된 참조 프레임으로 돌아갑니다.