日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D学习笔记(七):叉乘和四元素

發布時間:2024/4/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D学习笔记(七):叉乘和四元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
向量的叉乘: 數學運算:a(ax,ay,az) x b(bx,by,bz) = c(aybz-azby,azbx-axby,axby-aybx) 幾何意義:得到一個新的向量,同時垂直于a向量和b向量,垂直于ab向量所組成的平面,c向量是ab平面的法向量 左手螺旋定則:四指指向a,握向b,大拇指指向c 作用 1、求順指針,逆時針關系(y>0,y<0) 2、求平面的法向量 四元數(威廉·哈密頓): 萬向節死鎖(Gimbal Lock): https://v.qq.com/x/cover/e055516g79w/e055516g79w.html http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html,最全 四元數和歐拉角的優缺點: 歐拉角缺點:萬向節死鎖 http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html 四元數:xyzw四個分量,w為實部 超復數:是由一個實部 + 三個虛部組成的,如4 + 2i + 3j + 4k 復數:實部 + 虛部,如3 + 2i,5 - 3i。復數的實部為零,即為虛數;虛部為零,即為實數。 ----虛數:如果一個數的平方等于負一,那么這個數就是虛數單位,如x^2 = -1,3i,10k,9j ----實數:有理數和無理數的集合 --------有理數:有限的或者無限循環的,如1/3 --------無理數:無限不循環的小數,如PI,e,根號2 四元數中存儲的是軸角對兒<n(x,y,z), theta> x = n.x * sin(theta/2) y = n.y * sin(theta/2) z = n.z * sin(theta/2) w = cos(theta/2) 比如:繞著y軸旋轉90度:Quaternion(0,0.707,0,0.707) 1、我們用乘法來表示四元數的旋轉量的疊加 歐拉角和四元數互轉 public static Quaternion Euler(Vector3 euler); public static Quaternion Euler(float x, float y, float z); public static Quaternion LookRotation(Vector3 forward); public static Quaternion LookRotation(Vector3 forward, [DefaultValue("Vector3.up")] Vector3 upwards); 插值:from + (to - from) * t 線性插值: public static Vector3 Lerp(Vector3 a, Vector3 b, float t); a:from是起始的位置 b:to是目標位置 t:在from到to之間插值 using System.Collections; using System.Collections.Generic; using UnityEngine; public class LerpTest : MonoBehaviour {public Transform sphere;// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){//API:Vector3.Lerp,線性插值,起始位置from,目標位置to,每次插剩余距離(from-to)的百分之多少ttransform.position = Vector3.Lerp(transform.position, sphere.position, 0.05f);//Lerp的勻速移動transform.position = Vector3.Lerp(transform.position, sphere.position, 1/Vector3.Distance(transform.position,sphere.position) * 0.05F);//Lerp的勻速旋轉//API:Mathf.Lerp(); } }

判斷方位

using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyLookPlayer : MonoBehaviour {public Transform player;public float result1;public float result2;// Use this for initializationvoid Start () { Vector3 forwardVector = transform.forward;Vector3 enemy2Player = player.position - transform.position;//result1 = enemy2Player.x * forwardVector.x + enemy2Player.y * forwardVector.y + enemy2Player.z + forwardVector.z;result1 = Vector3.Dot(forwardVector, enemy2Player);Vector3 result = Vector3.Cross(forwardVector, enemy2Player);result2 = result.y;}// Update is called once per framevoid Update () {}public void OnGUI(){if (result1 > 0){if (result2 > 0){GUILayout.Label("玩家在我的方位:右前方");}else{GUILayout.Label("玩家在我的方位:左前方");}}else{if (result2 > 0){GUILayout.Label("玩家在我的方位:右后方");}else{GUILayout.Label("玩家在我的方位:左后方");}}} }

路點移動

using System.Collections; using System.Collections.Generic; using UnityEngine; public class FindPath : MonoBehaviour {public Transform[] paths;public Vector3 dir;public float moveSpeed;public float rotSpeed;int index = 0;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (Vector3.Distance(paths[index].position, transform.position) <= 0.5f){index++;index %= paths.Length;}dir = paths[index].position - transform.position;transform.Translate(dir *Time.deltaTime* moveSpeed,Space.World);Quaternion targetRotation = Quaternion.LookRotation(dir);transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation,1/ Quaternion.Angle(transform.rotation, targetRotation)* rotSpeed);} }

用單例類來管理路點

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PathManager : MonoBehaviour {//用單例類來管理路點public static PathManager instanse = null;public static PathManager Instanse{get{return instanse;}}int index = 0;void Awake(){instanse = this;}// Use this for initializationvoid Start () {//transform.GetChild(1); }// Update is called once per framevoid Update () {}public Vector3 GetCurrentPos(){return transform.GetChild(index).position;}public bool IsReached(Vector3 targetPos){Vector3 currPos = GetCurrentPos();//忽略路點的高度currPos.y = targetPos.y;//根據步徑調整0.5f的值return Vector3.Distance(currPos, targetPos) < 0.5f;}public void MoveNext(){index++;//index = index % transform.childCount;index %= transform.childCount;} } using System.Collections; using System.Collections.Generic; using UnityEngine; public class QuaternionTest : MonoBehaviour {public Transform girl;// Use this for initializationvoid Start(){//把旋轉量賦值給transform.rotationtransform.rotation = new Quaternion(0, Mathf.Sin(45 * Mathf.Deg2Rad), 0, Mathf.Cos(45 * Mathf.Deg2Rad));//用乘法表示旋轉量疊加transform.rotation *= new Quaternion(0, Mathf.Sin(45 * Mathf.Deg2Rad), 0, Mathf.Cos(45 * Mathf.Deg2Rad));//API:Quaternion.AngleAxis,輸入軸角對兒,返回四元數,如繞著y軸旋轉90度transform.rotation = Quaternion.AngleAxis(90, Vector3.up);//用乘法表示旋轉量疊加,先繞著y軸旋轉45度,再繞著y軸旋轉90度,結果是-225(135)transform.rotation = Quaternion.AngleAxis(45, Vector3.up) * Quaternion.AngleAxis(90, Vector3.up);//四元數不滿足乘法交換律//先繞著y軸旋轉45度,再繞著x軸旋轉45度,結果是(45,45,0)transform.rotation = Quaternion.AngleAxis(45, Vector3.up) * Quaternion.AngleAxis(45, Vector3.right);//先繞著x軸旋轉45度,再繞著y軸旋轉45度transform.rotation = Quaternion.AngleAxis(45, Vector3.right) * Quaternion.AngleAxis(45, Vector3.up);}// Update is called once per framevoid Update(){//API:Quaternion LookRotation(Vector3 forward);Vector3 dir = girl.position - transform.position;//transform.rotation = Quaternion.LookRotation(dir);//目標位置Quaternion targetRotation = Quaternion.LookRotation(dir);//Slerp球形插值,每次0.01f慢慢插//transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 0.01f);// transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, 1 / Quaternion.Angle(transform.rotation, targetRotation));} } using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerControl : MonoBehaviour {public float moveSpeed = 1;public float rotSpeed = 1;public float radius = 5;// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){Vector3 targetPos = PathManager.Instanse.GetCurrentPos();Vector3 moveDir = targetPos - transform.position;moveDir.y = 0;//目標與主角y值一致targetPos.y = transform.position.y;//移動transform.position = Vector3.Lerp(transform.position, targetPos, 1 / Vector3.Distance(transform.position, targetPos) * moveSpeed);//旋轉transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDir), 1 / Quaternion.Angle(transform.rotation, Quaternion.LookRotation(moveDir)) * rotSpeed);//畫線 Debug.DrawLine(transform.position, targetPos, Color.green);//判斷是否達到if (PathManager.Instanse.IsReached(transform.position)){PathManager.Instanse.MoveNext();}}private void OnDrawGizmos(){Gizmos.color = new Color(0, 0, 1, 0.3f);Gizmos.DrawSphere(transform.position, radius);} }

補充內容

using System.Collections; using System.Collections.Generic; using UnityEngine; public class w06d3 : MonoBehaviour {public Transform target;public Transform cam;public Vector3 camerPosOffset;public float hOffset;public float moveSpeed = 5;// 1、向量加法的幾何意義// 2、向量減法的幾何意義// 3、向量的點乘的幾何意義// a.b = a.x * b.x + a.y * b.y + a.z * b.z// a.b = |a| * |b| * cos<a, b>// a.b = (|b| * cos<a, b>) * |a|// a.b = (|a| * cos<a, b>) * |b| a向量在b向量上的投影長度 * b向量的模長// b是單位向量的話, a向量在b向量上的投影長度// a、b 都是單位向量的話,兩個向量的夾角的余弦值 void Start () {if( Vector3.Angle(transform.forward, target.position - transform.position) < 90 ){}}void Update () {cam.position = transform.position + camerPosOffset;cam.LookAt(transform.position + Vector3.up * hOffset);transform.Translate((target.position - transform.position).normalized * moveSpeed * Time.deltaTime, Space.World);}private void OnTriggerEnter(Collider other){}private void OnCollisionEnter(Collision collision){} }

?

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pool<T> where T : UnityEngine.Object {public readonly int Capacity = 50;List<T> items = new List<T>();public Pool(int capacity = 50){this.Capacity = capacity;}public bool Push(T item){if (items.Count >= Capacity - 1) return false;items.Add(item); return true;}public T Pop(){if (items.Count == 0) return default(T);T item = items[items.Count - 1];items.RemoveAt(items.Count - 1);return item;} }

?

轉載于:https://www.cnblogs.com/cnwuchao/p/10362875.html

總結

以上是生活随笔為你收集整理的Unity3D学习笔记(七):叉乘和四元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。