使用Opengl的等轴测投影



我正在尝试使用opengl制作等轴测图。

根据:http://en.wikipedia.org/wiki/Isometric_projection#Mathematics

但很明显,我遗漏了一些细节。这个代码有点工作,但角度很奇怪。黄色应该是最下面的一行。

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

实际上您的代码是正确的。您只是对OpenGL的默认坐标系有一些误解。在OpenGL的标准坐标系中,X向右,Y向上,Z指向屏幕外。您的黄线从(1,0,0)到(1,,0),即从右边的一点到上面的一点。这是完全正确的。

相关内容

  • 没有找到相关文章

最新更新