向量的旋转

 

转载自:http://www.cppblog.com/guijie/archive/2009/03/16/76766.html

基础的2-D绕原点旋转

在2-D的迪卡尔坐标系中,一个位置向量的旋转公式可以由三角函数的几何意义推出。比如上图所示是位置向量R逆时针旋转角度B前后的情况。在左图中,我们有关系:

  x0 = |R| * cosA

  y0 = |R| * sinA

  =>

  cosA = x0 / |R|

  sinA = y0 / |R|

  在右图中,我们有关系:

  x1 = |R| * cos(A+B)

  y1 = |R| * sin(A+B)

  其中(x1, y1)就是(x0, y0)旋转角B后得到的点,也就是位置向量R最后指向的点。我们展开cos(A+B)和sin(A+B),得到

  x1 = |R| * (cosAcosB - sinAsinB)

  y1 = |R| * (sinAcosB + cosAsinB)

  现在把

  cosA = x0 / |R|

  sinA = y0 / |R|

  代入上面的式子,得到

  x1 = |R| * (x0 * cosB / |R| - y0 * sinB / |R|)

  y1 = |R| * (y0 * cosB / |R| + x0 * sinB / |R|)

  =>

  x1 = x0 * cosB - y0 * sinB

  y1 = x0 * sinB + y0 * cosB

  这样我们就得到了2-D迪卡尔坐标下向量围绕圆点的逆时针旋转公式。顺时针旋转就把角度变为负:

  x1 = x0 * cos(-B) - y0 * sin(-B)

  y1 = x0 * sin(-B) + y0 * cos(-B)

  =>

  x1 = x0 * cosB + y0 * sinB

  y1 = -x0 * sinB + y0 * cosB

  现在我要把这个旋转公式写成矩阵的形式,有一个概念我简单提一下,平面或空间里的每个线性变换(这里就是旋转变换)都对应一个矩阵,叫做变换矩阵。对一个点实施线性变换就是通过乘上该线性变换的矩阵完成的。好了,打住,不然就跑题了。

所以2-D旋转变换矩阵就是:

[cosA  sinA]      [cosA -sinA]
[-sinA cosA] 或者 [sinA cosA]

### 使用 Unreal Engine 蓝图系统进行向量旋转 在 Unreal Engine 的蓝图系统中,处理向量旋转是一个常见的需求,尤其是在涉及物体运动、摄像机控制或物理模拟的情况下。为了实现这一点,可以利用 `Rotate Vector` 或 `Transform Location` 等节点。 #### 实现方法 1. **准备所需资源** - 需要一个目标对象,该对象具有可操作的位置属性。 - 获取表示方向变化的角度值(通常来自输入设备或其他逻辑计算)。 2. **构建旋转逻辑** 对于简单的情况,可以通过以下方式完成: - 添加 `Make Rotator` 节点并配置所需的 Pitch/Yaw/Roll 参数[^2]。 ```blueprint // 构建旋转器实例 Make Rotator(Pitch, Yaw, Roll); ``` - 将上述生成的旋转器传递给 `Rotate Vector Around Axis` 节点作为参数之一,另一个重要参数是要被旋转的具体向量[^3]。 ```blueprint // 执行围绕指定轴线的旋转变换 Rotate Vector Around Axis(VectorToBeRotated, RotationAxis, AngleInDegrees); ``` 如果希望更灵活地调整位置,则推荐采用 `Add Movement Input` 结合自定义的方向矢量来进行平滑过渡效果的设计[^1]。 此外,在某些特定应用场景下,比如让角色面向某个方向行走时,还可以考虑直接修改 Actor 组件的姿态信息,即调用其内置的方法如 `SetActorRotation()` 来达到目的。 #### 示例代码片段展示如何绕 Z 轴旋转一个向量 ```blueprint // 设定初始状态下的待转向前向量 (X=0,Y=1,Z=0) Vector ForwardDirection(0.f, 1.f, 0.f); // 创建一个新的旋转结构体,这只设置了Yaw分量用于水平面内的转向 FRotator NewRotation = FRotator::ZeroRotator; NewRotation.Yaw += DeltaTime * TurnRate; // 应用旋转始前向量上得到新的朝向 ForwardDirection = UKismetMathLibrary::Conv_RotatorToUnitDirection(NewRotation).GetSafeNormal(); ``` 此段伪代码展示了怎样基于时间增量和转动速率来更新实体所指的方向,从而实现了连续性的旋转动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值