競價網站如何設計廣州seo優(yōu)化費用
注:本篇是基于唐老師的學習視頻做的一些理論實踐,需要提前知道一些線性代數的基礎知識,原視頻鏈接:
8.數學基礎知識學習說明_嗶哩嗶哩_bilibili
前期準備:
知識點①:
????????Unity中需要遵守的設定:
????????????????1、我們約定變換順序為:縮放->旋轉->平移。
????????????????2、我們約定旋轉的順序為:Z->X->Y。
知識點②:
? ? ? ? 1、基礎變換矩陣的構成規(guī)則:
? ? ? ? 2、平移矩陣的定義:
????????????????? ? ? ?逆矩陣? ? ?
? ? ? ? 3、旋轉矩陣的定義:? ??
? ? ? ? ? ? ? ? ? ? ? ?繞X軸旋轉度:? ? ? ? ? ? ? ? ? ? ? ? 繞Y軸旋轉
度:? ? ? ? ? ? ? ? ? ? ? ?繞Z軸旋轉
度:
???????????????? ? ? ? ??
? ? ? ? ??
????????????????因為旋轉矩陣是正交矩陣,所以它的逆矩陣就是它的轉置矩陣。
????????????????即:假設有旋轉矩陣A,那么?
????????4、縮放矩陣的定義:
? ? ? ? ? ? ? ??? ? 逆矩陣? ?
局部坐標轉世界:
????????我們需要明白一個概念,在3D空間中,假設有一個結點R存在一個子節(jié)點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進行結果對比,發(fā)現最終的計算結果是一樣的(忽略第四個參數1.0,代表的含義是點)。
世界坐標轉局部:
????????由剛剛的公式推導,其實可以得到:
???????????????????????????????????????????????????????????????
????????即局部坐標=逆變換*世界坐標
由上面的性質得到已知? 矩陣M=平移矩陣A×旋轉矩陣B×縮放矩陣C,那么矩陣M的逆矩陣
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
矩陣A,B,C的逆矩陣都可以根據知識點2得到結果,最終就可以根據世界坐標和逆變換反推導局部坐標。