c# - 宇宙飞船 : Rolling Sideways

标签 c# c++ math unity3d

实际上,我正在编写一个小型太空射击游戏(2.5D,俯 View )。玩家可以沿着 XZ 轴移动并通过右侧的迷你摇杆(游戏 handle )旋转宇宙飞船或查看光标位置(键盘 + 鼠标)。

因此,运动和旋转(Y 轴、偏航)是分开的。 整个工作正常并且看起来不错 - 但现在我想执行以下操作:

如果宇宙飞船侧向移动,它应该围绕 X/俯仰轴旋转/左右倾斜一点,具体取决于侧向速度。

因此,我必须根据以下给定输入计算横向速度:

速度 vector (X 轴和 Z 轴上的运动,Y 始终为“0”) 方向 vector (在 Y 轴上旋转,X 和 Z 始终为“0”)

利用侧向速度,我可以围绕 X 轴旋转我的宇宙飞船,并将得到的四元数乘以围绕 y 轴的旋转。

有人对此有解决方案吗?


解决方案:只需按宇宙飞船的航向“旋转”速度 vector ,并使用“roll/z”轴作为绕 X 轴(该轴,其中你的 scapy 指向):

Quaternion Rotation     = Quaternion.Euler(0, mHeading.y, 0);
Vector3 RealVeloctiy    = Quaternion.Euler(0, -mHeading.y, 0) * Velocity; 
float Angle         = RealVeloctiy.z * 2.5f;        
Rotation            = Rotation *   Quaternion.Euler(Angle, 0, 0);

最佳答案

几种可能性:

  1. 将速度 vector 与飞船的局部左方向进行比较(首先确保它们在同一坐标空间中)。您可以使用 Vector3.Angle 函数或点积来进行比较。适当缩放结果,并围绕正向轴应用局部旋转。

  2. 直接接受用户输入。如果用户在一个方向扫射,应用滚动值。您可以使用介于 -1 和 +1 之间的 float 以及变化率。如果他们向左扫射,则以该速率将值移向 -1,或者如果他们向左扫射,则将值移至 +1。如果两个键都没有被按下,则将值移回 0。(您可能也想尝试使用 Lerp、SmoothStep 和 SmoothDamp 函数)。缩放值以围绕相关轴应用适当的旋转。

关于c# - 宇宙飞船 : Rolling Sideways,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14085100/

相关文章:

javascript - 如何在 JavaScript 中用 "^"(插入符号)编写数学公式?

scala - 为复数定义一个类是否有意义,其中实部/虚部使用 Numeric[T] 而不是具体类型?

c# - WF 和 WPF 交互的真实示例

c++ - 在 C++03 中初始化成员的替代方法

c++ - 基本的shared_count变体

c++ - 从ole32.dll获取光标(4个奇怪的字节)

algorithm - 使用 for 循环递增值时计算 n 的值

c# - 确定 winforms 应用程序中像素的颜色

c# - (A)等待多个实例恰好引发一次事件

c# - 如何在 c# 中使用 pop3 读取从 gmail 检索的邮件中的邮件正文?