Unity中的Matrix4x4类

本文详细介绍了在Unity中如何使用Matrix4x4类创建平移、旋转和缩放矩阵,并展示了如何利用这些矩阵进行世界坐标与局部坐标的转换。通过具体代码示例,读者可以了解到如何实现坐标间的相互转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     物体平移旋转一般变换底层都是用矩阵来表示的,一般不会用到这个类。有时候需要一些世界坐标与局部坐标转换的时候,可能就要用到了。

 1 //创建平移 旋转 缩放矩阵 可以理解为一个坐标系(不知道对不对。。)
 2         Matrix4x4 mat = Matrix4x4.TRS(new Vector3(1,1,1),Quaternion.Euler(0,90,0),Vector3.one);
 3         //得到在这个坐标系点(2,2,2)在世界坐标系的坐标
 4         print(mat.MultiplyPoint(new Vector3(2,2,2)));
 5         //在世界坐标系点(2,2,2)在mat变换下的坐标
 6         //局部坐标*mat = 世界坐标
 7         //世界坐标*mat的逆 = 局部坐标
 8         print(mat.inverse.MultiplyPoint(new Vector3(2,2,2)));
 9         //MultiplyVector方法 感觉没啥用
10         //把方向向量dir 做了一个旋转
11         Vector3 dir = new Vector3(3,2,3);
12         print (mat.MultiplyVector (dir) == Quaternion.Euler (0, 90, 0) * dir);

    又一个大雾霾天.....

转载于:https://www.cnblogs.com/naix-x/p/5483910.html

### UnityMatrix4x4 的使用教程 #### 定义与初始化 `Matrix4x4` 是用于表示四维变换矩阵的数据结构,在三维图形学中广泛应用于物体的位置、旋转和平移操作。创建一个新的 `Matrix4x4` 对象可以通过指定其各个元素来完成。 ```csharp // 创建一个单位矩阵 var identity = new UnityEngine.Matrix4x4( new Vector4(1f, 0f, 0f, 0f), new Vector4(0f, 1f, 0f, 0f), new Vector4(0f, 0f, 1f, 0f), new Vector4(0f, 0f, 0f, 1f)); ``` #### 变换操作 为了实现平移、缩放或旋转变换,可以利用内置的方法构建相应的转换矩阵[^1]。 ##### 平移矩阵 通过调用静态方法 `Translate(Vector3)` 来获取一个执行特定距离偏移的矩阵实例。 ```csharp Vector3 translation = new Vector3(5, 0, 0); Matrix4x4 translateMat = Matrix4x4.Translate(translation); ``` ##### 缩放矩阵 同样地,对于对象大小调整的需求,可借助于 `Scale(Vector3)` 方法获得合适的比例因子矩阵。 ```csharp Vector3 scaleFactors = new Vector3(2, 2, 2); // 各轴放大两倍 Matrix4x4 scaleMat = Matrix4x4.Scale(scaleFactors); ``` ##### 旋转矩阵 绕任意轴线进行角度转动,则需运用 `Rotate(Quaternion)` 函数构造出所需的旋转矩阵。 ```csharp Quaternion rotation = Quaternion.Euler(new Vector3(90, 0, 0)); // 绕X轴转90度 Matrix4x4 rotateMat = Matrix4x4.Rotate(rotation); ``` #### 应用到游戏对象上 一旦得到了期望的变换矩阵之后,就可以将其应用至目标 GameObject 上面了。通常情况下会结合 Transform 来进行复合运算并最终更新世界坐标系下的位置姿态信息。 ```csharp Transform transformComponent; transformComponent.localScale = Vector3.one * Mathf.Sqrt(Mathf.Abs(det)); // 考虑行列式的正负号影响 transformComponent.localRotation *= Quaternion.LookRotation(forwardDir.normalized); void ApplyTransformation(Matrix4x4 mat) { var pos = mat.MultiplyPoint(transformComponent.localPosition); var rot = mat.rotation; transformComponent.localPosition = pos; transformComponent.localRotation = rot; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值