opengl - 使用 Opengl 进行等距投影

标签 opengl haskell rendering projection isometric

我正在尝试使用 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

最佳答案

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

关于opengl - 使用 Opengl 进行等距投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866398/

相关文章:

haskell - 使用 zip-conduit 列出 zip 文件

在 Web 开发环境中渲染

javascript - 登录时重新渲染模板

c++ - OpenGL 3.x/4x 中的纹素/像素匹配

c++ - SDL2 和 OpenGL 模板缓冲区不起作用

c++ - 如何从 SuperBible 获取 GLTools 库以在 Ubuntu 中工作?还是另一种选择?

c++ - 绘制顺序会影响对象的深度位置吗? (包括图像)

haskell - 是否可以在 Haskell 的 HXT 上使用 Text 或 ByteString?

c++ - 将图像从 C++ 传递给 Haskell 并取回一个字符串

ios - swift - 异步使用 renderInContext 时 UILabel 文本不是渲染器