gpt4 book ai didi

opengl - 我如何处理 OpenGL 中的透视投影?

转载 作者:行者123 更新时间:2023-12-01 11:41:38 24 4
gpt4 key购买 nike

我目前正在使用 Haskell 的 OpenGL 绑定(bind)编写一个基本的渲染演示。问题是它几乎不能处理 2000 多个顶点。我的伪代码是这样的:

terrain = The set of points generated from [-1...1] x [-1...1] x [-1...1].
camera = Camera at position (xc, yc) with angles (ax, ay, az).
while running:
input = anything that moves the camera's position or angles
projected = []
for point in terrain:
projected.append(camera.perspectiveProjection(point))
renderPoints(projected)

问题(我相信)是我手动将每个三维点转换为二维,然后使用 OpenGL 绘制这些点。

我的问题是:我应该向 OpenGL 提供三维点,然后使用 OpenGL 内置的任何投影吗?

(我觉得我了解透视投影的工作原理 - 我只是不确定我是否应该手动执行此操作。)

编辑:

以下大部分是我的代码。仅给出函数定义,我就省略了一些我认为不言自明的部分。

main :: IO()
main = do
(_progName, _args) <- getArgsAndInitialize
initialDisplayMode $= [DoubleBuffered]
_window <- createWindow "Hello, World"
-- The camera position followed by pitch, yaw and roll.
camera <- newIORef Camera [0,0,0] 0 0 0
displayCallback $= display camera
mainLoop

display :: IORef Camera -> DisplayCallback
display camIO = do
camera <- get camIO
clear [ColorBuffer, DepthBuffer]
clear [ColorBuffer]
renderPrimitive Points $ mapM_ vertex
$ map perspectiveProjection camera points
swapBuffers
postRedisplay Nothing

最佳答案

如您所料,推出自己的投影算法可能会非常缓慢。此外,除非您正在做一些极其复杂的事情,否则 OpenGL(或更具体地说是 GLU)有一组函数可以解决您的大部分问题。

进行传统透视投影的最简单方法是使用具有位置、注视点和向上矢量的相机。就个人而言,我发现这比用旋转角度定义相机轴更简单。一旦你有了这个,你就可以拥有这样的显示功能:

import Graphics.Rendering.OpenGL.GLU.Matrix

display :: IORef Camera -> DisplayCallback
display camIO = do
camera <- get camIO
perspective fov aspect zNear zFar
lookAt (position camera) (lookAt camera) (upVector camera)
-- call clear functions
-- call renderPrimitive with the untransformed points.

lookAt 函数改变相机的位置和方向,赋予相机属性。 perspective 是一个函数,它获取有关相机和窗口的信息,并创建适当的透视投影。如果您发现它不能对投影提供足够的控制,您可以改用 Graphics.Rendering.OpenGL.GL.CoordTrans 中的 frustum

PS.: 正确的方法是使用 setup 函数来设置投影矩阵,并在必要时让显示函数更改模型 View 矩阵。但是,上面的代码应该可以工作。

PS2.: 正如评论中指出的那样,实现方式在很大程度上取决于 OpenGL 版本,我不知道 OpenGL haskell 支持哪些版本。此实现基于 OpenGL 2.1 及以下版本。

关于opengl - 我如何处理 OpenGL 中的透视投影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com