将球体投影到立方体上

时间:2009-06-14 17:06:32

标签: c# math 3d xna

我正在制作一个行星上的游戏,我计划存储数据的方式是6个二维数组,这是围绕球体的高度图(在立方体的面上) 。 我遇到的问题是,给定一个从球体中心向外指向的归一化向量,我如何确定这两个方面:

  1. 与之相交的平面
  2. x / y坐标我应该在我的2d数组中查找以获得高度。
  3. 我目前的解决方案就是这个(使用XNA):

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

      一个有用的约束是球体/立方体系统位于原点附近。

      所以,需要解决的问题是: 给定方向向量,如何确定它与周围立方体的交叉点。使用此结果,我如何在2D数组中获取正确的值,该数组在此立方体的表面上“绘制”?

3 个答案:

答案 0 :(得分:7)

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

另外两个坐标为您提供2D映射值。但是,我们需要将它们标准化。如果XYZ方向的X值最大,则2D面部坐标只是U = Y / X和V = Z / X.这些都在-1到1之间。

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

答案 1 :(得分:3)

# 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))

答案 2 :(得分:0)

如果我正确地理解你,那你就是试图将一个像素从正方形上拉下来并放到球体表面上。所以我假设你已成功找到立方体上的像素。现在你缩放矢量,使它接触球体。所以你在球体上有一个x,y,z。

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