unity3d中的Quaternion.LookRotation函数的一些理解~

本文探讨了Unity3D中Quaternion.LookRotation函数在游戏开发中的应用,特别是在PC和手机平台上控制角色旋转的方式。通过对比传统的LookAt方法,解释了LookRotation如何更简单地实现旋转,并举例说明其在摇杆操作中的实现原理,总结为利用两坐标间的夹角进行旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天开始看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.youkuaiyun.com/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我的理解是旋转两个指定坐标间形成的夹角。

如果有异议,欢迎留言赐教才好呀,谢谢

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值