Вращение круга OpenTK

Я работаю над своим первым проектом, используя openTk. Я создаю виртуальный дуговой шар для вращения 3D-модели. Он отлично работает, но мне нужно добавить круг, который не будет вращаться вместе с моделью. Этот круг должен визуализировать дуговой шар. Мой код для достижения вращения:

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);
}

Поэтому я хотел бы спросить, есть ли способ нарисовать круг, который не будет затронут этим вращением (будет в том же месте на экране).


person ousko    schedule 19.12.2011    source источник
comment
так, как я делал это в прошлом ... вам просто нужно визуализировать все ваши 3D-материалы, используя обычную проекционную матрицу, затем заменить ее на вашу 2D-матрицу и визуализировать остальную часть вашего пользовательского интерфейса.   -  person mpen    schedule 05.01.2012


Ответы (1)


Если я правильно понимаю ваш вопрос, то все, что вам нужно сделать, это установить матрицу просмотра модели обратно в идентичность, прежде чем рисовать свой круг. Это легко сделать с помощью функций PushMatrix() и PopMatrix(). Что-то вроде этого:

//Draw normal things

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

//Draw un-rotated circle

GL.PopMatrix();

PushMatrix() сохраняет текущую матрицу в стек, а PopMatrix() извлекает верхнюю матрицу из этого стека. Это означает, что PopMatrix() вернет вас к вашей обычной повернутой системе отсчета после того, как вы закончите с кругом.

person Solaraeus    schedule 04.03.2012