【问题标题】:C# XNA - Calculating next point in a vector directionC# XNA - 计算向量方向的下一个点
【发布时间】:2011-06-01 14:58:45
【问题描述】:

假设我的 3D 空间中有两点 A 和 B

现在我想开始计算 A 到 B 方向 B 的点,我想继续计算远离 B 的同一行。

怎么做?

我实际上正在研究的是飞机上的子弹。

【问题讨论】:

    标签: c# vector xna


    【解决方案1】:

    如果我对你的问题理解正确,你应该先通过计算得到方向向量

    dir = B - A
    

    然后你就可以继续旅行了

    C = B + dir
    

    否则,请澄清您的问题,例如“计算从 A 到 B 的点”是什么意思,因为从数学上讲,A 和 B 之间的点数是无限的。


    编辑: 如果你想追踪子弹路径,你有两种选择:

    1) 您将其实现为 hitscan 武器,就像在许多 FPS 中所做的那样;发射的任何子弹都会立即击中目标。这可以通过Ray.Intersects 进行光线追踪来最好地实现,并且可能是最简单且计算量最少的方法。当然,也不是很现实。

    2) 你让子弹成为你世界中的物理实体,并在Update() 调用期间通过当前位置矢量和运动/速度矢量的“正常”组合移动它,对任何可击打的表面进行手动碰撞检测,并对象。这样做的好处是您可以实现适当的物理特性,如行程时间、跌落、摩擦等,但是以稳健的方式实现起来也困难几个数量级。如果你想走这条路,我建议使用预制的物理 API(如Bullet,但我不确定是否有 XNA 的版本)或者至少对这个主题进行广泛的谷歌研究,所以你可以避免与快速移动的物体碰撞检测的许多陷阱。

    【讨论】:

    • 这项技术适用于 2D 平面.. 我在 3D 中.. 看看我对这个问题的自我回答,看看发生了什么或我做错了什么
    【解决方案2】:

    尝试在 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 类的重载运算符,为什么你手动进行所有计算对我来说是个谜。
    • 我不认识他们。我是矩阵、向量和 3D 的新手
    • Vector3 dir = destination - start; var scale = 2f / dir.Length(); dir *= scale; position += dir;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多