2012-01-14 37 views
3

私はisometric図面を作成するために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

+0

実際、私は昨夜4時まで起きて、私が間違っていたことを理解しようとしました。 – user1149863

関連する問題