文档章节

点乘和叉乘在3D中的实际用法

NickHomeSelf
 NickHomeSelf
发布于 2017/09/02 16:28
字数 982
阅读 11
收藏 0
点赞 0
评论 0

点乘:两个向量点乘得到一个标量 ,数值等于两个向量长度相乘后再乘以二者夹角的余弦值 。如果两个向量a,b均 为单位 向量 ,那么a.b等于向量b在向量a方向上的投影的长度

点乘后得到的是一个值

若结果 == o,则 两向量 互垂直 。
若结果 < 0  ,则 两向量夹角大于90°。
若结果 >0  ,则两向量夹角小于 90°。

叉乘:两 个向量的叉乘得到一个新的向量 ,新向量垂直于原来的两个向量再乘夹角的正弦值 

叉乘后得到的还是一个向量

 

Unity3D里面。两个向量的点乘所得到的是两个向量的余弦值,也就是-1 到1之间,0表示垂直,-1表示相反,1表示相同方向。 两

个向量的叉乘所得到的是两个向量所组成的面的垂直向量,分两个方向。 简单的说,点乘判断角度,叉乘判断方向。 形象的说当一个

敌人在你身后的时候,叉乘可以判断你是往左转还是往右转更好的转向敌人,点乘得到你当前的面朝向的方向和你到敌人的方向的所

成的角度大小。

 

为了理解以上问题我们先了解一下Sin和Cos两个数学函数;

1、Sin和Cos的基础知识:

Sin函数:

    取值范围是-1到1.

注意:

    sin(0) = 0;

    sin(90) = 1;

    sin(180) = 0;

    sin(270) = -1;

    sin(360) = 0;

    由此我们得到 0--180 为正数,180--360取负数;

    度数如为负数,则与之相反如下:

      sin(0) = 0;

    sin(-90) = -1;

    sin(-180) = 0;

    sin(-270) = 1;

    sin(-360) = 0;

 

Cos函数:

  取值范围是-1到1.

注意:

    cos(0) = 1;

    cos(90) = 0;

    cos(180) = -1;

    cos(270) = 0;

    cos(360) = 1;

    由此我们得到 0--90,270 -- 360 为正数,90 --270取负数;

    度数如为负数,与之相同如下:

    

     cos(0) = 1;

    cos(-90) = 0;

    cos(-180) = -1;

    cos(-270) = 0;

    cos(-360) = 1;

 

2、在了解sin和cos的基础知识后,我们来看一下叉乘和点乘的公式;

以上我们了解,点乘的结果是一个浮点数

点乘公式:

    |a|*|b| * cos<a,b>

    向量a、b的大小和a、b之间的cos夹角相乘。

题一:player是一个玩家,判断Enemy在player的前方或后方。

    player的前方我们设为a向量,Enemy到player的向量我们设为b向量 ,所以Enemy所在前后取决于Cos夹角,如果Cos夹角得出是正数,则在前方。如为负数,则在后方。代码如下:

  float dot(Vector3 a,Vector3 b)
    {
        return Vector3.Dot(a,b);
    }

void main()
{
   float tmp = dot(a,b);
   if(tmp > 0)
   {
     Debug.Log("b在a的前方");
   }else  if(tmp < 0)
   {
     Debug.Log("b在a的后方");
   }
   else
   {
     Debug.Log("b在a的正左侧或正右侧");
   }
}

 

题二:player是一个玩家,判断Enemy在player的哪个方位。

public class DotAndCross : MonoBehaviour {

    public Transform obj;

	// Use this for initialization
	void Start () {

	}

    float timer = 0f;
    float devTimer = 2f;
	// Update is called once per frame
	void Update () {

        if ((timer + devTimer) > Time.time)
            return;
        timer = Time.time;
        Vector3 tmpDir = obj.position - transform.position;
        Debug.Log("cross == " + cross(transform.forward, tmpDir.normalized));
	}

 /// <summary>
 /// 判断方位
 /// </summary>
 /// <param name="dirOne"></param>
 /// <param name="dirTwo"></param>
 /// <returns></returns>
    string JudgeDirection(Vector3 dirOne,Vector3 dirTwo)
    {

        Vector3 tmpRightOrLeft = cross(dirOne, dirTwo);
        float tmpForwardOrBehind = dot(dirOne, dirTwo);
        if (tmpRightOrLeft.y > 0 && tmpForwardOrBehind > 0)
        {
            return "敌人在玩家的右前方";
        }
        else if (tmpRightOrLeft.y > 0 &&  tmpForwardOrBehind < 0)
        {
            return "敌人在玩家的右后方";
        }
        else if(tmpRightOrLeft.y < 0 &&  tmpForwardOrBehind > 0)
        {
            return "敌人在玩家的左前方";
        } 
        else if(tmpRightOrLeft.y < 0 &&  tmpForwardOrBehind < 0)
        {
            return "敌人在玩家的左后方";
        } 
        else if (tmpRightOrLeft.y == 0 && tmpForwardOrBehind > 0)
        {
            return "敌人在玩家的正前方";
        }
        else if (tmpRightOrLeft.y == 0 && tmpForwardOrBehind < 0)
        {
            return "敌人在玩家的正后方";
        }
        else if (tmpRightOrLeft.y > 0 && tmpForwardOrBehind == 0)
        {
            return "敌人在玩家的正右方";
        }
        else if (tmpRightOrLeft.y < 0 && tmpForwardOrBehind == 0)
        {
            return "敌人在玩家的正左方";
        }
        else {
            return "玩家和敌人重合";
        }

    }
    
    float dot(Vector3 objOne,Vector3 objTwo)
    {
        return Vector3.Dot(objOne,objTwo);
    }

    Vector3 cross(Vector3 objOne, Vector3 objTwo)
    {
        return Vector3.Cross(objOne,objTwo);
    }

 

© 著作权归作者所有

共有 人打赏支持
NickHomeSelf
粉丝 0
博文 64
码字总数 19755
作品 0
四元数

四元数是比较复杂的,它是一个复数,由实部和虚部组成。 复数的定义: 如果我们将平面上的x轴作为实轴,y轴作为虚轴。这样复数P就定义了一个p点,同时也定义了一个向量。 Paste_Image.png 如...

Levi_Wan ⋅ 2016/12/28 ⋅ 0

常见凸多边形判断方法

凸多边形的判定方法 在计算几何和地理信息系统中,多边形的凹凸性判定十分重要。那么什么是凹多边形和凸多边形呢?首先,我们从直观上来理解,凸多边形就是多边形任意两个顶点的连线在多边形...

长平狐 ⋅ 2013/12/25 ⋅ 0

二维平面上判断点是否在三角形内

最近在项目中碰到的这个问题,在此记录一下。已知三角形的三个顶点坐标,判断某个点是否在三角形中(在三角形的边上,我们也视作在三角形中),本文给出了三种方法。 算法1 利用面积法,如上...

嗯哼9925 ⋅ 2017/11/08 ⋅ 0

Unity 点乘(Dot)、叉乘(Cross)判断移动方向、朝向等向量问题

Unity 点乘(Dot)、叉乘(Cross)判断移动方向、朝向等向量问题 项目中常会用到物体移动,追踪,判断两物体移动方向是否相同,两物体移动方向夹角,以及物体 A 朝 物体 B 顺时针方向还是逆时...

lizhenxiqnmlgb ⋅ 05/23 ⋅ 0

Unity 中的容易搞混的坐标系

本文转载自:传送门 说明: 注意几点: 0 行向量右乘矩阵与列向量左乘矩阵,两个矩阵互为逆矩阵 1 法线转换与mul,mul函数左乘矩阵当列矩阵计算,右乘当行矩阵计算 2 叉乘与左右手系,左手系...

loving_forever_ ⋅ 2017/04/25 ⋅ 0

unity向量的点乘和叉乘

Unity3D 点乘 :Vector3.Dot,叉乘:Vector3.Cross 假设有向量a,b cos<a,b>表示a,b组成的余玄值 a 表示向量a的长度 点乘a.b = a b cos<a,b>。如果a,b都是单位向量,那么点乘表示a在b上投...

yizhangxyz ⋅ 2016/06/15 ⋅ 0

unity3d 数学基础与数学辅助类

------------------------------------------------------------- 转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本......

Matrix4X4 ⋅ 2012/07/15 ⋅ 1

线性三角形法确定空间点三维坐标

Linear triangulation methods 又称为线性三角形法,其作用是通过一组空间点在两个视图中的平面坐标,求解这组空间点的世界坐标。 已知条件为:空间点的世界坐标X,X在两个视图中的平面坐标,...

u011089570 ⋅ 2017/12/13 ⋅ 0

线性代数的本质(笔记3)(完)

1. 叉积与点积 点乘,也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。 叉乘,也叫向量积。结果是一个和已有两个向量都垂直的向量。 以我比较熟悉的图形学而言,一般点...

thinkando ⋅ 06/03 ⋅ 0

cocos2dx blender 骨骼动画实现

前言 cocos2d-x 中相关部分代码介绍 背景知识介绍 参考 http://www.3dkingdoms.com/weekly/weekly.php?a=4 一 简单3d 模型支持 第一步实现对3d 模型的简单支持,完成一个CCSprite3D 类 参考C...

李勇2 ⋅ 2014/03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 21分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部