【问题标题】:Projecting a sphere onto a cube将球体投影到立方体上
【发布时间】:2009-06-14 17:06:31
【问题描述】:

我目前正在构建一个在星球上的游戏,我计划存储数据的方式是 6 个二维数组,它们是球体周围的高度图(在立方体的面上) . 我遇到的问题是,给定一个从球体中心向外指向的归一化向量,我如何确定这两件事:

  1. 它相交的平面
  2. 我应该在二维数组中查找 x/y 坐标以获得高度。

我目前的解决方案是这样的(使用 XNA):

  1. 沿着提供的方向向量构造一条从 [0,0] 指向的射线。遍历每个表面并进行射线/平面相交(这是 XNA 框架提供的一种方法),以获得到相交点的距离。选择最近的平面(到交叉点的最短距离)
  2. 获取 3D 点,并将其转换为 2D 点,该点可用作数组查找来查找半径(这是我无法计算出数学或通过 google 找到任何引用的位)。

一个有用的约束是球体/立方体系统在原点周围。

那么,需要解决的问题是: 给定一个方向向量,我如何确定它与周围立方体相交的位置。使用这个结果,我如何在这个立方体的表面上“绘制”的二维数组中获得正确的值?

【问题讨论】:

  • Martin,您能否编辑您的帖子以包含更明确的问题?
  • 当然,我想这不是很清楚。
  • 您应该从一个立方体开始并对其进行镶嵌。如果您的球体是从三角函数派生的,您可能会注意到一个奇点(景观将在两极“挤压”)。如果你这样做,你的映射问题就会消失。
  • 这种情况下的球体实际上并不存在,我只是得到了一个单位向量数据集,我想将它们映射到一个立方体上以便于存储(6 个立方体面,每个都是 2d数组)

标签: c# math 3d xna


【解决方案1】:

查看方向的 3 个分量中每个分量的大小。幅度最大的那个告诉你你击中了立方体的哪个面(它的符号告诉你它是 + 还是 - 面。)

其他两个坐标为您提供 2D 映射值。不过,我们需要将它们标准化。如果您的 XYZ 方向以 X 作为最高幅度,那么您的 2D 面坐标就是 U=Y/X 和 V=Z/X。这两个值的范围都是 -1 到 1。

注意从正面到负面的翻转,您可能需要翻转 2D U 和/或 V 值以匹配您的坐标系。

【讨论】:

  • 啊哈,这听起来比我已经在使用的技术要简单一些!我将尝试实现这一点,看看会发生什么。谢谢!
【解决方案2】:
# edges are called X_AXIS_POS, X_AXIS_NEG, Y_AXIS_POS, Y_AXIS_NEG, Z_AXIS_POS, Z_AXIS_NEG
if (x*x >= y*y) && (x*x >= z*z) : 
    return ( (x>0) ? X_AXIS_POS : X_AXIS_NEG, y/abs(x), z/abs(x))
if (y*y >= z*z) && (y*y >= x*x) : 
    return ( (y>0) ? Y_AXIS_POS : Y_AXIS_NEG, x/abs(y), z/abs(y))
return ( (z>0) ? Z_AXIS_POS : Z_AXIS_NEG, x/abs(z), y/abs(z))

【讨论】:

  • 不是我见过的最简单的代码 ;) 不过谢谢你,我现在确切地知道它是如何工作的 :D
【解决方案3】:

如果我对您的理解正确,您是在尝试将像素从正方形拉到球体表面。所以我假设你已经成功地找到了立方体上的像素。现在您缩放矢量,使其接触球体。所以你在球体上有一个 x,y,z。

球体通常是从一张纸上映射的纹理。您可以找到有关如何在 XNA 中完成的参考(或查看纹理表并尝试弄清楚),或者您可以这样做:制作沿 x 轴增加红色渐变并增加绿色渐变的纹理表沿着 y。映射到球体上。看看会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多