首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >unity3d:Matrix4x4矩阵位移,缩放,旋转

unity3d:Matrix4x4矩阵位移,缩放,旋转

作者头像
立羽
发布于 2023-08-24 07:22:33
发布于 2023-08-24 07:22:33
87300
代码可运行
举报
文章被收录于专栏:Unity3d程序开发Unity3d程序开发
运行总次数:0
代码可运行

二维坐标轴旋转公式推导

https://www.cnblogs.com/fangsmile/p/8622421.html

设点M在原坐标系中的坐标为(x,y),对应向量的模为r,幅角为α.将坐标轴绕坐标原点,按照逆时针方向旋转角θ形成新坐标系,点M在新坐标系中的坐标为(如图2-4),则

由此得到坐标轴的旋转的坐标变换公式

矩阵旋转公式推导

https://www.cnblogs.com/wywnet/p/3585075.html

Matrix4x4矩阵

https://www.cnblogs.com/jiahuafu/p/5981578.html 矩阵也是3D图形学一个重要的概念,在D3D里用的很平凡,但是U3D里好像都已经封装到各个Object上去了,所以很容易忽视掉,但不能忽视它的存在。在3D世界里,每个物体均有自身的世界矩阵,摄像机有摄像机矩阵,投影场景有projection矩阵,对顶点、向量、物体实施各种平移、旋转、缩放都是通过矩阵来完成的。计算机3D物体的标准4×4矩阵是这样定义的:(表示不出来矩阵大括号,请读者就当左4行的[和右4行的]当成一对大括号) Transform: 这个就是U3D所封装的矩阵运算了,用于缩放,平移,还有定位(这个囧,他把矩阵给放这用了,所有物体都可以用transform类型来存放)。Transform所实现的功能不过就是物体矩阵的运算罢了,具体如下:

Matrix4x4中,是按列优先填充的。m12就是第一行二列,下标从0开始 // // 摘要: // A standard 4x4 transformation matrix. [DefaultMember(“Item”)] [NativeClass(“Matrix4x4f”)] [NativeHeader(“Runtime/Math/MathScripting.h”)] [NativeType(Header = “Runtime/Math/Matrix4x4.h”)] [RequiredByNativeCode(Optional = true, GenerateProxy = true)] [ThreadAndSerializationSafe] public struct Matrix4x4 : IEquatable { [NativeName(“m_Data[0]”)] public float m00; [NativeName(“m_Data[15]”)] public float m33; [NativeName(“m_Data[14]”)] public float m23; [NativeName(“m_Data[13]”)] public float m13; [NativeName(“m_Data[12]”)] public float m03;

Matrix4x4.identity 单位矩阵 这个矩阵在使用的时不会影响任何东西。它的主对角线上全是1,其他位置全是0。

矩阵旋转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void Matrix4x4_Rotation(this Transform transform, SelfAxle axle, float angle)
    {
        Matrix4x4 ori = Matrix4x4.zero;
        ori.SetTRS(transform.position, transform.rotation, Vector3.one);

        matrix = Matrix4x4.identity;

        if (axle == SelfAxle.X)
        {
            matrix.m11 = Mathf.Cos(angle * Mathf.Deg2Rad);
            matrix.m12 = -Mathf.Sin(angle * Mathf.Deg2Rad);
            matrix.m21 = Mathf.Sin(angle * Mathf.Deg2Rad);
            matrix.m22 = Mathf.Cos(angle * Mathf.Deg2Rad);

        }
        else if (axle == SelfAxle.Y)
        {
            matrix.m00 = Mathf.Cos(angle * Mathf.Deg2Rad);
            matrix.m02 = Mathf.Sin(angle * Mathf.Deg2Rad);
            matrix.m20 = -Mathf.Sin(angle * Mathf.Deg2Rad);
            matrix.m22 = Mathf.Cos(angle * Mathf.Deg2Rad);
        }
        else
        {
            matrix.m00 = Mathf.Cos(angle * Mathf.Deg2Rad);
            matrix.m01 = -Mathf.Sin(angle * Mathf.Deg2Rad);
            matrix.m10 = Mathf.Sin(angle * Mathf.Deg2Rad);
            matrix.m11 = Mathf.Cos(angle * Mathf.Deg2Rad);
        }


        matrix = matrix * ori;
        transform.rotation = matrix.GetRotation();
    }
    
        public static Quaternion GetRotation(this Matrix4x4 matrix4X4)
    {
        float qw = Mathf.Sqrt(1f + matrix4X4.m00 + matrix4X4.m11 + matrix4X4.m22) / 2;
        float w = 4 * qw;
        float qx = (matrix4X4.m21 - matrix4X4.m12) / w;
        float qy = (matrix4X4.m02 - matrix4X4.m20) / w;
        float qz = (matrix4X4.m10 - matrix4X4.m01) / w;
        return new Quaternion(qx, qy, qz, qw);
    }
    
    //如何使用
    transform.Matrix4x4_Rotation(SelfAxle.X, 46f);

源码

https://github.com/luoyikun/UnityForTest MatrixTest场景

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Unity基础(17)-四元数与欧拉角与矩阵
Quaternion中存放了x,y,z,w四个数据成员,可以用下标来进行访问,对应的下标分别是0,1,2,3 其实最简单来说:四元数就是表示一个3D物体的旋转,它是一种全新数学数字,甚至不是复数。 四元数其实就是表示旋转。
孙寅
2020/06/02
5.4K0
Unity基础(17)-四元数与欧拉角与矩阵
unity3d:向量计算,AOE图形相交
x0为起点,u为单位向量,则x0t的长度为 |x0x|cosa = x0xu / |u|,因为u为单位向量,模长为1。然后得到t点坐标为x - (x0 + Mathf.Abs(t) * u),因为x可能在x0的左边,所以只算长度的绝对值单位向量,然后算x,t两点距离
立羽
2023/08/24
3940
unity3d:向量计算,AOE图形相交
Unity3D中的Quaternion(四元数)
四元数,这是一个图形学的概念,一般没怎么见过,图形学中比较常见的角位移的表示方法有“矩阵”、“欧拉角”、“四元数”这三种。可以说各有各的优点和不足,不同的场合用不同的方法。其中四元数的优点有:平滑插值、快速连接、角位移求逆、可以与矩阵形式快速转换、仅用四个数表示。不过,它也有一些缺点:比欧拉角多一个数表示、可能不合法(如:坏的输入数据或者浮点数累计都可能使四元数不合法,不过可以通过四元数标准化来解决这个问题)、晦涩难懂。
bering
2019/12/02
6.4K0
Unity 如何实现游戏中技能的扇形攻击范围
假设人物A向正前方释放一个技能,攻击范围为一个扇形,如何判断人物B是否在该范围内受到攻击。
CoderZ
2022/08/29
2K0
Unity 如何实现游戏中技能的扇形攻击范围
Unity2D游戏开发-常用的计算方法
若正好在区间内则直接返回原值,如果比最大值大则返回最大值,若比最小值小则返回最小值。
码客说
2023/08/08
4580
鼠标控制物体旋转、移动、缩放(Unity3D)
一、前言 Unity3D对于鼠标操作物体的旋转、移动、缩放的功能点使用的比较多。 今天就分享如何使用Unity实现鼠标对于物体的旋转、移动、缩放。 效果图: 二、知识点 Input.GetMouseButton(0) 获取鼠标输入,参数为一个int值 为0的时候获取的是左键 Input.GetMouseButton(1) 为1的时候获取的是右键 Input.GetMouseButton(2) 为2的时候获取的是中键(就是那个滑轮) Input.GetMouseButton 鼠标按压 I
恬静的小魔龙
2022/08/07
4.8K1
鼠标控制物体旋转、移动、缩放(Unity3D)
Unity 基于Cinemachine计算透视摄像机在地图中的移动范围
https://www.cnblogs.com/koshio0219/p/11820654.html
汐夜koshio
2020/03/19
2.4K0
unity3d 第三人称视角摄像机(线性锁视域)
private const float radian = Mathf.PI / 180.0f; //1弧度的浮点数
用户5875740
2019/07/22
1.4K0
UGUI系列-UI菜单列表,滑动展示UI(Unity3D)
  大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧。
恬静的小魔龙
2022/08/07
8040
UGUI系列-UI菜单列表,滑动展示UI(Unity3D)
Unity3D基础项目(四):3D坦克大战
这个游戏最初是国外的教程,后来被国内的众多机构和个人仿写推出众多的版本。但是内容原理差不多,有的是通过插件(PlayMaker,CaverAI),有的通过顶级封装简单几十行代码就搞出来。特别适合初学者总结自己的学习水平。由于教学需要,所以研究一下,仅供参考。
孙寅
2020/06/02
1.8K0
【Unity3D入门教程】使用C#脚本控制游戏对象
使用C#脚本控制游戏对象,是一项必备的基本技能。Unity3D可以使用的脚本有C#和javascript等。我们主要讲注意力集中在C#上。本文将会介绍怎样使用脚本控制场景中的游戏对象。
全栈程序员站长
2022/09/23
1.6K0
【Unity3D入门教程】使用C#脚本控制游戏对象
[学习笔记]三维数学(2)-三角函数
两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当弧长等于圆周长的360分之一时,夹角为一度。弧长等于圆的半径时,夹角为1弧度。 角度与弧度的换算 PI = 180度 1弧度=180度/PI 1角度=PI/180度 角度=>弧度: 弧度=角度数PI/180 API: 弧度=角度数Mathf.Deg2Rad 弧度=>角度: 角度=弧度数180/PI API: 角度=弧度数Mathf.Rad2Deg 在日常生活中角度制应用比较广泛。 在三角函数中弧度制可以简化计算。
六月丶
2022/12/26
1.3K0
[学习笔记]三维数学(2)-三角函数
[学习笔记]三维数学(4)-物体的旋转
欧拉角 什么是欧拉角 用三个数去存储物体在x、y、z轴的旋转角度。 补充: 为了避免万向节死锁,y和z轴取值范围都是0~360°,x轴是-90°~90°。 x和z轴是旋转是相对于自身坐标轴的,y轴旋转永远是相对于世界坐标轴的。 优点 好理解,使用方便 只用三个数表示,占用空间少,在表示方位的数据结构中是占用最少的 缺点 万向节死锁 四元数 什么是四元数 Quaternion在3D图形学中表示旋转,由一个三维向量(X/Y/Z)和一个标量(W)组成。 旋转轴为V,
六月丶
2022/12/26
5800
Unity Shader 屏幕后效果——全局雾
Unity内置的雾效需要在每个shader中分别编写,造成了极大的不便。这里利用屏幕后处理产生可单独控制且自由度更高的雾效。
汐夜koshio
2020/03/19
1.8K0
小聊聊NGUI中Panel的Clip功能(之一)
  首先来看顶点着色器(即vert),前几行都比较传统:使用ModelViewProjection来变换顶点,然后设置顶点颜色和纹理坐标,只是最后一步有些奇怪:
用户2615200
2018/08/02
1.4K0
小聊聊NGUI中Panel的Clip功能(之一)
unity 方向向量_二面角距离公式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/178797.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
4020
Unity UI案例(绘制圆环)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bering
2019/12/02
2K0
unity3d:控制模型单指旋转,双指缩放,并停止控制一段时间后自转
立羽
2023/08/24
5850
Unity基础(20)-Camera类
照相机是玩家观察世界的装置,屏幕空间点按像素定义,屏幕的左下为(0,0);右上是(pixelwidth,pixelHeight),z位置在照相机的世界单位中。
孙寅
2020/06/02
2.9K0
[学习笔记]三维数学(3)-向量运算
先放置两个cube,并画出指向cube的两向量,再画出两向量的叉乘向量,代码如下:
六月丶
2022/12/26
1.2K0
[学习笔记]三维数学(3)-向量运算
推荐阅读
相关推荐
Unity基础(17)-四元数与欧拉角与矩阵
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档