Unity3D之Vector3.Dot(点积)和Vector3.Cross(叉积)的使用

在Unity3D中, Vector3.Dot 表示求两个向量的点积; Vector3.Cross 表示求两个向量的叉积。 
  点积计算的结果为数值,而叉积计算的结果为向量。两者要注意区别开来。

在几何数学中:

1.点积 
  点积的计算方式为:  a·b=|a|·|b|cos<a,b>  其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。另外在 点积 中,<a,b>和<b,a> 夹角是不分顺序的。 
  所以通过点积,我们其实是可以计算两个向量的夹角的。 
  另外通过点积的计算我们可以简单粗略的判断当前物体是否朝向另外一个物体: 只需要计算当前物体的transform.forward向量与 (otherObj.transform.position – transform.position)的点积即可, 大于0则面对,否则则背对着。当然这个计算也会有一点误差,但大致够用。

2.叉积 
  叉积的定义: c =a x b  其中a,b,c均为向量。即两个向量的叉积得到的还是向量! 
  性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。 
  性质2: 模长|c|=|a||b|sin<a,b> 
  性质3: 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。 
  根据上面的性质2,我们也同样的可以计算出两个向量的夹角。 
  下面是示例代码:

using UnityEngine;
using System.Collections;

public class MainScript : MonoBehaviour
{
    //向量a
    private Vector3 a;
    //向量b
    private Vector3 b;

    void Start ()
    {
        //向量的初始化
        a = new Vector3 (1, 2, 1);
        b = new Vector3 (5, 6, 0);
    }

    void OnGUI ()
    {
        //点积的返回值
        float c = Vector3.Dot (a, b);
        //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
        float angle = Mathf.Acos (Vector3.Dot (a.normalized, b.normalized)) * Mathf.Rad2Deg;
        GUILayout.Label ("向量a,b的点积为:" + c);
        GUILayout.Label ("向量a,b的夹角为:" + angle);

        //叉积的返回值
        Vector3 e = Vector3.Cross (a, b);
        Vector3 d = Vector3.Cross (b, a);
        //向量a,b的夹角,得到的值为弧度,我们将其转换为角度,便于查看!
        angle = Mathf.Asin (Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))) * Mathf.Rad2Deg;
        GUILayout.Label ("向量axb为:" + e);
        GUILayout.Label ("向量bxa为:" + d);
        GUILayout.Label ("向量a,b的夹角为:" + angle);
    }
}

上面的示例中,我们定义了两个向量a和b。分别求出了他们的点积和叉积,并通过点积和叉积来反过来计算他们的夹角。 
  这里要 说明 的是:

1. a.normalized  和  b.normalized  表示的是两个向量的单位向量, 因为在公式里,有向量和模的除法,得出来的结果就是单位向量,所以我们这里和后面都直接用单位向量来计算,省去不少麻烦。 
  2. Mathf.Rad2Deg 表示的是 单位弧度的度数。详情请见作者文章:  Unity3D之Mathf.Rad2Deg和Mathf.Deg2Rad 
  3.通过叉积计算度数是通过公式 |c|=|a||b|sin<a,b> 来逆向求值。|c| 其实就是叉积的模,换句话说,也代表着 Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))的值。 
  结果图如下:

转载自:http://www.tuicool.com/articles/jUN7Nn

时间: 2024-08-09 19:51:59

Unity3D之Vector3.Dot(点积)和Vector3.Cross(叉积)的使用的相关文章

Unity3D之Vector3.Dot和Vector3.Cross的使用

在Unity3D中,Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积. 点积计算的结果为数值,而叉积计算的结果为向量.两者要注意区别开来. 在几何数学中: 1.点积 点积的计算方式为: a·b=|a|·|b|cos<a,b> 其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角.另外在点积中,<a,b>和<b,a> 夹角是不分顺序的. 所以通过点积,我们其实是可以计算两个向量的夹角的. 另外通过点积的计算我们

CUDA __shared__ thread、block、grid之间的一维关系 (例子chapter5 dot点积(GPU高性能编程))

chapter5里重要的例子是dot,来解释一个block内多个thread的共享内存和同步. __shared__共享内存:“对于在GPU上启动的每个线程块,cuda c编译器都将创建该变量的一个副本.线程块中的每个线程都共享这块内存,并和其他线程块无关,这使一个线程块中多个线程能够在计算上进行通信和协作” __syncthreads():确保线程块中的每个线程都执行完__syncthreads()前面的语句后,在往下执行. 例子是Grid->一维Block->一维Thread: 通过实例代

剑英陪你玩转图形学 (三)归去来

今天的主题是数学,尤其是要把向量说一说 开篇废话 王全安又进去了,最近不太好引用岛国文化来开篇,来点民族的. 恰逢中秋,让我想起了一首脍炙人口的水调歌头. 明月几时有,把酒问群友.不知这次版本,今晚能出否.我欲推倒重构,又恐项目经理,深夜对我吼.增删改代码,好像没保存….. 深呼吸,看屏幕,泪在流.不应有恨,谁没忘记存代码?人有悲欢离合,码有丢失冲突,此事古难全.但愿人长久,leader别发现. 小伙伴们中秋都是怎么过的?有没有项目经理深吼你呢? 欢迎来德云社听相声,哦不,来听李总讲故事,好像也

Unity获取摄像机在某个平面上的视野范围

这是已知平面上的一个点和平面的法线的情况下,求摄像机在平面看到的视野范围,下图绿色的框框就是了. 效果: 代码: 1 using UnityEngine; 2 using System.Collections; 3 using System; 4 5 public class CameraPlaneView : MonoBehaviour 6 { 7 #region for debug 8 public Camera viewCamera; 9 10 void Update() 11 { 12

碰撞检测之Ray-Capsule检测

Capsule的射线检测和Cylinder的类似,只是把上下两个面换成了两个半球,代码上稍作区别即可. Capsule类型定义 public class Capsule : NGeometry { public Vector3 p0; public Vector3 p1; public float radius; public Capsule(Vector3 _p0, Vector3 _p1, float _radius) : base(GeometryType.Capsule) { p0 =

Unity 源码(伪)

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: B: C: D: E: F: G: H: I: J: K: L: M: 1 using System; 2 using System.Runtime.CompilerServices; 3 using UnityEngine.Internal; 4 using UnityEngine.Scripting; 5 using UnityEngineInternal; 6 7 namespac

移植UE4的模型操作到Unity中

最近在Unity上要写一个东东,功能差不多就是在Unity编辑器上的旋转,移动这些,在手机上也能比较容易操作最好,原来用Axiom3D写过一个类似的,有许多位置并不好用,刚好在研究UE4的源码,在模型操作上,很多位置都解决了,其实大家可以对比下,在UE4与Unity中,UE4的如移动和旋转都要正确和好用. 如下是根据UE4中简单移植过来的效果图,差不多已经够用,UE4相关源码主要在EditorViewportClient与UnrealWidget. 介绍一下这个组件主要功能. 1. 模型本地空间

[C++][代码库]Vector3空间向量类

本文用C++实现一个简单的Vector3类的功能,暂时有的功能是: 1 + - * /算术运算 2 向量的数量积,又叫:点乘 3 向量的向量积,又叫:叉乘 4 向量单位化(normalization) //Vecotr3.h #pragma once extern const double uZero; class Vector3 { float x, y, z; public: Vector3():x(0), y(0), z(0){} Vector3(float x1, float y1, f

空间向量类Vector3的C++实现

提要 两年前的我写下了这篇文章 - 向量类的实现.现在看来,这代码真是略显丑陋. 于是,重新写吧. 参照了一下Unity3d 的Vector3类的接口.话不多说,上代码. 编译器:gcc 4.6.3 代码清单 vector3.h #ifndef VECTOR3_H #define VECTOR3_H #include <math.h> #include <assert.h> #include <iostream> #define PI 3.14159265 using