在给定的脚本中,摄像机在游戏开始时设置在某个位置。要调整视图,我必须使用鼠标拖动。但是,第一次单击屏幕时,相机位置和角度会略有变化。
public class CameraOrbit : MonoBehaviour
{
public Camera cam;
public Transform target;
public float radius = 10;
private Vector3 currentPosition;
public Vector3 positionPreOffset;
public Vector3 rotationPreOffset;
private void Start()
{
// Calculate the initial camera position based on target, position offset, and rotation offset.
Vector3 desiredPosition = target.position + target.rotation * positionPreOffset;
cam.transform.position = desiredPosition;
Quaternion desiredRotation = target.rotation * Quaternion.Euler(rotationPreOffset);
cam.transform.rotation = desiredRotation;
// Store the current camera position and calculate the radius.
currentPosition = cam.transform.position;
radius = currentPosition.magnitude;
}
private void LateUpdate()
{
if (Input.GetMouseButtonDown(0))
{
// Store the current mouse position when the left mouse button is clicked.
currentPosition = cam.ScreenToViewportPoint(Input.mousePosition);
}
else if (Input.GetMouseButton(0))
{
// Calculate the new mouse position.
Vector3 newPosition = cam.ScreenToViewportPoint(Input.mousePosition);
// Calculate the direction of mouse movement.
Vector3 direction = currentPosition - newPosition;
// Calculate rotation angles based on mouse movement.
float rotationYAxis = -direction.x * 90;
float rotationXAxis = direction.y * 90;
// Reset the camera's position to the target's position.
cam.transform.position = target.transform.position;
// Apply the calculated rotations to the camera's rotation.
cam.transform.rotation *= Quaternion.Euler(rotXaxis, rotYaxis, 0);
cam.transform.Translate (new Vector3(0, 0, -radius));
currentPosition = newPosition;
}
我希望相机的位置在第一次鼠标单击屏幕时不会改变,并在调整/更改视图之前保持其位置和角度。
你完全忽略了之前应用的
positionPreOffset
和rotationPreOffset
。
Transform.RotateAround
:
private void LateUpdate()
{
if (Input.GetMouseButtonDown(0))
{
// Store the current mouse position when the left mouse button is clicked.
currentPosition = cam.ScreenToViewportPoint(Input.mousePosition);
}
else if (Input.GetMouseButton(0))
{
// Calculate the new mouse position.
var newPosition = cam.ScreenToViewportPoint(Input.mousePosition);
// Calculate the direction of mouse movement.
var direction = currentPosition - newPosition;
// Calculate rotation angles based on mouse movement.
var rotationYAxis = -direction.x * 90;
var rotationXAxis = direction.y * 90;
cam.transform.RotateAround(target.position, Vector3.up, rotationYAxis);
cam.transform.RotateAround(target.position, cam.transform.right, rotationXAxis);
currentPosition = newPosition;
}
}
顺便说一句,还解决了在本地空间中进行两次旋转的问题,而现在可以在全局 Y 轴上正确旋转