競價網(wǎng)站如何設(shè)計廣州seo優(yōu)化費(fèi)用
注:本篇是基于唐老師的學(xué)習(xí)視頻做的一些理論實(shí)踐,需要提前知道一些線性代數(shù)的基礎(chǔ)知識,原視頻鏈接:
8.數(shù)學(xué)基礎(chǔ)知識學(xué)習(xí)說明_嗶哩嗶哩_bilibili
前期準(zhǔn)備:
知識點(diǎn)①:
????????Unity中需要遵守的設(shè)定:
????????????????1、我們約定變換順序?yàn)?#xff1a;縮放->旋轉(zhuǎn)->平移。
????????????????2、我們約定旋轉(zhuǎn)的順序?yàn)?#xff1a;Z->X->Y。
知識點(diǎn)②:
? ? ? ? 1、基礎(chǔ)變換矩陣的構(gòu)成規(guī)則:
? ? ? ? 2、平移矩陣的定義:
????????????????? ? ? ?逆矩陣? ? ?
? ? ? ? 3、旋轉(zhuǎn)矩陣的定義:? ??
? ? ? ? ? ? ? ? ? ? ? ?繞X軸旋轉(zhuǎn)度:? ? ? ? ? ? ? ? ? ? ? ? 繞Y軸旋轉(zhuǎn)
度:? ? ? ? ? ? ? ? ? ? ? ?繞Z軸旋轉(zhuǎn)
度:
???????????????? ? ? ? ??
? ? ? ? ??
????????????????因?yàn)樾D(zhuǎn)矩陣是正交矩陣,所以它的逆矩陣就是它的轉(zhuǎn)置矩陣。
????????????????即:假設(shè)有旋轉(zhuǎn)矩陣A,那么?
????????4、縮放矩陣的定義:
? ? ? ? ? ? ? ??? ? 逆矩陣? ?
局部坐標(biāo)轉(zhuǎn)世界:
????????我們需要明白一個概念,在3D空間中,假設(shè)有一個結(jié)點(diǎn)R存在一個子節(jié)點(diǎn)A,那么如果R就是坐標(biāo)原點(diǎn),A的局部坐標(biāo)系就是世界坐標(biāo)系。如果結(jié)點(diǎn)R存在旋轉(zhuǎn),平移等變換,那么A的局部坐標(biāo)依舊不會變,R的變換會帶動A的變換。那么最終的世界坐標(biāo)滿足關(guān)系式:
M代表R的變換矩陣,A代表R在原點(diǎn)時的世界坐標(biāo)(即局部坐標(biāo)),A'代表最終的世界坐標(biāo)。
再根據(jù)知識點(diǎn)1,得到矩陣M=平移矩陣A×旋轉(zhuǎn)矩陣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);//按照縮放->旋轉(zhuǎn)(按照Z->X->Y順序旋轉(zhuǎn))->平移的變換順序Vector4 resPos = translateMatrix * rotateMatrix * scaleMatrix * startPos;Debug.Log(string.Format("局部坐標(biāo)轉(zhuǎn)世界坐標(biāo)={0}",resPos));Debug.Log(string.Format("調(diào)用UnityAPI的結(jié)果={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;}//旋轉(zhuǎn)矩陣(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;}//旋轉(zhuǎn)矩陣(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;}//旋轉(zhuǎn)矩陣(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自帶的局部轉(zhuǎn)世界的APITransform.TransformPoint進(jìn)行結(jié)果對比,發(fā)現(xiàn)最終的計算結(jié)果是一樣的(忽略第四個參數(shù)1.0,代表的含義是點(diǎn))。
世界坐標(biāo)轉(zhuǎn)局部:
????????由剛剛的公式推導(dǎo),其實(shí)可以得到:
???????????????????????????????????????????????????????????????
????????即局部坐標(biāo)=逆變換*世界坐標(biāo)
由上面的性質(zhì)得到已知? 矩陣M=平移矩陣A×旋轉(zhuǎn)矩陣B×縮放矩陣C,那么矩陣M的逆矩陣
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
矩陣A,B,C的逆矩陣都可以根據(jù)知識點(diǎn)2得到結(jié)果,最終就可以根據(jù)世界坐標(biāo)和逆變換反推導(dǎo)局部坐標(biāo)。