2009-06-14 195 views
2

我目前正致力于构建一个在地球上的游戏,我计划存储数据的方式是在6维的二维数组中,这是球体周围的高度图(on立方体的面)。 我的问题是这样的,因为它从球体的中心向外指向我如何确定这两件事归一化向量:将球体投影到立方体上

  1. 它相交
  2. 的X飞机/ y坐标我应该查看我的二维数组以获得高度。

我当前的解决方案是本(使用XNA):

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

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

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

+0

Martin,您能编辑您的文章以包含更明确的问题吗? – JoshJordan 2009-06-14 17:18:45

+0

当然,我想这不是很清楚。 – Martin 2009-06-14 19:31:49

+0

你应该从一个立方体开始并镶嵌它。如果你的球体是一个由三角函数派生的球体,那么你可能会注意到一个奇点(这个球体会在极点处“夹住”)。如果你这样做,你的映射问题就会消失。 – 2009-06-24 12:32:10

回答

7

看看方向的3个分量的每一个的大小。最大幅度的告诉你你打的立方体的哪个面(并且它的符号告诉你它是+还是 - )。

另外两个坐标给你你的2D映射值。不过,我们需要对它们进行标准化。如果您的XYZ方向的X值最高,那么您的2D面坐标就是U = Y/X和V = Z/X。这两个范围都从-1到1.

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

+0

啊哈,像一个比我已经使用的更简单的技术! 我会去实施这个看看会发生什么。谢谢! – Martin 2009-06-14 17:18:20

0

如果我正确地理解了你,你试图把一个像素从广场上拉到球面上。所以我假设你已经成功找到了立方体上的像素。现在,您可以缩放矢量,以便触及球体。所以你在球体上有一个x,y,z。

球体通常是从工作表中映射的纹理。您可以在XNA中找到如何完成的参考(或者查看纹理图表并尝试找出它),或者您可以这样做:制作一张纹理图表,其中沿着x轴增加红色渐变并增加绿色渐变沿着y。映射到球体上。走着瞧吧。

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)) 
+0

不是我见过的最简单的代码;) 不过谢谢你,我现在知道它是如何工作的:D – Martin 2009-06-14 17:36:17