查看: 2056|回复: 1
打印 上一主题 下一主题

unity3d 数学基础与数学辅助类(三)

[复制链接]

700

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
16564
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-10-30 09:28:50 |只看该作者 |倒序浏览
2. 矩阵(matrix)与变换(transform)

矩阵这玩意是用来干嘛用的呢?大学老师没告诉过我们,至于为什么不告诉我们呢?就不加讨论了,反正教我的是业余的!毕竟老师没有告诉过我,错了希望要指正我啊!

矩阵在数学书上说是是由方程组的系数和常数组成的。从数学原理上, 矩阵代表了从一个线性空间到另一个线性空间的变换.




通过一个教科书上的例子,简单的描述下计算公式,估计是比较笨的原因,我不喜欢直接用数学符号描述,只喜欢看图。










矩阵说白了,个人理解就是让你“穿越”用的,让你的向量从一个空间转换到另外一个空间的向量,一个位置移动(或者旋转)到另外一个位置。至于空间有 本地坐标系统,世界坐标系统,屏幕坐标系统等,以后会谈及!我门看下矩阵变换有几种:平移,旋转,缩放,这些unity3d都已经封装好了。想具体看下他 们是怎么变换的,我懒得画图板画了,去网络上找一个图片来!按照矩阵的算法,用向量乘以变换矩阵套下公式,比较下转换前后的值,就知道了!

每一种变换,都有对应的变换矩阵,用向量或坐标乘以变换矩阵,即可对它们完成变换。变换矩阵之间,也可以做乘法叠加,叠加的几何意义是把变换按叠加 的先后顺序复合到一个矩阵中去,注意矩阵叠加不满足交换律。变换矩阵是一个4 x 4的矩阵,所以向量和坐标需要扩展到齐次空间中。
向量:(x, y, z, 0)
坐标:(x, y, z, 1)
他们的区别在于第四项,向量的第4项取0,可以使矩阵的平移变换失效,而不影响旋转和缩放运算。坐标第4项取1,使平移有效,并且平移变换的比例不 会被变化。如果取2,则其平移的距离则是矩阵中定义的2倍。以此类推。注意,在变换后,有可能出现第4项非0/1  的情况,这个时候,我们必须要做一个映射动作,将它从齐次空间映射回3维空间,方法很简单:
(x, y, z, w) --> (x/w, y/w, z/w, w/w) --> (x/w, y/w, z/w, 1) --> (x/w, y/w, z/w)


3. 平面(plane)与射线(Ray)

平面:

n Dot P + d = X;
X<0,点P位于平面的背面,|X| 即点P到平面的距离
X>0,点P位于平面的正面,|X| 为点P到平面的距离
射线:

设起点为P0, 方向为u,t 为参数,t 属于 [0, 无穷大),当t 属于(-无穷大,+无穷大)时就表示直线。
p(t) = p0 + t * u

之所以要将他们一起放一起是他们两在实际的开发中,是常在一起使用的。至少我用的比较多,举个例子吧!

比如我们点击下2D的屏幕坐标,要确定游戏3D空间中位置,怎么确定呢?如何用只有x,y轴的二维鼠标,尽量精准的取得x,y,z三维空间的位置, 是一个从三维出现就一直被讨论的主题。即使在图形技术如此发达的今天,三维空间的点击仍然只能说"大概准确"。鼠标点击来确定三维空间的位置和摄像机的关 系非常大,为什么要说和摄像机有很大的关系呢?如果你熟悉Direcx3D里面的绘制流水的话,就知道摄像机把3d空间坐标转化为屏幕坐标起着很关键的作 用,如裁剪(clipping),投影窗口(projection  window),近裁减,远裁剪,投影平面等。写一个段unity的代码吧!(代码格式调不好,就随便看下吧)。

void Update ()

{

if(Input.GetMouseButtonDown(0))

{

RayControl();

}

if(flagMove)

{

if(Vector3.Distance(transform.position,mousePos)>1)

{

transform.Translate(transform.worldToLocalMatrix* ransform.forward*  Time.deltaTime*5);//transform.forward是世界坐标,通过 transform.worldToLocalMatrix转换矩阵转到本地坐标 然后在本地坐标运动,没有必要必须在本地坐标系运动  但是必须注意要统一起来。

}

else

{

flagMove=false;

}

}

}

void RayControl()

{

Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);//向屏幕发射一条射线(注意这个对象是主摄像机哦)

if(Physics.Raycast(ray,out hit,200))射线长度为200 和地面的碰撞盒做检测

{

GameObject targetPos=GameObject.CreatePrimitive(PrimitiveType.Sphere);//实例化一个Sphere

targetPos.transform.localScale=new Vector3(0.5f,0.5f,0.5f);

mousePos=hit.point;//获取碰撞点坐标

mousePos.y=transform.position.y;

targetPos.transform.position=mousePos;//Sphere放到鼠标点击的地方

targetDir=mousePos-transform.position;//计算出朝向

Vector3 tempDir=Vector3.Cross(transform.forward,targetDir.normalized);//用叉乘判断两个向量 是否同方向

float dotValue=Vector3.Dot(transform.forward,targetDir.normalized);//点乘 计算两个向量的夹角,及角色和目标点的夹角

float angle=Mathf.Acos(dotValue)*Mathf.Rad2Deg;

if(tempDir.y<0)//这块 说明两个向量方向相反,这个判断用来确定 假如两个之间夹角30度 到底是顺时 还是逆时针旋转。

{

angle=angle*(-1);

}

print(tempDir.y);

print("2:"+angle);

transform.RotateAround(transform.position,Vector3.up,angle);

flagMove=***e;

}

}



注意事项:写完了才发现 原来没必要这么麻烦,这样transform.forward=(mousePos-transform.position).normalized就可以直接让角色朝向目标点 RayControl函数 好多都可以省了

4. unity3d 数学辅助类

4.1 Mathf提供数学计算的函数与常量,面有所有数学计算时需要用到的函数。Mathf对象没有构造函数,是一个固有的对象,并不像String那样是对象的类,因此没有构造函数 Math()。

4.2  Matrix4x4一个标准的4x4变换矩阵一个变换矩阵可以执行任意的线形3D变换(例如,平移,旋转,缩放,切边等等)并且***变换使用齐次坐标。脚 本中很少使用矩阵:最常用Vector3,Quaternion,而且Transform类的功能更简单。单纯的矩阵用于特殊情况,如设置非标准相机投 影。

4.3  Quaternion四元数用于表示旋转它们基于复数的并不容易被直观地理解,因此你没有必要访问或修改单个Quaternion组件 (x,y,z,w);通常你只需把现有的旋转(例如,来自Transform)并使用它们来构造新的旋转(例如,在两个旋转间平滑地插值)。四元数函数你 99%的时间你会使用它(其他函数仅额外使用)

Quaternion.LookRotation,Quaternion.Angle,Quaternion.Euler,Quaternion.Slerp,Quaternion.FromToRotation,Quaternion.identity。

4.4 Ray射线是一个无穷的线,开始于origin并沿着direction方向

4.5 Rect一个由x、y位置和width、height大小定义的二维矩形,Rect结构主要用于2D操作。UnityGUI系统很普遍的使用它,以及在屏幕上定位摄像机

4.6 Vector2/vector3/vector4 表示向量和点, 结构用于在Unity传递3D位置和方向。它也包含做些普通向量运算的函数,如角度,模,单位向量,叉乘,点乘,向前向左向右向上,插值,投影,反射,转向……..

4.7  最后一个大总管,transform物体的位置、旋转和缩放,场景中的每一个物体都有一个Transform。用于储存并操控物体的位置、旋转和缩放。每 一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。他们也支持计数器 (enumerator),因此你可以使用循环遍历子物体。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52344
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

沙发
发表于 2012-11-30 19:00:22 |只看该作者
支持楼主的帖子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-21 18:36 , Processed in 0.066516 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部