如何在 3d space 中计算新的相机位置和旋转以在移动 3d 对象后获得完全相同的视图?
How to calculate the new camera position and rotation in a 3d space to get the exact same view of an 3d object after it is moved?
我有一个 3d 对象 (Obj) 和一个相机 (Cam) 指向该对象。相机 FOV、分辨率、位置和旋转与对象的位置和旋转一起给出。
然后,我们通过一些随机数(已知)改变 Obj 的位置和旋转。我需要的是通过仅更改 Cam 的位置和旋转来获得与其原始位置完全相同的 Obj 视图。
如何计算新相机的位置和旋转?
(1) if Obj moves
在 Cam 的代码中创建属性 Vector3 deltaPosition
。通过评估 Cam 和 Obj 之间的距离来初始化它。
void Start(){
deltaPosition = transform.position - Obj.transform.position;
}
在 Update()
中,确保 Cam 与 Obj 保持相同的距离,即:
void Update(){
transform.position + deltaPosition;
}
(2) if Obj rotates
假设 Obj 处于欧拉角 (x0, y0, z0) 并旋转到欧拉角 (x1, y1, z1)。您所要做的就是围绕 Obj 的位置旋转 deltaPosition
(x1 - x0, y1 - y0, z1 - z0) 度。为此,您还必须将 Obj 的初始旋转存储在另一个属性 Vector3 objRotation
:
void Start(){
deltaPosition = transform.position - Obj.transform.position;
objRotation = Obj.transform.eulerAngles;
}
并确保每一帧都正确调整:
void Update(){
deltaPosition = RotatePointAroundPivot(
deltaPosition,
Obj.transform.position,
Obj.transform.eulerAngles - objRotation
);
transform.position + deltaPosition;
objRotation = Obj.transform.eulerAngles;
}
public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) {
return Quaternion.Euler(angles) * (point - pivot) + pivot;
}
这应该可以解决问题。
我有一个 3d 对象 (Obj) 和一个相机 (Cam) 指向该对象。相机 FOV、分辨率、位置和旋转与对象的位置和旋转一起给出。 然后,我们通过一些随机数(已知)改变 Obj 的位置和旋转。我需要的是通过仅更改 Cam 的位置和旋转来获得与其原始位置完全相同的 Obj 视图。 如何计算新相机的位置和旋转?
(1) if Obj moves
在 Cam 的代码中创建属性 Vector3 deltaPosition
。通过评估 Cam 和 Obj 之间的距离来初始化它。
void Start(){
deltaPosition = transform.position - Obj.transform.position;
}
在 Update()
中,确保 Cam 与 Obj 保持相同的距离,即:
void Update(){
transform.position + deltaPosition;
}
(2) if Obj rotates
假设 Obj 处于欧拉角 (x0, y0, z0) 并旋转到欧拉角 (x1, y1, z1)。您所要做的就是围绕 Obj 的位置旋转 deltaPosition
(x1 - x0, y1 - y0, z1 - z0) 度。为此,您还必须将 Obj 的初始旋转存储在另一个属性 Vector3 objRotation
:
void Start(){
deltaPosition = transform.position - Obj.transform.position;
objRotation = Obj.transform.eulerAngles;
}
并确保每一帧都正确调整:
void Update(){
deltaPosition = RotatePointAroundPivot(
deltaPosition,
Obj.transform.position,
Obj.transform.eulerAngles - objRotation
);
transform.position + deltaPosition;
objRotation = Obj.transform.eulerAngles;
}
public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) {
return Quaternion.Euler(angles) * (point - pivot) + pivot;
}
这应该可以解决问题。