2016-01-28 4 views
0

Я создал приложение OpenGL, где я определяю объем просмотра с помощью glOrtho(). Затем я использую gluLookAt() для преобразования всех точек. Проблема в том, что, как только я это сделаю, все точки выпадают из плоскости отсечения, потому что она «оставлена ​​позади». И я получаю черный экран.Как преобразовать плоскость отсечения glOrtho?

Как изменить объем просмотра, чтобы он был еще плотным для моих объектов, когда они были преобразованы gluLookAt()?

Вот код, чтобы лучше проиллюстрировать мою проблему:

Vector3d eyePos = new Vector3d(0.25, 0.25, 0.6); 
Vector3d point = new Vector3d(0, 0, 0.001);    
Vector3d up = new Vector3d(0, 1,0);    
Matrix4d mat = Matrix4d.LookAt(eyePos, point, up); 

GL.Viewport(0, 0, glControl1.Width, glControl1.Height); 

GL.MatrixMode(MatrixMode.Projection); 
GL.LoadIdentity(); 
GL.Ortho(0, 1, 0, 1, 0, 1); 

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

GL.LoadMatrix(ref mat); 
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
GL.Enable(EnableCap.DepthTest); 
GL.DepthMask(true); 
GL.ClearDepth(1.0); 
GL.Color3(Color.Yellow); 
GL.Begin(PrimitiveType.Triangles); 
GL.Vertex3(0.2, 0.3, 0.01); 
GL.Vertex3(0, 0.600, 0.01); 
GL.Vertex3(0.600, 0.600, 0.01); 
GL.Color3(Color.Blue); 
GL.Vertex3(0, 0.6, 0.01); 
GL.Vertex3(0.2, 0.3, 0.01); 
GL.Vertex3(0.7, 0.5, 0.03); 
GL.Color3(Color.Red); 
GL.Vertex3(0.100, 0.000, 0.01); 
GL.Vertex3(0, 0.0, 0.01); 
GL.Vertex3(0.600, 0.600, 0.03); 

GL.End(); 
glControl1.SwapBuffers(); 

Я полагаю более емким пересмотр мой вопрос, как я могу преобразовать две точки матрицы LookAt («мат» в моем коде)?

+0

Похоже, вам нужно изменить положение камеры (glLookAt). Возможно, мы можем прикреплять изображения, чтобы лучше понять, что вы хотите. – Unick

+0

@Unick - я добавил код, который я использую, координаты, которые я использую, работают нормально, если я не загружаю матрицу lookat. Как только матрица lookat загружается, плоскости отбраковки не изменяются вместе с остальными координатами, и все они выпадают из отбраковки. –

+0

Вы отправляете строку кода, где вы устанавливаете ModelViewMatrix с помощью функции gluLookAt()? То, что вы делаете с орфографической проекцией, состоит в том, чтобы нарисовать все кубы в верхнем правом углу положения камеры с размером 1 вдоль направления просмотра. – DanceIgel

ответ

0

Хорошо, у меня возникли проблемы.

Вы устанавливаете положение камеры в положение (0,25, 0,25, 0,6), а точка зрения на ваше направление обзора (-0,25, -0,25, -0,599) (должна быть нормализована). Как я упоминал в своем комментарии ниже вашего вопроса, вы рисуете куб в правом верхнем углу вашего направления просмотра. Итак, две точки (0,25, 0,25, 0,6) (положение камеры) и точка, определяемая положением камеры и вашим направлением просмотра, вашим вектором и вашим правым вектором (посмотрите на this), определите куб вещей которые отображаются на экране (две точки определяют диагональ внутри куба). К несчастью, все ваши очки не находятся в этом кубе.

Может быть, вы смешали положение камеры с точкой, на которой хотите посмотреть? Изменение двух значений должно решить вашу проблему. Остальная часть вашего кода кажется правильной. Единственное, что вам нужно сделать, это проверить, находятся ли ваши очки в пространстве клипов ваших прогнозов. Еще одно решение, чтобы проверить, где ваши точки, будет использовать, например. на клавиатуре, чтобы динамически перемещать камеру.

+0

Точки попадают в объем просмотра, если я загружаю матрицу lookat, прежде чем изменять матрицу проекции. Любая идея, почему это так? –

+0

Я не уверен в этом, но я не знаю стандартного значения матрицы проекции. Возможность лучше взглянуть на это - установить blender и создать сцену с этими параметрами. Вы можете найти ответ. В понедельник я мог бы рассказать вам больше, если вам нужна дополнительная помощь. – DanceIgel

+0

Возможно, возникла другая ошибка, связанная с установкой ближней плоскости на '0'. Это может привести к делению нулевой ошибкой и может привести к вашей проблеме. Но обычно это должно происходить только с перспективной проекцией. Попробуйте установить его на '0.01' или что-то подобное, чтобы избежать этой проблемы. – DanceIgel

 Смежные вопросы

  • Нет связанных вопросов^_^