繁体   English   中英

带相机旋转的3D透视投影

[英]3d perspective projection with camera rotation

我现在正在开发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 Arad Arble。

使我的评论成为答案。

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

还要研究现有的矩阵库(例如GLM) ,它们可提供所需的转换。 如果可以将必要的转换压缩为OpenGL可以使用的几个矩阵,则渲染管线将更快。 例如,您问题中的方程式通常会拆分为模型矩阵 (以从模型/局部空间->世界空间转换每个顶点的位置), 视图矩阵 (以转换世界空间->相机空间,创建顶点)从相机的角度看起来像),以及透视 投影矩阵 (从相机空间->屏幕空间进行转换,并定义诸如视野之类的东西)。 当所有这些矩阵相乘时,最终得到最终矩阵,该矩阵与位置矢量相乘后,将在屏幕空间中为您提供位置。 因此,此最终矩阵将应用于场景中的每个顶点,其中包括模型变换,相机变换,透视图划分,剪切等,以将最终顶点绘制到屏幕上。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM