安徽 电子政务网站定制,网站优化公司认准乐云seo,市场推广方案,图文广告店最佳名字注#xff1a;本篇是基于唐老师的学习视频做的一些理论实践#xff0c;需要提前知道一些线性代数的基础知识#xff0c;原视频链接#xff1a;
8.数学基础知识学习说明_哔哩哔哩_bilibili
前期准备#xff1a;
知识点①#xff1a; Unity中需要遵守的设定#xff1a;…注本篇是基于唐老师的学习视频做的一些理论实践需要提前知道一些线性代数的基础知识原视频链接
8.数学基础知识学习说明_哔哩哔哩_bilibili
前期准备
知识点① Unity中需要遵守的设定 1、我们约定变换顺序为缩放-旋转-平移。 2、我们约定旋转的顺序为Z-X-Y。
知识点② 1、基础变换矩阵的构成规则 2、平移矩阵的定义 逆矩阵 3、旋转矩阵的定义 绕X轴旋转度 绕Y轴旋转度 绕Z轴旋转度 因为旋转矩阵是正交矩阵所以它的逆矩阵就是它的转置矩阵。 即假设有旋转矩阵A那么 4、缩放矩阵的定义 逆矩阵 局部坐标转世界 我们需要明白一个概念在3D空间中假设有一个结点R存在一个子节点A那么如果R就是坐标原点A的局部坐标系就是世界坐标系。如果结点R存在旋转平移等变换那么A的局部坐标依旧不会变R的变换会带动A的变换。那么最终的世界坐标满足关系式 M代表R的变换矩阵A代表R在原点时的世界坐标即局部坐标A代表最终的世界坐标。
再根据知识点1得到矩阵M平移矩阵A×旋转矩阵B×缩放矩阵C
便有如下代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{public Transform targetTrans;private void Start(){Vector4 startPos new Vector4(targetTrans.localPosition.x, targetTrans.localPosition.y, targetTrans.localPosition.z, 1);Matrix4x4 scaleMatrix ScaleMatrix(transform.localScale.x, transform.localScale.y, transform.localScale.z);Matrix4x4 rotateMatrix RotateYMatrix(transform.eulerAngles.y)*RotateXMatrix(transform.eulerAngles.x)*RotateZMatrix(transform.eulerAngles.z);Matrix4x4 translateMatrix TranslateMatrix(transform.position.x, transform.position.y, transform.position.z);//按照缩放-旋转按照Z-X-Y顺序旋转-平移的变换顺序Vector4 resPos translateMatrix * rotateMatrix * scaleMatrix * startPos;Debug.Log(string.Format(局部坐标转世界坐标{0},resPos));Debug.Log(string.Format(调用UnityAPI的结果{0},transform.TransformPoint(startPos)));}//缩放矩阵private Matrix4x4 ScaleMatrix(float x,float y,float z){Matrix4x4 targetMatrix new Matrix4x4();targetMatrix.m00 x;targetMatrix.m11 y;targetMatrix.m22 z;targetMatrix.m33 1;return targetMatrix;}//旋转矩阵(X轴)private Matrix4x4 RotateXMatrix(float angle){Matrix4x4 targetMatrix new Matrix4x4();targetMatrix.m00 1;targetMatrix.m11 Mathf.Cos(angle * Mathf.Deg2Rad);targetMatrix.m12 -Mathf.Sin(angle * Mathf.Deg2Rad);targetMatrix.m21 Mathf.Sin(angle * Mathf.Deg2Rad);targetMatrix.m22 Mathf.Cos(angle * Mathf.Deg2Rad);targetMatrix.m33 1;return targetMatrix;}//旋转矩阵(Y轴)private Matrix4x4 RotateYMatrix(float angle){Matrix4x4 targetMatrix new Matrix4x4();targetMatrix.m00 Mathf.Cos(angle * Mathf.Deg2Rad);targetMatrix.m02 Mathf.Sin(angle * Mathf.Deg2Rad);targetMatrix.m11 1;targetMatrix.m20 -Mathf.Sin(angle * Mathf.Deg2Rad);targetMatrix.m22 Mathf.Cos(angle * Mathf.Deg2Rad);targetMatrix.m33 1;return targetMatrix;}//旋转矩阵(Z轴)private Matrix4x4 RotateZMatrix(float angle){Matrix4x4 targetMatrix new Matrix4x4();targetMatrix.m00 Mathf.Cos(angle * Mathf.Deg2Rad);targetMatrix.m01 -Mathf.Sin(angle * Mathf.Deg2Rad);targetMatrix.m10 Mathf.Sin(angle * Mathf.Deg2Rad);targetMatrix.m11 Mathf.Cos(angle * Mathf.Deg2Rad);targetMatrix.m22 1;targetMatrix.m33 1;return targetMatrix;}//平移矩阵private Matrix4x4 TranslateMatrix(float x,float y,float z){Matrix4x4 targetMatrix new Matrix4x4();targetMatrix.m03 x;targetMatrix.m13 y;targetMatrix.m23 z;targetMatrix.m00 1;targetMatrix.m11 1;targetMatrix.m22 1;targetMatrix.m33 1;return targetMatrix;}
}挂载脚本 我们用了Unity自带的局部转世界的APITransform.TransformPoint进行结果对比发现最终的计算结果是一样的忽略第四个参数1.0代表的含义是点。 世界坐标转局部 由刚刚的公式推导其实可以得到 即局部坐标逆变换*世界坐标
由上面的性质得到已知 矩阵M平移矩阵A×旋转矩阵B×缩放矩阵C那么矩阵M的逆矩阵 矩阵A,B,C的逆矩阵都可以根据知识点2得到结果最终就可以根据世界坐标和逆变换反推导局部坐标。