c++ - 带相机旋转的 3d 透视投影

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

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

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

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

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

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

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

但是还有比这更快更简单的方法吗?我的公式有什么补充/允许我自己旋转相机的新公式吗?

感谢任何帮助,希望有人有解决方案;D 阿拉德·阿 bool 。

最佳答案

将我的评论作为答案。

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

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

要回答您原来的问题,传统上“相机”由 View 矩阵投影矩阵 的组合表示。要旋转相机,您所要做的就是对您的 View 矩阵应用旋转变换(或者可能是“lookAt”变换;很难从您的问题中分辨出来),数学将继续执行管道中的以下操作。

关于c++ - 带相机旋转的 3d 透视投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48629151/

相关文章:

r - 在 RGL 中将立方体绘制到 3D 散点图中

math - 从给定点垂直于线段

c++ - sfml中的鼠标位置和点击检测

javascript - Three.js Projector 和 Ray 对象

C++ 类型转换运算符

c++ - 为什么带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?

c++ - 使用 opencv 匹配一组图像中的图像,以便在 C++ 中进行识别

c++ - 无法在 SFML 2.4 中加载资源

c++ - 在 SFML 中镜像 Y 轴

c++ - 如何在多个(.txt)文件中输出内容