zoukankan      html  css  js  c++  java
  • unity3d中的Quaternion.LookRotation

    android开发范例中的第二个粒子,是摇杆操作游戏,模式类似于“迷你高尔”,僵尸包围类型的设计游戏。

    其中让我注意到这个函数的使用非常特别:Quaternion.LookRotation

    游戏针对两个平台做了输入配置。

    在pc平台上控制人物移动用正常的上下左右按键控制,然而人物的旋转就变成了鼠标位置。

    正常情况我们希望东西能够根据指定目标方向移动其实用lookat这个函数就可以了。但这个地方用的方法原比lookat来的更加省事儿。

    看看他是怎么获得这个角度的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //Find the center of the screen
                tempVector2 = new Vector3(Screen.width * 0.5f,0,Screen.height * 0.5f);
                //Get mouse position
                tempVector = Input.mousePosition;
                //Set tempVector z to tempVector.y
                tempVector.z = tempVector.y;
                //Set tempVector y to 0
                tempVector.y = 0;
                //Set lookDir to  tempVector - tempVector2
                lookDir = tempVector - tempVector2;

    是的,先得到屏幕中央坐标,然后把鼠标坐标(由于是俯视类游戏,y轴坐标变为z轴)减去中央坐标,接着:

    1
    2
    //Rotate player
            transform.rotation =     Quaternion.LookRotation(lookDir);

    结束了,目标旋转了,而且通过测试,可以发现无论是否是俯视类游戏都可以正常旋转。回过头来想想自己当初使用的方法:

    1.获得鼠标位置,向地面发射射线。

    2.将射线和地面的碰撞坐标记录。

    3.通过lookat旋转。

    对于崎岖的山地我的方法似乎就显得可笑了,呵呵。

    Quaternion.LookRotation似乎是用类似于向量的方法,在确定圆心位置的情况下计算出相应位移所形成的角度。

    有一位前辈的博客是这样描述的:http://blog.csdn.net/janpylx/article/details/7776465

    事实上我看不懂,呵呵。

    接着来看另一处使用这个函数的地方,那就是在手机平台时使用摇杆,根据摇杆的方向旋转目标的方向。这里用的是官方提供的joystick脚本,js写的。看看它是如何获取并旋转的。

    1
    2
    3
    4
    5
    6
    7
    8
    //Get right joystick x position
                float lX = rightJoystick.GetComponent<Joystick>().position.x;
                //Get right joystick y position
                float lY = rightJoystick.GetComponent<Joystick>().position.y;
    //Set lookDir x to joystick x position and dir z joystick y position
                    lookDir = new Vector3(lX,0,lY);
    //Rotate player
            transform.rotation = Quaternion.LookRotation(lookDir);

    我自己一开始没有看明白,为什么就是直接调用position的位置就可以旋转了,知道我看了joystick的代码:

    1
    2
    3
    // For a touchpad, let's just set the position directly based on distance from initial touchdown
                        position.x = Mathf.Clamp( ( touch.position.x - fingerDownPos.x ) / ( touchZone.width / 2 ), -1, 1 );
                        position.y = Mathf.Clamp( ( touch.position.y - fingerDownPos.y ) / ( touchZone.height / 2 ), -1, 1 );

    是的,他用的是同样的原理,圆点坐标和当前坐标的差值。

    所以关于Quaternion.LookRotation我的理解是旋转两个指定坐标间形成的夹角。

  • 相关阅读:
    递归的狂想(菜鸟的胡思乱想)
    关于fiddler的使用总结
    关于mac下 sublime 安装配置java及运行java个人建议
    关于VMwareFusion占用内存过多的问题提几点自己的解决方案
    (ubuntu)ubuntu的root密码设置
    Refactoring to Patterns 学习笔记2 为什么要重构?
    Refactoring to Patterns 学习笔记1 什么是重构?
    [转载]数据结构树之红黑树
    【转载】数据结构之图(存储结构、遍历)
    STL库之单链表:forward_list
  • 原文地址:https://www.cnblogs.com/forlove/p/3795612.html
Copyright © 2011-2022 走看看