【问题标题】:DirectX 11, Sky dome canges shape while movingDirectX 11,天空穹顶在移动时变形
【发布时间】:2014-04-06 15:05:12
【问题描述】:

我的问题很烦人,因为我不知道如何解决它。

基本思想是我创建了一个成功渲染并随着相机位置移动的天空球体。天空球体的渲染是通过打开 Z 缓冲然后重新打开来完成的,天空的移动是通过将其世界矩阵转换为相机位置值来完成的。

当我隐式移动相机时,天穹真的很长的距离,比方说 Deptz(Z) 轴上的1000000.0f 单位,天空球体开始改变它的形状......并且随着距离的增加它变得更糟...... .

我通过打开 WIRE-FRAME 检查了它是否与纹理渲染无关,我可以看到基本上球体的多边形正在发生变化。

有人有什么想法吗???谢谢。

【问题讨论】:

  • 在这种比例下,您可能会遇到浮点精度问题。为什么不总是渲染你的天空穹顶,就好像你的相机在原点一样?就平移而言,唯一重要的是圆顶与摄像机的相对位置,这是一个恒定的零。
  • 这是我最初的想法。我总是用摄像机位置平移天穹矩阵,正如你所说的那样,浮点数可能在返回精确数字时遇到了一些问题,因此我的翻译过程很混乱。你的建议给了我一个想法,我应该如何重做这个,尽管我认为我会采用保持相机居中并移动世界的老式方式。谢谢。

标签: 3d directx directx-11


【解决方案1】:

正如 Trillian 建议的那样,您应该渲染一个相当小的天穹,它始终以您的相机为中心。该过程可能如下所示:

  1. 清除颜色和深度缓冲区
  2. 禁用深度缓冲区写入
  3. 使用相机的旋转而不是平移作为视图矩阵来渲染天空穹顶
  4. 重新启用深度缓冲区写入
  5. 渲染场景的其余部分

这样,即使天空很小,天空也将始终位于场景的其余部分之后,并且您永远不会“走过”天空。

【讨论】:

  • 感谢您的建议。当我回复 Trillian 时,我的天穹的比例为 1,它保持在最低限度。问题是,我正在用相机位置值转换圆顶的世界矩阵,以保持圆顶以相机为中心。在非常大的值(相机位置)下,浮动开始出现一些精度问题(正如 Trillian 告诉我的),所以我采用了保持相机居中并围绕它移动世界的老式方式。谢谢。
【解决方案2】:

这个答案来自非数学家、非天文学家。你的问题纯粹是平行轴。以我个人的绘画和绘画经验,我经常遇到这个问题。想想艺术家,当视点在圆柱体之外,距底座一定距离时,绘制圆柱体的线条图。圆柱体的顶部显示为椭圆。视点越接近底座中心,椭圆柱顶越圆。将视点移到圆柱体外部,直到与圆柱体顶部完全相同的平面,然后圆柱体顶部显示为一条线。

因此,您在天空穹顶中看到的是线框多边形形状的变化,因为您更靠近穹顶,使线框多边形中的(虚拟)内切圆显示为椭圆,并且您的多边形是不规则的而不是对称的图形。您在圆顶中看到的不是错误,而是准确的渲染。恭喜。你的程序有效。唯一的困难,我们的天空和你们的天空穹顶之间的区别在于,你将天空穹顶视为一个实心球体,从中心到每个物体的距离都是固定的。真实的天空视图和真正的挑战是根据每个对象在空间中的实际位置将每个对象编程为距“中心”的距离可变。尝试用几十个物体 - 例如行星 - 与地球的距离已知,然后移动“相机”,即在太空中四处观察,注意星座、行星轨道等的形状是如何变化的。如果您使与每个对象的距离足够大,那么您的相机可以在不失真的情况下进行大量移动。如果您保持实心圆顶概念,但将圆顶的直径与相机的移动距离相比较大,情况也是如此。

此评论是有帮助的,值得深思。执行?这取决于像您这样的程序员和天文学家。祝你的项目好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多