Unity VR游戏开发中Translate遇到的坐标系问题

本文详细介绍了在Unity中使用Rigidbody组件和Transform组件进行VR控制器移动的区别。通过代码示例展示了如何实现VR视角方向的移动,并解释了Transform.translate在不同空间坐标系下的行为差异,强调了Space.World参数对于正确实现VR移动的重要性。

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

废话不说上代码

	void StickMovement_NotFixed()
	{
			if (OVRInput.Get(OVRInput.Button.PrimaryThumbstickUp)||OVRInput.Get(OVRInput.Button.PrimaryThumbstickDown) ||
	    OVRInput.Get(OVRInput.Button.PrimaryThumbstickLeft)||OVRInput.Get(OVRInput.Button.PrimaryThumbstickRight))
		{
		//if(OVRInput.Get(OVRInput.Button.PrimaryThumbstick)){
		Quaternion ort = CameraRig.centerEyeAnchor.rotation;
		Vector3 ortEuler = ort.eulerAngles;
		ortEuler.z = ortEuler.x = 0f;
		ort = Quaternion.Euler(ortEuler);

		Vector3 moveDir = Vector3.zero;
		Vector2 primaryAxis = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);
		moveDir += ort * (primaryAxis.x * Vector3.right);
		moveDir += ort * (primaryAxis.y * Vector3.forward);
		//_rigidbody.MovePosition(_rigidbody.transform.position + moveDir * Speed * Time.fixedDeltaTime);

		//这个按上摇杆前进是顺着VR看着的前方前进的
		_rigidbody.MovePosition(_rigidbody.position + moveDir * Speed * Time.deltaTime);
		//这个不能顺着VR看着的前方前进,是固定一个移动方向的,原因是translate默认是space.self
		this.transform.Translate(moveDir*Speed*Time.deltaTime);
		//这个就能和第一个效果一样了
		   this.transform.Translate(moveDir*Speed*Time.deltaTime,Space.World);
		}
	}

当我使用_rigidbody.MovePosition(_rigidbody.position + moveDir * Speed * Time.deltaTime);

的时候,摇杆控制前推,角色可以顺着VR的前进方向移动

当我使用this.transform.Translate(moveDir*Speed*Time.deltaTime);的时候

,摇杆前推,但是并不能使得角色向VR看着的方向移动

当我使用 this.transform.Translate(moveDir*Speed*Time.deltaTime,Space.World);的时候

摇杆前推,角色可以向VR看着的方向移动,和第一个效果一样

原因,translate接口第二个参数省缺的时候默认是Space.self,因此导致移动方向是按照自己的坐标,所以移动方向都是相对于自己来说的,所以都是固定的

但使用Space.world的时候,就是相对的世界坐标,自然就可以随着VR视线改变的方向进行对应的移动了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值