2012-01-14 6 views
3

OpenGL을 사용하여 등각 투영 도면을 만들려고합니다. 따르면OpenGL을 사용한 등각 투영

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

"이 제 직선 방향 일 개면을보고함으로써 행해진 다 다음 큐브 종축에 대해 45 ° ± 회전, 약 ± 35.264 °의 회전 (정확하게 다 arcsin 하였다. (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

관련 문제