【发布时间】:2011-06-01 14:58:45
【问题描述】:
假设我的 3D 空间中有两点 A 和 B
现在我想开始计算 A 到 B 方向 B 的点,我想继续计算远离 B 的同一行。
怎么做?
我实际上正在研究的是飞机上的子弹。
【问题讨论】:
假设我的 3D 空间中有两点 A 和 B
现在我想开始计算 A 到 B 方向 B 的点,我想继续计算远离 B 的同一行。
怎么做?
我实际上正在研究的是飞机上的子弹。
【问题讨论】:
如果我对你的问题理解正确,你应该先通过计算得到方向向量
dir = B - A
然后你就可以继续旅行了
C = B + dir
否则,请澄清您的问题,例如“计算从 A 到 B 的点”是什么意思,因为从数学上讲,A 和 B 之间的点数是无限的。
编辑: 如果你想追踪子弹路径,你有两种选择:
1) 您将其实现为 hitscan 武器,就像在许多 FPS 中所做的那样;发射的任何子弹都会立即击中目标。这可以通过Ray.Intersects 进行光线追踪来最好地实现,并且可能是最简单且计算量最少的方法。当然,也不是很现实。
2) 你让子弹成为你世界中的物理实体,并在Update() 调用期间通过当前位置矢量和运动/速度矢量的“正常”组合移动它,对任何可击打的表面进行手动碰撞检测,并对象。这样做的好处是您可以实现适当的物理特性,如行程时间、跌落、摩擦等,但是以稳健的方式实现起来也困难几个数量级。如果你想走这条路,我建议使用预制的物理 API(如Bullet,但我不确定是否有 XNA 的版本)或者至少对这个主题进行广泛的谷歌研究,所以你可以避免与快速移动的物体碰撞检测的许多陷阱。
【讨论】:
尝试在 3D 中实现 2D 技术,我计算以下一次
position = start;
dx = destination.X - start.X;
dy = destination.Y - start.Y;
dz = destination.Z - start.Z;
distance = (float)Math.Sqrt( dx * dx + dy * dy + dz * dz );
scale = 2f / distance;
然后我继续计算
position.X += dx * scale;
position.Y += dy * scale;
position.Z += dz * scale;
但是 3D 空间的结果仍然不起作用,我只得到 2 维的结果,第三轴没有被改变
【讨论】:
position.Z += dz * scale;?尽管 XNA 有很多辅助函数和 Vector3 类的重载运算符,为什么你手动进行所有计算对我来说是个谜。
Vector3 dir = destination - start; var scale = 2f / dir.Length(); dir *= scale; position += dir;