我正在开发第一人称3D游戏。这些级别完全基于立方体,墙/地板/等都是平铺的立方体(1x1x1)。
我正在使用相机位置和相机旋转来创建光线来获取方向。我想要然后射线投射到非空的第一个立方体(或当光线从网格上掉落时)。通常,这些是方向向量,例如0,0,1或1,0,0。
我找不到使用方向向量而不是起点/终点的Bresenham线条绘制算法。特别是考虑方向向量不会仅仅是整数。
所以,对于一个特定的问题,我想我问是否有人可以解释我是否正在以正确的方式接近这个问题,如果有人可能会详细说明应该如何做到这一点。< / p>
答案 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会怎么样?
所以让我们说:
对不起,我正在火车上回家。 ;)