[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 ...
随机推荐
- C#:根据银行卡卡号判断银行名称
原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,博主是一个今年刚出来的应届毕业生,不足之处请多多包涵. 根据银行卡号判断所属银行,依 ...
- 有意思的Python:开发和部署一览
我觉得在有时间的条件下,学习不同的开发语言,对于保持对技术的理解是有帮助的. Python是一门这样简单而且有趣的语言.网上资料已经比较多了.我这里主要对开发和部署环境所涉及的几个工具做些介绍. 1. ...
- 1Z0-053 争议题目解析682
1Z0-053 争议题目解析682 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 682.Identify the scenarios in which the RMAN CROS ...
- php中调用WebService接口
一.背景 调用第三方短信提供商的WebService接口. 二.介绍 1.WebService三要素: SOAP(Simple Object Access Protocol) 用来描述传递信息的格式 ...
- linux源码分析(二)-启动过程
前置:这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记. ...
- 在ASP.NET Core中怎么使用HttpContext.Current
一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...
- AngularJS----基本操作
之前的学习基本了解了AngularJS的常用方法,下来就继续学习吧. 创建自定义的指令 除了内置指令,我们可以创建自定义指令.通过.directive函数来添加. <div change-dat ...
- Redis Cluster原理
Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写. ...
- Angularjs真是个好东西
事件篇: 实例:(点击按钮内容加1) <!DOCTYPE html><html><head><meta charset="utf-8"&g ...
- Tomcat指定的服务已存在
解压Tomcat8.0后,运行service.bat install,结果安装未成功,进入logs文件夹,查看错误日志,提示: 指定的服务已存在. Failed to install service ...