如何在具有起点和方向矢量的网格中在3D空间中绘制线条

时间:2012-11-28 21:19:55

标签: c# line raytracing bresenham

我正在开发第一人称3D游戏。这些级别完全基于立方体,墙/地板/等都是平铺的立方体(1x1x1)。

我正在使用相机位置和相机旋转来创建光线来获取方向。我想要然后射线投射到非空的第一个立方体(或当光线从网格上掉落时)。通常,这些是方向向量,例如0,0,1或1,0,0。

我找不到使用方向向量而不是起点/终点的Bresenham线条绘制算法。特别是考虑方向向量不会仅仅是整数。

所以,对于一个特定的问题,我想我问是否有人可以解释我是否正在以正确的方式接近这个问题,如果有人可能会详细说明应该如何做到这一点。< / p>

1 个答案:

答案 0 :(得分:1)

Bresenham不会帮助你,我担心......你需要的是Ray / Line-Plane交叉算法:

非常粗糙的mathy-pseudocode:

(警告:自从我完成3D图形以来已经很长时间了)

// Ray == origin point + some distance in a direction
myRay = Porg + t*Dir;

// Plane == Some point on cube face * normal of cube face (facing out),
// at some distance from origin
myPlane = Pcube * Ncubeface - d;

// Straight shot: from ray origin to point on cube direction
straightTo = (Pcube - Porg);

使用这两个方程式,您可以推断出一些事情:

  • 如果'straightTo'和平面法线的点积为零(称为“angA”),则原点位于立方体的面内。

  • 如果光线方向和平面法线的点积接近0(称为“angB”),则光线平行于立方体的面 - 也就是说,不相交(除非你如果原点位于立方体面上,则计算。)

  • 如果(-angA / angB)&lt; 0,你的光线指向远离立方体的面。

还有其他的东西,但我已经迫不及待我微薄的记忆了。 :)

编辑: 可能是一个“快捷方式”,现在我认为它有点......这就是假设你正在为你的“地图”使用一个三维数组结构。

好的,请耐心等待我,在手机上思考和打字 - 如果您使用标准的旧Bresenham delta错误算法,但将其“修复”为2D会怎么样?

所以让我们说:

  • 我们在(10x10x10)“盒子”中的位置(5,5,5)
  • 我们指向(1 0 0)(即+ X轴)
  • 从我们的视角frustrum的左上角投射的光线仍然只是一条线; “x”和“y”的定义发生了变化,全部是
  • “X”在这种情况下是(心理可视化)...沿着平行于眼线的轴线,但与铸造线水平;也就是说,如果我们正在查看(640x480)的2D图像,“中心”是(0,0)而左上角是(-320,-240),这个“X轴线”将是一条线通过点(-320,0)投射到无限远。
  • “Y”同样是普通“Y”轴的投影,所以...几乎相同,除非我们倾斜我们的头。
  • 现在,当试图找出下一个deltaX值时,数学会变得毛茸茸,但是一旦你想出公式,它基本上是恒定的时间计算(现在我想到了它,“X轴”将成为通过你的相机投影投射的矢量&lt; 1 0 0&gt;对吧?

对不起,我正在火车上回家。 ;)