2012-01-14 104 views
3

我想用opengl来制作等距图纸。使用Opengl的等距投影

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

“,这是通过首先寻找直朝向一个面进行下一步立方体旋转±45°围绕竖直轴线,随后的约±35.264°的旋转(准确地说反正弦。 (tan 30°)或arctan(sin 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 

回答

4

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

+0

谢谢了。事情现在变得更有意义。 – user1149863 2012-01-15 00:16:37

+0

事实上,我昨晚一直熬到昨天晚上想弄清楚我做错了什么。 – user1149863 2012-01-15 00:18:12