我有一个第一人称相机控制器实现如下:
float rotSpeed = 20.0f;
xRotation += deltaPos.y * rotSpeed * Time.deltaTime;
yRotation += deltaPos.x * -rotSpeed * Time.deltaTime;
while(xRotation > 360.0f) xRotation -= 360.0f;
while(xRotation < 0.0f) xRotation += 360.0f;
while(yRotation > 360.0f) yRotation -= 360.0f;
while(yRotation < 0.0f) yRotation += 360.0f;
cam.transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);
我希望相机能够捕捉3D空间中的某个目标。
如果我使用transform.LookAt(目标),摄像机控制器只会将视图向后捕捉到它所来自的位置,并且在调用LookAt()之后我无法从摄像机的旋转设置xRotation和yRotation,因为LookAt()有时会产生一个Z旋转的四元数。
那么如何找到将相机指向某个目标所需的X和Y旋转?
答案 0 :(得分:1)
您可以使用Quaternion.LookRotation轻松修改玩家的轮播,然后使用Quaternion.Lerp进行插值。
public Transform target;
float turnSpeed = 5.0f;
Quaternion lookAt = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Lerp(transform.rotation, lookAt, Time.smoothDeltaTime * turnSpeed);
变换是玩家的变换。
您需要做的就是确定何时应该执行捕捉规则。
后记:实际上可能并非全部。如果目标/玩家位置倾向于移动很多,您可能会遇到“死区”,其中LookRotation无法在其目标上实现捕捉。有关此问题的更多详细信息(和解决方案)here