ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:102.97KB ,
资源ID:8970458      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8970458.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(Unity3D类解析之Vector3.docx)为本站上传会员【s4****5z】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Unity3D类解析之Vector3.docx

1、Unity3D类解析之Vector3 By张鑫 Vector3这词最早是谁发明的无从考证了,但是Unity3D里出现了这个名词的时候,我才意识到这个不是D3D和openGL才有的变量名,D3D里叫做 D3DXVECTOR3继承自_D3DVECTOR结构体,其中_D3DVECTOR结构体只有3个单精度数X,Y,Z。用于表示向量。 Vector3向量既可以用来表示位置,也可以用来表示方向。在数学与物理中,既有大小又有方向的量叫做向量(亦称矢量),与标量相对。 在立体三维坐标系中,分别取与x轴、y轴,z轴方向相同的3个单位向量i,j, k作为一组基底。若a为该坐标系内的任意向量,以

2、坐标原点O为起点作向量OP=a。由空间基本定理知,有且只有一组实数(x,y, z),使得 a=向量OP=xi+yj+zk,因此把实数对(x,y, k)叫做向量a的坐标,记作a=(x,y, z)。这就是向量a的坐标表示。其中(x,y, k),也就是点P的坐标。向量OP称为点P的位置向量。 Unity3D中Vector3类定义(只写有用的): 属性: x,y,z 表示一个空间向量。 this 用于访问x,y,z三个数据使用数组的方式访问,比如: position = new Vector3(1.5f, 3.0f, 6.7f); position[0]; // 获得1.5

3、position[1]; // 获取3.0 position[2]; // 获取6.7 normalized 返回从坐标轴原点(0,0,0)到点P(x,y,z)的方向,向量的长度为 1。 也就是说返回的向量的点P(x,y,z)到原点(0,0,0)的距离为1。 这个很多时候被用来指示一个方向,然后再乘以想要的距离就可以得到我们想要的位置坐标。只能读取。 公式如下: 1=x2+y2+ z2 magnitude 返回向量的长度,也就是点P(x,y,z)到原点(0,0,0)的距离。 就是向量的模运算,得到向量的长度。公式如下: x2+y2+ z2 最常用的是用来返回物体的移

4、动速度 speed=rigidbody.velocity.magnitude; 只能读取。如果想自行规定距离可以先normalized然后乘以距离 speed=speed.normalized*objSpeed; sqrmagnitude 返回向量长度的平方(只读)。上面那个不开根号就是了,公式如下: x2+ y2+ z2 大家知道向量的长度是用勾股定理计算出来的,计算机计算两次方和开跟的运算量比加减法要费时的多。所以如果是想比较两个向量的长度的话,用sqrMagnitude可以快很多。 方法: vertor3 Scale(vector3 scale) 所有的轴向都乘以sc

5、ale,既(x * xscale, y * yscale, z * zscale)如: Vector3 position = new Vector3(2.0f, 3.0f, 4.0f); position.Scale(new Vector3(2.5f, 1.5f, 5.0f)); //此时Position为(5.0f, 4.5f, 20.0f) a,b ∈Vector3 a.Scale(b); a.x=a.x * b.x      a.y=a.y*b.y    a.z=a.z*b.z vertor3 Scale(vector3 a, vector3 b) 缩放,返回a的每个

6、坐标乘以b的相对应的每个坐标。注意他是静态函数。公式如下: (xa * xb, ya * yb, za * zb) a,b,c ∈Vector3 a=Vector3.Scale(b,c); a.x=b.x * c.x    a.y=b.y*c.y    a.z=b.z*c.z Vector3 Cross (Vector3 lhs, Vector3 rhs) 两个向量的叉积,具体关于叉积的解释大家可以自己去网上搜搜,或点击传送门。 http://zh.wikipedia.org/zh/向量积   a = a1i + a2j + a3k = [a1, a2, a3] b

7、 = b1i + b2j + b3k = [b1, b2, b3] 则 a × b = [a2b3 − a3b2, a3b1 − a1b3, a1b2 − a2b1] Vector3 Reflect (Vector3 inDirection, Vector3 inNormal) 又一个很常用的函数,返回一个向量,让这个向量与另一个向量inDirection以坐标轴inNormal为准镜像。   脚本: var obj1: Transform; var obj2: Transform; var a: Vector3; var d: Vector3; var e: Vecto

8、r3; var f: Vector3; a=obj1.position; b=obj2.position; e=Vector3.Reflect(a,Vector3.right);//以y轴,z轴组成的面为分割线,让a和e在x轴上镜像。 f=Vector3.Reflect(b,Vector3.right); Debug.DrawLine(Vector3.zero,f,Color.black); Debug.DrawLine(Vector3.zero,e,Color.blue); Debug.DrawLine(Vector3.zero,a,Color.red); Debu

9、g.DrawLine(Vector3.zero,b,Color.green); float Dot (Vector3 lhs, Vector3 rhs) 点积,跟quaternion里的用法一样。对于normalized后的lhs和rhs,如果指向相同的方向,返回1。返回-1如果他们指向完全相反的方向。其他情况下根据角度返回两者之间的小数。如果两个向量互相垂直,返回0;    点积 两个向量u,v的点积是一个标量,用u · v表示。通用公式:|u||v|cos。在三维空间中代数公式:uxvx + uyvy + uzvz。(该公式可以先由二维证明,再推广到多维。二维

10、中的证明:利用点线距公式和勾股定理推出|u|*cos的表达式,再根据定义化简即可。)   点积的值由以下三个值确定:   u的大小v的大小u,v夹角的余弦。在u,v非零的前提下,点积如果为负,则u,v形成的角大于90度;如果为零,那么u,v垂直;如果为正,那么u,v形成的角为锐角。   点积得到两个向量的夹角的cos值,通过它可以知道两个向量的相似性,利用点积可判断一个多边形是否面向摄像机还是背向摄像机  一般情况下还是Vector3.Angle()这个函数用的比较多,两者的功能基本是一样的。 Vector3 Project (Vector3 vector, Vector

11、3 onNormal) 投射一个向量到另一个。 返回一个向量,这个向量由vector投射到onNormal。 返回0如果onNormal几乎等于或等于0; 具体工作原理可以通过这个脚本了解到   脚本: var obj1: Transform; var obj2: Transform; var a: Vector3; var b: Vector3; var c: Vector3; a=obj1.position; b=obj2.position; c=Vector3.Project(a,b); Debug.DrawLine(Vector3.zer

12、o,c,Color.yellow); Debug.DrawLine(a,c,Color.white); Debug.DrawLine(Vector3.zero,a,Color.red); Debug.DrawLine(Vector3.zero,b,Color.green); 当把obj2的位置设定为(0,1,0)的时候,大家就很容易看出这个函数是如何工作的了 float Angle (Vector3 from, Vector3 to) 这个基本上是我用的非常多的一个函数,用来确定两个向量指向的位置间的夹角 返回从from到to的夹角,单位为度。 我一般用这个来测量坦克之

13、类的车辆的y轴和空间坐标y轴之间的夹角,阻止其登上大于固定角度的斜坡。或者ai只会看见正前方多少度内的敌人,因为他不应该拥有360度的视野。 float Distance (Vector3 a, Vector3 b) 返回从a到b的距离 使用这个函数Vector3.Distance(a,b)的结果跟直接在两个向量间作减法(a-b)后求出的向量的长度是一样的。 也是非常非常常用到的一个函数。 Normalize() 向量化,向量保持相同的方向,注意向量的magnitude(长度)为1。 如果这个向量太小而不能被规范化,一个零向量将会被返回。 Vector3 normalized(

14、) 向量保持同样的方向,返回向量的magnitude(长度)为1(只读)。 注意,当前向量是不改变的并且返回一个新的规范化的向量。如果你想规范化当前向量,使用Normalize函数。 如果这个向量太小而不能被规范化,一个零向量将会被返回。 string ToString () 返回x,y,z的值,一般到小数点后一位。(0.0, 0.0, 0.0) Vector3 Lerp (Vector3 from, Vector3 to, float t) 跟Quaternion里的lerp一样,返回from和to之间的一个Vector3点p, p=form+(to-form)*t;t的取值范

15、围是[0,1] Vector3 Slerp (Vector3 from, Vector3 to, float t) 作用跟lerp差不多,但是不是呈直线靠近。 脚本: var obj1: Transform; var obj2: Transform; var a: Vector3; var b: Vector3; var c=0.0; a=Vector3.Lerp(obj1.position,obj2.position,c); b=Vector3.Slerp(obj1.position,obj2.position,c); if(Input.GetKeyDown("

16、w")) c+=0.1; if(Input.GetKeyDown("s")) c-=0.1; 输入: obj1.position=(0,0,0) obj2.position=(0,0,10) 输出: c=0, a=(0,0,0), b=(0,0,0) c=0.1 a=(0,0,1), b=(0,0,1) c=0.5, a=(0,0,5), b=(0,0,5) c=1, a=(0,0,10), b=(0,0,10) 当from在(0,0,0)的时候,两个函数的效果差不多。但是当from和to都不在原点的时候 输入: obj1.position

17、0,10,0) obj2.position=(0,10,10) 输出: c=0, a=(0,10,0), b=(0,10,0) c=0.1 a=(0,10,1), b=(0,10.4,0.8) c=0.5, a=(0,10,5), b=(0,11.2,4.6) c=1, a=(0,10,10), b=(0,10,10) 我们可以看到两者之间出现了差异。 右图是两者移动轨迹的区别。 Vector3 RotateTowards (Vector3 from, Vector3 to, float maxRadiansDelta, float maxMagnitudeDe

18、lta) 产生一个向量从from旋转并移动到 to,跟Vector3.Slerp类似,但是可以用maxRadiansDelta和max MagnitudeDelta分别控制向量的旋转方向和长度。当maxRadiansDelta=0时,向量指向from, 1则指向to。 当maxMagnitudeDelta=0时,向量的长度=from.magnitude,1则=to.magnitude。 向量的最大有效取值范围为1, 但是最小取值范围可以小于0 maxMagnitudeDelta, maxRadiansDelta [0,-∞] 当maxRadiansDelta和maxMagnitudeD

19、elta为负时,向量会向相反方向旋转和延长。 OrthoNormalize (Vector3 normal, Vector3 tangent) 这个函数读入两个向量normal和tangent, 使tangent 在由tangent 和normal构成的平面上,并与normal垂直。两个向量都被Normalize,也就是长度为1。大家可以用这个脚本在编辑器中看出这个函数是如何工作的。   脚本: var obj1: Transform; var obj2: Transform; var a: Vector3; var b: Vector3; var c:Vector3; v

20、ar d: Vector3; a=obj1.position; b=obj2.position; c=a; d=b; Vector3.OrthoNormalize(a,b); Debug.DrawLine(Vector3.zero,c,Color.blue); Debug.DrawLine(Vector3.zero,d,Color.white); Debug.DrawLine(Vector3.zero,a,Color.red); Debug.DrawLine(Vector3.zero,b,Color.green); OrthoNormalize (Vector3

21、 normal, Vector3 tangent, Vector3 binormal) 这个用法多了一个向量binormal,这个向量同时垂直于normal和tangent,三者关系类似三维的直角坐标轴。其中binormal的方向决定binormal在那边垂直于normal和tangent。 脚本: var obj1: Transform; var obj2: Transform; var a: Vector3; var b: Vector3; var c:Vector3; var d: Vector3; a=obj1.position; b=obj2.position

22、 e=transform.position; c=a; d=b; f=e; Vector3.OrthoNormalize(a,b,e); Debug.DrawLine(Vector3.zero,c,Color.yellow); Debug.DrawLine(Vector3.zero,d,Color.white); Debug.DrawLine(Vector3.zero,f,Color.black); Debug.DrawLine(Vector3.zero,a,Color.red); Debug.DrawLine(Vector3.zero,b,Color.green);

23、Debug.DrawLine(Vector3.zero,e,Color.blue); Vector3 Min (Vector3 lhs, Vector3 rhs) 返回lhs和rhs中最小的那个向量 Vector3 Max (Vector3 lhs, Vector3 rhs) 返回lhs和rhs中最大的那个向量 这两个也是很常用的。 类特有的一些属性(直接粘help的了): zero 就是Vector3(0, 0, 0)的宏 one 就是Vector3(1, 1, 1)的宏 forward 就是Vector3(0, 0, 1)的宏 Back 就是Vector3(0, 0, -1)的宏 up 就是Vector3(0, 1, 0)的宏 Down 就是Vector3(0, -1, 0)的宏 Right 就是Vector3(1, 0, 0)的宏 left 就是Vector3(-1, 0, 0)的宏 operators + 和 - 两个向量相加和相减 * 和 / 一个向量的所有轴乘以或除以一个float或int, 得到一个新的向量 == 和 != 判断两向量是否相等 张鑫于北航 2013-02-01

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服