【问题标题】:3d perspective projection with camera rotation带相机旋转的 3d 透视投影
【发布时间】:2018-07-15 16:44:38
【问题描述】:

我现在正在开发一个 3d 游戏引擎(非常简单,只是立方体和其他一些简单的 3d 对象)。 我使用的是 C++,对于图形 SFML,它是 C++ 的 2d 图形库。

我已经有了透视投影的公式:

S 将是屏幕上点的位置。 P 将是该点在 3d 空间中的位置。 E 是眼睛(相机)的位置。

Sx = ((Ez * (Px - Ex)) / (Ez + Pz)) + Ex

Sy = ((Ez * (Py - Ey)) / (Ez + Pz)) + Ey

现在,效果很好! 我现在要做的是旋转相机本身。 我已经考虑过围绕相机旋转其他所有东西,因为我可以使用我当前的代码快速做到这一点,其中包括 3d 点的“rotateAroundPoint”函数。

但是有什么比这更快更简单的吗?我的公式有什么补充/一个新的可以让我自己旋转相机吗?

感谢您的帮助,希望有人有解决方案;D 阿拉德·阿尔布尔。

【问题讨论】:

    标签: c++ 3d sfml perspectivecamera projection-matrix


    【解决方案1】:

    让我的 cmets 成为答案。

    我建议您查看主要图形库用于渲染的管道。 (例如OpenGL。)SFML 在后台使用 OpenGL,因此您无需重新发明轮子。 Here 的另一个 OpenGL 示例。

    还可以查看现有的矩阵库,例如 GLM,它们提供了您需要的转换。如果您可以将必要的转换压缩成几个 OpenGL 可以使用的矩阵,您的渲染管道将会快得多。例如,您问题中的方程通常会被拆分为 模型矩阵(将每个顶点的位置从模型/局部空间 -> 世界空间转换)、视图矩阵(转换世界空间 -> 相机空间,使顶点看起来好像从相机的角度来看),以及一个perspective 投影矩阵(从相机空间转换 -> 屏幕空间,并定义诸如视野之类的东西)。当所有这些矩阵相乘时,你最终得到一个最终矩阵,当它乘以一个位置向量时,你会得到一个在屏幕空间中的位置。所以这个最终矩阵被应用到场景中的每个顶点,包括模型变换、相机变换、透视分割、裁剪等,以给出将该顶点绘制到屏幕上的最终结果。

    为了回答您最初的问题,传统上“相机”由视图矩阵投影矩阵的组合表示。要旋转相机,您所要做的就是对您的视图矩阵应用旋转变换(或者可能是“lookAt”变换;很难从您的问题中看出),然后数学将在管道中进行以下操作。

    【讨论】:

    • 你忘了提到透视投影矩阵,OP的问题标题里也写了。
    • @meowgoesthedog 编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多