提问人:Vincent Mazzarella 提问时间:3/11/2023 更新时间:3/11/2023 访问量:30
相对于自协和(非全局协和)旋转对象
Rotate an object relative to self cordinates (not global cordinates)
问:
首先对不起,但我的英语说得不太好。所以我希望我能够尽我所能解释自己。正如标题所说,我正在尝试旋转一个对象,以便对象根据其轴的旋转方式旋转。我知道我的目的很奇怪,但事实是,我只是想玩轮换,以便理解它们。实际上在互联网上搜索,我找到了如何做到这一点,但问题是我需要使用钳制值,所以我需要找到另一种方法来做到这一点。我将粘贴代码,以便您更好地理解。请随时向我建议另一种解决我问题的方法。
[Header("Camera")]
[SerializeField] private Camera _camera;
[SerializeField] private Vector2 _xMinMaxRotation = new Vector2(-90, 90);
[SerializeField] private Vector2 _yMinMaxRotation = new Vector2(-90, 90);
[SerializeField] private float _mouseXSensistivity = 1;
[SerializeField] private float _mouseYSensistivity = 1;
[SerializeField] private float _mouseZSensistivity = 1;
[SerializeField] private float _xStartRotation = 0;
[SerializeField] private float _yStartRotation = 0;
private Vector2 _mouseDelta;
private float _rotY, _rotX, _rotZ;
public GameObject head;
void Start() {
Cursor.lockState = CursorLockMode.Locked;
}
void Update() {
_mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
MoveCamera();
}
private void MoveCamera() {
if (_mouseDelta.x != 0) {
_rotX = _mouseDelta.x * _mouseXSensistivity * Time.deltaTime * 50;
_rotX = Mathf.Clamp(_rotX, _xMinMaxRotation.x, _xMinMaxRotation.y);
transform.rotation = transform.rotation * Quaternion.Euler(0, _rotX, 0);
}
if (_mouseDelta.y != 0) {
_rotY = _mouseDelta.y * _mouseYSensistivity * Time.deltaTime * 50;
_rotY = Mathf.Clamp(_rotY, _yMinMaxRotation.x, _yMinMaxRotation.y);
transform.rotation = transform.rotation * Quaternion.Euler(-_rotY, 0, 0);
}
//Calculation for RotZ
if (Input.GetKey(KeyCode.Q)) {
_rotZ = _mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ > 25) _rotZ = 25;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
else {
if (_rotZ > 0) {
_rotZ = 2 * _mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ < 0) _rotZ = 0;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
}
if (Input.GetKey(KeyCode.E)) {
_rotZ = -_mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ < -25) _rotZ = -25;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
else {
if (_rotZ < 0) {
_rotZ = 2 * -_mouseZSensistivity * Time.deltaTime * 50;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
if (_rotZ > 0) _rotZ = 0;
transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
}
}
}
我的游戏对象中没有任何父级,因此我无法使用transform.localRotation或localEulerAngles之类的东西。想象一下,如果我有一个角色,而不是使用世界坐标来旋转他的 POV,我想使用它自己的轴方向来做到这一点。我可以使用转换方法。旋转并将自定向作为第二个参数传递,它会起作用。但是我想找到一种方法在 y 轴上旋转我的游戏对象,直到达到某些限制。例如,将值限制为最小值 -90 和最大值 90。正如我所说,可以自由地更改我的代码,并向我建议您认为的最佳选择。多谢。
答: 暂无答案
上一个:从远处创建矢量?
评论
transform.rotation * Quaternion.Euler(…)