本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236


上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景。本篇博客将用一个简单的小例子来讲解在实际的游戏开发中如何利用向量的叉乘来解决问题。

向量叉乘的几何意义

  1. 叉积的长度 |a×b| 可以解释成以a和b为邻边的平行四边形的面积。
  2. 混合积 [a b c] = (a×b)·c可以得到以a,b,c为棱的平行六面体的体积。

关于向量叉乘的其他定义、规律以及应用有兴趣的朋友可以参考百度百科,这里就不再啰嗦了。本篇博客不想在叉乘其他地方纠结太多,只说一下如何用叉乘判断方向。

如何用向量叉乘判断方向

在网上有很多人将向量的应用总结为一句话:点乘判断角度,叉乘判断方向。关于点乘在上一篇文章中已经说完了,所以这里就说说如何用向量叉乘判断方向。

我们都知道在一个平面内的两个非平行向量叉乘的结果是这个平面的法向量,这个法向量是有方向的,而这个方向可以用“右手定则”来判断。具体的判断方法是:

若坐标系是满足右手定则的,当右手的四指从向量a以不超过180度的转角转向向量b时,竖起的大拇指指向是向量n的方向。如下图:

在右手坐标系中,当向量ab作叉乘运算时, 利用“右手定则”可以知道:当法向量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游戏开发]向量在游戏开发中的应用(三)的更多相关文章

  1. [Unity游戏开发]向量在游戏开发中的应用(一)

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...

  2. [Unity游戏开发]向量在游戏开发中的应用(二)

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50972976 在上一篇博客中讲了利用向量方向的性质来解决问题.这篇博客将继 ...

  3. Android开发之隐式Intent中Intent-filter的三个属性-action,category,data

    使用隐式Intent时,需要使用到意图过滤器Intent-filter.Intent-filter含有三个属性:action,category,data.通过这三个属性的组合,可以启动想要启动的act ...

  4. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  5. 【Unity】1.0 第1章 Unity—3D游戏开发和虚拟现实应用开发的首选

    分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity是跨平台2D.3D游戏和虚拟现实高级应用程序的专业开发引擎,是由Unity Technologies公司研制的 ...

  6. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

  7. Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)

    Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...

  8. Unity3D游戏开发——编程实现游戏管理器

    本篇简介 本篇介绍了如何将上一篇的设计模式思想运用到实际的开发过程中. 脚本文件 (1)IGameManager:这个接口存在声明了一个属性(一个拥有getter函数的变量,属性的类型是Manager ...

  9. 《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)

    注意:本系列教程为长篇连载无底洞.半路杀进来的朋友,假设看不懂的话.请从第一章開始看起.文章文件夹请点击以下链接. http://blog.csdn.net/lufy_legend/article/d ...

随机推荐

  1. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  2. iOS OC语言: Block底层实现原理

    先来简单介绍一下BlockBlock是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,Block可以在任何时候执行. Block和函数的相似性:(1)可以保存代码(2) ...

  3. ios多线程-GCD基本用法

    ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ...

  4. WebGIS中矢量切图的初步研究

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在GIS领域,金字塔技术一直是一个基础性技术,WMTS规范专 ...

  5. ASP.NET MVC 使用 FluentScheduler 定时器计划任务

    MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...

  6. Web API与文件操作

    前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在 ...

  7. C#开发微信门户及应用(45)--微信扫码登录

    在前面随笔<C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理>介绍了基于微信开放平台接口实现的微信扫码直接登录的过程.本篇介绍对扫码登录的一些改进和处理,以便更方便应用在实 ...

  8. 关于异步执行(Async/await)的理解(转发)

    原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异 ...

  9. DI和IOC

    DI和IOC是差不多的概念. 一个重要特征是接口依赖,是把对象关系推迟到运行时去确定. DI是一个初始化实例的过程,分为三种1.setter based 2.constructor based 3.i ...

  10. jquery属性

    1.toggleClass()  如果对象有class属性,则删除: 如果没有class属性,则加上. <style> .hide{ display: none; } </style ...