2012-01-14 6 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

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

+0

Спасибо тонну. Теперь все становится понятным. – user1149863

+0

На самом деле, я пробыл до 4 ночи, пытаясь понять, что я делаю неправильно. – user1149863

Смежные вопросы