[Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236
在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景。本篇博客将用一个简单的小例子来讲解在实际的游戏开发中如何利用向量的叉乘来解决问题。
向量叉乘的几何意义
- 叉积的长度 |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;//赋值
}
}
本Demo使用的的开发工具是Unity5.0.1f1和VS2013,建议下载源码后用Unity5.0.1f1或者更高的版本打开。源码下载
声明:本文欢迎转载和分享,但是请尊重作者的劳动成果,转载分享时请注明出处:http://www.cnblogs.com/davidsheh/p/5370325.html 。同时,码字实在不易,如果你觉得笔者分享的笔记对你有点用处,请顺手点击下方的推荐,谢谢!
[Unity游戏开发]向量在游戏开发中的应用(三)的更多相关文章
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
- [Unity游戏开发]向量在游戏开发中的应用(二)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...
- Android开发之隐式Intent中Intent-filter的三个属性-action,category,data
使用隐式Intent时,需要使用到意图过滤器Intent-filter.Intent-filter含有三个属性:action,category,data.通过这三个属性的组合,可以启动想要启动的act ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- 【Unity】1.0 第1章 Unity—3D游戏开发和虚拟现实应用开发的首选
分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity是跨平台2D.3D游戏和虚拟现实高级应用程序的专业开发引擎,是由Unity Technologies公司研制的 ...
- Unity 2D游戏开发教程之游戏精灵的开火状态
Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...
- Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)
Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...
- Unity3D游戏开发——编程实现游戏管理器
本篇简介 本篇介绍了如何将上一篇的设计模式思想运用到实际的开发过程中. 脚本文件 (1)IGameManager:这个接口存在声明了一个属性(一个拥有getter函数的变量,属性的类型是Manager ...
- 《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)
注意:本系列教程为长篇连载无底洞.半路杀进来的朋友,假设看不懂的话.请从第一章開始看起.文章文件夹请点击以下链接. http://blog.csdn.net/lufy_legend/article/d ...
随机推荐
- wireshark常用的过滤器设置
过滤源ip.目的ip.在wireshark的过滤规则框Filter中输入过滤条件.如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8:查找源地址为ip.src ...
- MyCAT日志分析
MyCAT日志对于了解MyCAT的运行信息不可获取,譬如MyCAT是否采用读写分离,对于一个查询语句,MyCAT是怎样执行的,每个分片会分发到哪个节点上等等. 默认是info级别,通过log4j.xm ...
- MySQL入门01-MySQL源码安装
操作系统:CentOS 6.7 MySQL版本:5.6.30 1.前期准备 2.系统配置 3.CMake编译配置 4.make && make install 5.后期配置和测试 Re ...
- 【JUC】JDK1.8源码分析之ThreadPoolExecutor(一)
一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...
- JConsole远程连接配置
JConsole远程连接还是有一点坑的.这里记录一下配置过程,好记性不如烂笔头. 1.在远程机的tomcat的catalina.sh中加入配置: JAVA_OPTS="$JAVA_OPTS ...
- 在Mac上使用Visual Studio Code开发/调试.NET Core代码
.Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今天抽空研究了下在Mac下如何使用VS Code来开发.NET Core程序,并且调 ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- Javascript 接口模拟
Javascript接口模拟可以通过三种方式实现文档手段(注释).辅助类和鸭式辨. 第一种和第二种只形式上体现没有真正的实现. 鸭式辨实现原理是:"只要能像鸭子一样叫和走就是鸭子" ...
- Hadoop源码编译过程
一. 为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...
- jQuery获取及设置单选框、多选框、文本框内容
获取一组radio被选中项的值 var item = $('input[@name=items][@checked]').val(); 获取select被选中项的文本 var item = $(&qu ...