Unity3D】【Quaternion基础】Quaternion类怎么使用?

2020-12-09 16:38发布

5条回答
aijingda
2楼 · 2020-12-10 11:03

话不多说,上代码!

Quaternion类实例方法

1、SetFromToRotation方法-创建rotation实例

1.1 函数原型

public void SetFromToRotion(Vector3 fromDirection,Vector3 toDirection);

可以创建一个从formDirection到toDirection的Quaternion实例。

Quaternion q = Quaternion.identity;
q.SetFromToRotation(v1,v2);
transform.rotation = q;

可以将GameObject对象进行如下变换:首先将GameObject对象自身坐标系的x,y,z轴方向和世界坐标系的x,y,z轴方向一致,然后将GameObject对象自身坐标系中向量V1指向的方向旋转到V2方向。

1.2 PS:不可以直接使用transform.rotation.SetFromToRotation(v1,v2)方式进行设置,只能将实例化的Quaternion复制给transform.rotation。

1.3 实例演示

using UnityEngine;using System.Collections;public class SetFromToDirection_ts : MonoBehaviour {    public Transform A, B, C;
    Quaternion q = Quaternion.identity;    // Use this for initialization
    void Start () {
    
    }    
    // Update is called once per frame
    void Update () {

        q.SetFromToRotation(A.position, B.position);
        C.rotation = q;
        Debug.DrawLine(Vector3.zero, A.position, Color.red);
        Debug.DrawLine(Vector3.zero, B.position, Color.green);
        Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f), Color.black);
        Debug.DrawLine(C.position, C.TransformPoint(Vector3.up * 1.5f), Color.yellow);
    }
}

运行结果如下图所示:


小狮子
3楼 · 2020-12-10 17:58

1.初始化物体旋转角度为0

Instantiate(ObjectPrefab, transform.position, Quaternion.identity);

2. 初始化物体带有旋转角度

Instantiate(ObjectPrefab, Vector3.zero, Quaternion.Euler(0, 35, 0));

3.物体始终转向目标物体

Vector3 directionToFace = _sphere.position - transform.position;        //先算出与目标物体之间的位移差
Debug.DrawRay(transform.position, directionToFace, Color.green);   //画出射线,可以很明显地看出与目标物体之间的关系
transform.rotation = Quaternion.LookRotation(directionToFace);        //使用LookRotation让物体朝向目标体

4.物体缓慢转向目标物体

Vector3 directionToFace = _sphere.position - transform.position;      
Debug.DrawRay(transform.position, directionToFace, Color.green);
Quaternion targetRotation = Quaternion.LookRotation(directionToFace);     //先将旋转值保存出来

transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime);    //使用Slerp将旋转值以一定时间实现


嘿呦嘿呦拔萝卜
4楼 · 2020-12-14 14:00

Vector3 directionToFace = _sphere.position - transform.position;      
Debug.DrawRay(transform.position, directionToFace, Color.green);
Quaternion targetRotation = Quaternion.LookRotation(directionToFace);     //先将旋转值保存出来

transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime);    //使用Slerp将旋转值以一定时间实现


Ross
5楼 · 2020-12-15 20:39

Quaternion是四元数类,主要用来负责物体的旋转的,常用的属性有identity,表示物体没有旋转,常用方法有:LookRotation(得到要旋转到目标的角度值),Lerp(物体由快到慢的旋转到目标角度),Eular(把向量转成四元数)

studentaaa
6楼 · 2020-12-20 10:13

旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合。


那么,四元数又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢?


在Unity里,tranform组件有一个变量名为rotation,它的类型就是四元数。很多初学者会直接取rotation的x、y、z,认为它们分别对应了Transform面板里R的各个分量。当然很快我们就会发现这是完全不对的。实际上,四元数的x、y、z和R的那三个值从直观上来讲没什么关系,当然会存在一个表达式可以转换,


相关问题推荐

  • 回答 17

    还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学  学学js flash as等等  有个梯度就好多了如果要用好unity  不会编程那是不行的  学习的过程中都有个头疼的过程  记住  头越痛  代表你要接受的东西越多  坚持 你的大脑在和知识兼容中:D...

  • unity如何自学Unity3D 2022-01-06 15:24
    回答 18

    可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 2

    Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...

  • 回答 4

    文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细具体代码实现如下:Shader Custom/shuibowen{ Properties{ _MainTex(Base (RGB),2D)=white{} _distanceFactor(Distancefactor,float)=1 _timeFactor(time factor,float)=...

  • 回答 7

    策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样!    游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...

  • 回答 7
    已采纳

    可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。

  • 回答 3
    已采纳

    游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...

  • 回答 4

    学习新知识的时候,首先要了解这个东西最基本的知识点,打好基础很重要,今天要和大家介绍的是Unity中最基本的也是最常用的一个类——Quaternion(四元数),会把Quaternion类中的所有函数基本都介绍下,希望可以帮到大家。1、Angle函数public static float...

  • 回答 8

    Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言,四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维...

没有解决我的问题,去提问