[Unity游戏开发]向量在游戏开发中的应用(三)
2016-04-09 14:44
387 查看
在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景。本篇博客将用一个简单的小例子来讲解在实际的游戏开发中如何利用向量的叉乘来解决问题。
向量叉乘的几何意义
叉积的长度 |a×b| 可以解释成以a和b为邻边的平行四边形的面积。混合积 [a b c] = (a×b)·c可以得到以a,b,c为棱的平行六面体的体积。
如何用向量叉乘判断方向
在网上有很多人将向量的应用总结为一句话:点乘判断角度,叉乘判断方向。关于点乘在上一篇文章中已经说完了,所以这里就说说如何用向量叉乘判断方向。我们都知道在一个平面内的两个非平行向量叉乘的结果是这个平面的法向量,这个法向量是有方向的,而这个方向可以用“右手定则”来判断。具体的判断方法是:
若坐标系是满足右手定则的,当右手的四指从向量a以不超过180度的转角转向向量b时,竖起的大拇指指向是向量n的方向。如下图:
在右手坐标系中,当向量a和b作叉乘运算时, 利用“右手定则”可以知道:当法向量n跟某一坐标轴同向时,四指方向为逆时针方向;当法向量n跟该坐标轴反向时,四指方向为顺时针方向。同时“右手定则”要求转角不超过180度的方向,所以用叉乘判断的转向一定是最优转向(所要转动的角度最小,转动的代价也就最小)。在游戏中可利用这点来判断一个角色是顺时针还是逆时针才能更快速的转向一个敌人。
注意:Unity3D是左手坐标系,所以四指方向跟右手坐标系正好相反。
向量叉乘案例
接下来的案例将展示如何用向量叉乘判断一个方向盘的转向。老规矩,先上个案例的效果图:案例源码:
using UnityEngine; using System.Collections; public class VectorCrossDemo : MonoBehaviour { private GameObject wheelObj; private Vector3 wheelPos = Vector3.zero; private Vector3 oldVec = Vector3.zero; private Vector3 currVec = Vector3.zero; // Use this for initialization void Start () { wheelObj = GameObject.Find("Wheel"); if(null != wheelObj) { wheelPos = wheelObj.transform.position; } } // Update is called once per frame void Update () { if (Input.GetMouseButton(0)) { var ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { if(hit.transform.name.Equals("Wheel")) { RotateWheel(hit.point); } } } } void RotateWheel (Vector3 pos) { currVec = pos - wheelPos;//计算方向盘中心点到触控点的向量 Vector3 normalVec = Vector3.Cross(currVec, oldVec);//计算法向量 float vecAngle = Vector2.Angle(currVec, oldVec);//计算两个向量的夹角 // 使用“右手定则”可知,当大拇指方向指向我们,四指方向为逆时针方向; // 当大拇指远离我们,四指方向为顺时针方向。 // 这里叉乘后的法向量平行于z轴,所以用法向量的z分量的正负判断法向量方向 if (normalVec.z > 0)// 和z轴同向,则顺时针转 { wheelObj.transform.Rotate(Vector3.forward, -vecAngle);// 顺时针转 } else if (normalVec.z < 0)//和z轴反向,则逆时针转 { wheelObj.transform.Rotate(Vector3.forward, vecAngle);// 逆时针转 } oldVec = currVec;//赋值 } }
声明:本文欢迎转载和分享,但是请尊重作者的劳动成果,转载分享时请注明出处:http://www.cnblogs.com/davidsheh/p/5370325.html 。同时,码字实在不易,如果你觉得笔者分享的笔记对你有点用处,请顺手点击下方的推荐,谢谢!
相关文章推荐
- Unity组件的基类单例模式
- Unity3D 学习笔记6 ——协程
- Unity协程(Coroutine)原理深入剖析
- Unity3d发布WebGL 部署在IIS
- Unity frameIndex = (int)(timer / (1f / framePerSecond));
- unity源码解析Material
- Disunity_V0.5.0 提取Unity生成的APK资源的后续探索
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- Unity删除工程记录
- Unity3D中继承在ios上的UIApplicationDelegate
- [Unity] 协同程序可以在Update或者FixedUpdate中调用。
- Unity3D教程宝典之Shader篇:特别讲 CG函数
- Unity3d 动态加载fbx模型文件
- Unity读取本地图片资源
- [Unity] 官方文档Execution Order of Event Functions
- Unity3d发布webplayer 部署到IIS
- [Unity] 官方文档Coroutines的应用场景
- Unity3d发布webplayer 部署到IIS
- Unity3D 中PlayerPrefs保存或读取数组的方法
- unity3d 状态存储 PlayerPrefs高级用法