2个点旋转角度 unity3d
2013-02-28 17:41:07 fzhlee 阅读数 2001
在3D程序中,通常用quaternion来计算3D物体的旋转角度,与Matrix相比,quaternion更加高效,占用的储存空间更小,此外也更便于插值。在数学上,quaternion表示复数w+xi+yj+zk,其中i,j,k都是虚数单位。

可以把quaternion看做一个标量和一个3D向量的组合。实部w表示标量,虚部表示向量标记为V,或三个单独的分量(x,y,z)。所以quaternion可以记为[w,V]或[ w,x,y,z]。对quaternion最大的误解在于认为w表示旋转角度,V表示旋转轴,正确的理解应该是w与旋转角度有关,v与旋转轴有关。
2018-04-03 17:56:28 weixin_34301132 阅读数 12

Unty3D - 2

  • 游戏对象运动的本质:
游戏对象运动的本质是游戏对象间相对位置的改变。

  • 用至少三种方法实现物体的抛物线运动:

    1. 直接改变物体的的位置:Y=X^2

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class movetest : MonoBehaviour {
      
          // Use this for initialization
          void Start () {
              
          }
      
          // Update is called once per frame
          void Update () {
              this.transform.position += Vector3.right * Time.deltaTime;
              this.transform.position = new Vector3(this.transform.position.x, this.transform.position.x * this.transform.position.x, 0);
          }
      }
    2. 使用transform.Translate方法,根据加速度改变Y轴上的速度,然后让物体运动方向和速度发生改变实现抛物线:

      using System.Collections;
          using System.Collections.Generic;
          using UnityEngine;
      
          public class movetest : MonoBehaviour {
      
              // Use this for initialization
              void Start () {
                  
              }
              float t = 1;
              // Update is called once per frame
              void Update () {
                  t += Time.deltaTime;
                  float speed = 1 * t;
                  transform.Translate(transform.forward* 1 *Time.deltaTime, Space.World);
                  transform.Translate(transform.up * t * Time.deltaTime, Space.World);
              }
          }
    3. 将物体定义为刚体,给予重力和初速度实现抛物运动:

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class movetest : MonoBehaviour {
      
          // Use this for initialization
          void Start () {
              
          }
          
          // Update is called once per frame
          void Update () {
              Rigidbody a = this.gameObject.AddComponent<Rigidbody>();
              a.useGravity = true;
              a.velocity = Vector3.left * 5;
          }
      }
    4. Vector3.Slerp插值实现:

          using System.Collections;
          using System.Collections.Generic;
          using UnityEngine;
      
          public class movetest : MonoBehaviour {
      
              // Use this for initialization
              void Start () {
                  
              }
              Vector3 Speed = new Vector3(10,0,0),SpeedDown = new Vector3(0,0,0);
              // Update is called once per frame
              void Update () {
                  Vector3 NextPosition = transform.position + Speed * Time.deltaTime - SpeedDown * Time.deltaTime;
                  SpeedDown.y += 1*(Time.deltaTime);
                  NextPosition.y -= 0.5F *1* (Time.deltaTime)* (Time.deltaTime);
                  transform.position = Vector3.Slerp(transform.position, NextPosition, 1);
              }
          }

模拟太阳系


模拟太阳系

2017-12-10 22:02:34 biezhihua 阅读数 316

点和矢量

点(point):是n维空间中的一个位置,无大小、方向。

矢量 (vector):用于和标量区分开,矢量是n维空间中一种包含了大小(模 - magnitude)方向(direction)的有向线段。

  1. 矢量的模指的是这个矢量的长度(大小),其值是任意非负数。
  2. 矢量的方向则描述了在空间中的指向。

重要的:使用被用于表示相对于某个点的偏移(displacement),它实际上是一个相对量,只要适量的模(大小)和方向保持不变,无论在空间的哪里都是同一个矢量。

二维坐标系中:
X轴基矢量:(1, 0)
Y轴基矢量:(0, 1)

三维坐标系中:
X轴基矢量:(1, 0, 0)
Y轴基矢量:(0, 1, 0)
Z轴基矢量:(0, 0, 1)

若是把矢量的尾部固定在坐标系原点,那么这个矢量的表示就和点的表示重合了:

这里写图片描述

矢量运算

标量乘法

公式:

kv=(kvx,kvy,kvz)

几何意义是:
把矢量v和标量k相乘,意味着对矢量v进行一个大小为k的缩放.

矢量的加法和减法

两个矢量相加会得到相同维度的新矢量:

公式:

a+b=(ax+bx,ay+by,az+bz)ab=(axbx,ayby,azbz)

几何:
用于计算一点相对一另一点的位移。

矢量的模

矢量的模长是一个标量,是矢量在空间中的长度。

公式:

v⃗ =v21+v22++v2n

单位矢量

模为1的矢量就是单位矢量。

单位矢量也称作被归一化的矢量(normalized vector)

将任意非零矢量转化为单位矢量的过程就是归一化(normalizeation)

归一化公式:

v⃗ =v⃗ v⃗ 

零矢量:
每个分量都是0,且不可以被归一化。

矢量的点积

点积(dot product,也称为内积 inner product)

点积公式:

ab=(ax,ay,az)(bx,by,bz)=axbx+ayby+azbz

几何意义:
得到投影(projection)的长度。

若已知单位矢量â 和另一个矢量b⃗ ,那么â b⃗ 点积则可以得到矢量b⃗ 在单位矢量â 的平行线段上的带有带有符号的投影的长度。

这里写图片描述

若矢量a⃗ 不是单位矢量,那么a⃗ b⃗ 点积的结果就是b⃗ a⃗ 方向上的投影值,再乘以a⃗ 的模长。

投影值可能为负数:

  1. a⃗ b⃗ 的夹角大于90°,那么结果小于0.
  2. a⃗ b⃗ 的夹角等于90°,那么结果等于0.
  3. a⃗ b⃗ 的夹角小于90°,那么结果大于0.

这里写图片描述

矢量的叉积

叉积(cross product) 也称为外积(outer product),叉积的结果仍是矢量。

叉积得到的新矢量与原来两个矢量垂直。

叉积公式

a⃗ ×b⃗ =(ax,ay,az)×(bx,by,bz)=(aybzazby,azbxaxbz,axbyaybx)

新矢量的方向:
新矢量的方向由所在向量空间的方向确定,即按照给定直角坐标系的左右手定则

2018-07-11 22:31:45 qq_41996509 阅读数 506
用于解决给定路线的行走,有很多别名,比如:巡游、给定路径。。。。。。最常见的就是塔防类游戏。


    Unity官方网站上有个非常好的例子,能够“完美”解决路点的需求。个人按照自己的方法做了个算法简化,没有使用 Quaternion (四元数)这个高深的类。使用的是更加方便的Vector3.


    实现分为两步。1:路点间的直线行走。2:解决突然转向的问题,让转向平滑。  html5资源下载  

    解决方案1:


        每个Waypoint是一个trigger。角色仅仅向着自己的target方向前进,就是z轴的正方向。运动的方法如下:


        var fMoveSpeed : float = 4.0; // 角色的移动速度


        function Update()


        {


            transform.Translate( 0, 0, fMoveSpeed );  


        }


        多个Waypoint之间的连线形成一条路,存储所有的Waypoint需要用到数组


        var aWaypoint : Transform[]; // 路点数组html5引擎  


        将js代码作为组件给角色。用 gameObject 的 Cube(就是普通的立方体)作为路点。先在Scene面板内创建所有路点。然后依序拖入角色的 aWaypoint 变量内,这时此变量的长度会自增。问题是拖动的顺序必须是路点的顺序,万一错了就2了。所以可以使用更方便的方法, 在变量下面有个unity提供的变量Size,手动填入路点数量。这时Unity会在下面直接创建填入数量的列表。点击每行最后面的圆圈。会弹出一个面板“Select Transform”,这里有本场景内的所有物件,如果路点的名字比较给力那么和数组元素一一对应添加即可。为了让路点数量统一,在代码里需要有个数组长度变量,以便和这个长度相同,放置造成数组越界。


        var nWaypointNum : int = 0; // 路点的数量


        每个路点设置为Trigger。物件添加Rigibody属性。然后扩充刚才的代码html5游戏  

        var nWaypointNum : int;


        var aWaypoint : Transform[];


        var fMoveSpeed : float;


        private var nTargetWaypoint : int; //下一个路点的索引


        function Start()


        {


            nTargetWaypoint = 0;


        }


        function Update()


        {


            // 这里使用了一个技巧,就是通过向量减法,算出朝向下一个路点的方向向量。


            transform.forward = aWaypoint[nTargetWaypoint].position - transform.position; // 朝自己的z方向移动。                     transform.Translate( 0, 0, fMoveSpeed * Time.deltaTime );  


        }


        function OnTriggerEnter( go : Collider )


        {


            nTargetWaypoint++;


            Debug.Log(nTargetWaypoint);


            if( nTargetWaypoint >= 4 ) { nTargetWaypoint = 0; }


        } 


    html5教程  解决方案2:  


        通过使用 Vector3 类提供的牛x函数来产生平滑的差值 


        static function Slerp (from : Vector3, to : Vector3, t : float) : Vector3  


        from------起始向量


        to------目标向量


        t------取值在0到1之间,如果为0计算出来的向量就和from向量重合,如果为1则和to向量重合。所以这个参数说的直白些就是一个偏向值。(根据测试的实际情况来看,如果t值大于1,则为1,所以当累计便宜大于1也不会出现s型运动)


        为了让角色有个转向动画,那么必须让最后的t值每帧都发生改变。 Time.deltaTime 能够获得两帧之间的毫秒时间差,单位为秒。


        与上面不同的代码仅如下  


        function Update()


        {


            // 注意第一个参数是 transform.forward ,这就是为什么前面用z的正方向做朝向原因


            transform.forward = Vector3.Slerp( transform.forward, aWaypoint[nTargetWaypoint].position - transform.position, Time.deltaTime * 10 ); // 朝自己的z方向移动。


            transform.Translate( 0, 0, fMoveSpeed * Time.deltaTime );


        }

2013-11-22 11:12:00 weixin_34072857 阅读数 1

 

一:获取对象, 添加对象等

1:使用prefab生成对象

 GameObject ballObj = GameObject.Instantiate(Resources.Load("Fx/fx_bullet001"), 
transform.position + transform.forward * -0.8f + transform.up * 2,
Quaternion.identity) as GameObject;

 

 2:添加脚本到对象, 并更改脚本值

	
ballObj.AddComponent ("BasicGun");	

BasicGun pScript = ballObj.GetComponent ("BasicGun") as BasicGun;	
pScript.player = playerObj;
	

  

3:在UIButton对象中获取 UIButton自身.

UISprite sprite = gameObject.GetComponentInChildren<UISprite> ();  

  

二: 旋转相关

1:让一个对象与另一个对象的旋转角度一样(即朝向同一个方向)

 

// 主角的朝向
Vector3 dVector = playerObj.transform.forward;

// 计算要旋转的角度
float testA = Mathf.Atan2(dVector.x, dVector.z);
testA = testA* Mathf.Rad2Deg;  //本函数将 number 从弧度转换为角度   rad2deg(M_PI_4); // 45

// 对象旋转到对应角度
ballObj.transform.rotation = Quaternion.Euler(new Vector3(0, testA,0));

  ps: 不能直接为transform.rotation赋值。可以使用各种Quaternion的方法。

 

2: 旋转某对象的 方向

ballObj.transform.Rotate(Vector3.up, 30);

  

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
	void Update() {
                // Slowly rotate the object around its X axis at 1 degree/second.
	       //围绕x轴每秒1度,慢慢的旋转物体
		transform.Rotate(Vector3.right, Time.deltaTime);

	        // ... at the same time as spinning it relative to the global
	        // Y axis at the same speed.
	        //相对于世界坐标,围绕y轴每秒1度,慢慢的旋转物体
		transform.Rotate(Vector3.up, Time.deltaTime, Space.World);
	}
}    

  

 

 

 

 

其他:

转载于:https://www.cnblogs.com/willbin/p/3437160.html

Unity3D小结2

阅读数 184

没有更多推荐了,返回首页