Изометрическая проекция с использованием Opengl - PullRequest
3 голосов
/ 15 января 2012

Я пытаюсь использовать opengl для создания изометрических чертежей.

Согласно: http://en.wikipedia.org/wiki/Isometric_projection#Mathematics

"это делается, сначала посмотрев прямо на одну грань. Затем куб поворачивается на ± 45 ° вокруг вертикальной оси, а затем поворачивается приблизительно на ± 35,264 ° (точно арксин (загар 30 °) или арктан (грех 45). °)) о горизонтальной оси. "

Но явно мне не хватает некоторых деталей. Этот код работает, но он находится под странным углом. Желтая должна быть самой нижней линией.

import           Graphics.UI.GLFW
import           Graphics.Rendering.OpenGL

main :: IO ()
main = do
  initialize 
  openWindow  (Size 800 600)  [] Window

  windowTitle $= "Test Projection"

  clearColor  $= Color4 0 0 0 1
  pointSize   $= 3
  lineWidth   $= 1
  blend       $= Enabled
  blendFunc   $= (SrcAlpha, OneMinusSrcAlpha)
  viewport    $= (Position 0 0, Size 800 600)

  matrixMode  $= Projection
  loadIdentity

  --  ortho (-2) (2) (-2) 2 (-20.0) 20.0 

  matrixMode  $= Modelview 0 
  loadIdentity

  rotate (35.264) (Vector3 1.0 0.0 0.0 :: Vector3 GLfloat)
  rotate    (-45) (Vector3 0.0 1.0 0.0 :: Vector3 GLfloat)


  clear [ColorBuffer]

  renderPrimitive Lines $ do
    color $ Color3 1 zero zero
    vertex' (0,0,0)
    vertex' (1,0,0)
    color $ Color3 zero 1 zero
    vertex' (0,0,0)
    vertex' (0,1,0)
    color $ Color3 zero zero 1 
    vertex' (0,0,0)
    vertex' (0,0,1)
    color $ Color3 1 1 zero
    vertex' (1,0,0)
    vertex' (0,1,0)


  swapBuffers

  getChar

  return ()

vertex' :: Integral a => (a, a, a) -> IO ()
vertex' (x, y, z) = vertex (Vertex3 (f x) (f y) (f z))
                    where f p = fromIntegral p :: GLint

zero :: GLfloat
zero = 0.0

1 Ответ

4 голосов
/ 15 января 2012

На самом деле ваш код правильный. Вы просто ошиблись в представлении системы координат OpenGL по умолчанию. В стандартной системе координат OpenGL X идет вправо, Y идет вверх, а Z указывает за пределы экрана. Ваша желтая линия идет от (1,0,0) до (1,0,0), то есть от точки вправо до точки вверх. Это совершенно правильно.

...