Unity中矩阵的平移、旋转、缩放

https://gameinstitute.qq.com/community/detail/117693

创建项目

 

首先创建一个Unity工程,克森把他命名为“Matrix of China”(中国的矩阵),基本配置如下图所示:

 

为了便于查找,让我们在 Assets 目录下新建三个文件夹,分别命名为“Scripts”、“Shader”、“Materials”,这个不用解释,大伙们都看得懂吧。如下图所示:

 

 

接下来再 Scripts 文件夹里创建一个 C# 脚本,命名为“Triangle”,该脚本用于创建一个简单的三角形。然后在 Hierarchy 面板下创建一个空物体,命名为“Triangle”。然后为该物体添加之前创建的“Triangle”脚本,且为该物体添加 Mesh 相关的两个组件,如下图所示:

 

 

好,接下来让我们开始码了个码。

 

 

Triangle.cs 

首先让我们看一看完整的代码,然后再一步一步的分析:

 

 

好,让我们回到 Inspector 面板修改一下“Triangle”脚本的属性,如下图所示:

 

 

PS:三角形数组索引必须从0开始,按顺序然后自增 1。且再次强调,三个顶点才能构成一个三角形。

 

好,现在让我们点击 Play 进行测试一下:

 

 

Okey,现在我们的三角形算是完成了,接下来开始玩弄它了。

 

脚本中的变换

首先创建一个 C# 脚本,命名为“MyTransform”,并为我们的“Triangle”物体添加此脚本。代码如下:

 

 

这个就是平移矩阵,其中 (Tx,Ty,Tz) 为平移的方向向量,有些书上是把 Tx、Ty、Tz 放在第四行,当经过克森的测试,Unity的平移矩阵式这样子的。下面我们就做一个简单的测试:

    1.修改“Triangle”的 Position 为(1,2,3)

 

    2.点击 Play 按钮,观察一下 matrix 属性的变化:

 

 

    图中画红线的“E03”、“E13”、“E23”正好就是对应上面平移矩阵图中的“Tx”、“Ty”、“Tz”,这说明Unity使用的正是这种方式的平移矩阵。

 

接下来,我们利用平移矩阵做个简单的平移,让我们回到“MyTransform”脚本中添加一些代码:

 

PS:记得将“Triangle”物体的 Position 设置为 (0,0,0)。现在让我们点击 Play 查看一下结果对不对:

 

 

好了,值是正确的。大家也可以修改一下参数玩玩。至此,平移矩阵大体讲完了,还是有点懵的伙计可以给克森说说。

 

缩放矩阵

这个就是缩放矩阵,其中“Sx”、“Sy”、“Sz”就是各个轴上的缩放因子。缩放矩阵是矩阵表现物体大小变换的矩阵。如果缩放因子小于1,表现为物体缩小;如果大于1,则表现为物体扩大,如果等于1则不发生变化。

 

接下来我们做个简单的测试,把取消之前 Start 函数里的代码,然后修改“Triangle”物体的 Scale 属性为(1,2,3),点击 Play 查看一下结果:

 

 

找到对应的各个轴的缩放因子,目前来说结果是正确的了。

 

接下来,我们利用缩放矩阵做个简单的操作,让我们回到“MyTransform”脚本中添加一些代码:

 

现在点击 Play 按钮查看一下结果是否正确:

 

 

Okey,看来结果是正确的。

 

PS:当各个轴上的缩放因子相等时,即:Sx=Sy=Sz 时,则为均匀缩放。

 

旋转矩阵

上图就是所谓的旋转矩阵。在我们的实践中,我就使用沿 x- 轴进行旋转做实践即可。

 

首先还是做个简单的测试,让我们修改一下脚本,然后将物体的 Rotation参数设置为 (45,0,0),最后点击 Play 按钮查看结果,如下图所示:

 

在这里我选择了45°角,因为 sin45°和cos45° 的值是相等的(虽然在上图中他们的值不相等,但实际上是相等的,大伙们可以用个 if 语句判断一下),让我们看看结果对不对:

 

Okey,看来是正确的。

 

接下来,我们利用旋转矩阵做个简单的操作,让我们回到“MyTransform”脚本中添加一些代码:

 

由于图片是拼接的,所有有点别扭

 

All right. 现在让我们回到物体的 Inspector 面板中修改“Angle”参数 和 Axle 选项,然后点击 Play 按钮进行测试即可(在这里克森选择的是,绕 X 轴旋转45°):

 

 

Perfect. 和我们预期的效果一样,大伙们可以自行修改参数进行测试一番。

 

最后给大家送上一个小工具,只需传入一个变换矩阵即可帮你完成平移、旋转、缩放的工作,然后把值传给物体的 Position、Rotation、Scale:

 

 

接下来用一个例子来演示这个小工具怎么使用。

 

回到我们的场景中,找到“Triangle”物体,在 Inspector 面板中修改“MyTransform”脚本的“Matrix”属性,如下图所示:

 

红色箭头代表平移、绿色箭头代表缩放、黄色箭头代表旋转,这个变换矩阵表示的是:物体在X轴上平移3个单位、Y轴上平移4个单位、Z轴上平移5个单位(position (3,4,5));物体绕着X轴旋转90° (Rotation(90,0,0));物体没有缩放 (1,1,1) 。

 

然后回到“MyTransform”脚本的Start函数中调用工具类里的方法完成变换矩阵的各项操作:

 

最后点击 Play 按钮查看结果:

 

 

Perfect. 看来和我们预期的效果一模一样,大伙们可以自行修改参数进行测试。

 

好了,这篇文章就到这里了。这部分内容也是克森最近刚刚学的,也算是学习笔记吧,如果有什么错误的地方还请大神们指教指教。

### Unity 中实现物体旋转平移缩放Unity 中,可以通过多种方式实现物体旋转平移缩放操作。对于交互式的 VR 应用程序来说,这些操作通常依赖于控制器输入以及特定的手柄按键组合。 #### 使用 VMatrix 进行变换 为了更灵活地控制物体的位置、角度和大小变化,可以利用 `VMatrix` 类来进行矩阵运算。下面是一个用于构建旋转矩阵的方法: ```csharp public static void MatrixBuildRotate(VMatrix matrix, float angleDegrees) { // 构建绕 Z 轴旋转的角度转换成弧度制并应用到给定的矩阵上 } ``` 此方法接受一个 `VMatrix` 参数表示要修改的目标矩阵,另一个参数则是期望旋转的角度(单位为度数),该函数内部会完成相应的计算逻辑[^1]。 #### 基于VR手柄的操作模式设计 针对虚拟现实环境下的互动需求,在实际项目开发过程中往往还需要考虑用户体验方面的要求。例如,当用户想要对某个游戏对象执行不同的变换命令时,可能需要按下不同按钮或手势来区分具体意图。这里给出了一种常见的设计方案描述如下: - **平移**:按住左控制器上的抓取键拖动物体;右控制器同样支持这一行为。 - **旋转**:保持不激活扳机状态下,仅需移动右控制器即可使选中的物品围绕其自身中心轴转动。 - **缩放**:先触发一次右控制器上的扳机键进入放大缩小状态,这时无论哪只手持握都可以用来调整尺寸比例;再次轻触同一位置则退出当前模式回到默认设置即允许重新启用旋转功能[^2]。 #### 完整示例代码片段展示 下面是部分 C# 代码样例,展示了如何监听来自 Oculus 或其他兼容设备传入的数据流,并据此改变场景内指定实体的姿态属性: ```csharp using UnityEngine; using Valve.VR; private SteamVR_Action_Boolean grabAction; // 抓取动作绑定变量定义 private Transform objectToManipulate; // 待操控目标引用声明 void Update() { if (grabAction.GetStateDown(SteamVR_Input_Sources.LeftHand)) { // 左手开始接触阶段处理... } else if(grabAction.GetStateUp(SteamVR_Input_Sources.RightHand)){ // 右手结束触摸事件响应... if(/*检测是否处于缩放模式*/){ /*切换回正常姿态编辑*/ } } // 更新物体坐标系数据... } // 更多细节省略... ``` 请注意上述仅为简化版框架示意而非可以直接运行的工作版本,开发者应当依据实际情况完善相应分支条件判断语句等内容。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值