从Euler Angles控制正交相机的位置和方向

时间:2016-10-21 17:56:38

标签: python math camera

尝试从欧拉角度控制正射摄影机位置(x,y,z)和向上矢量(摄像机顶部)。

我有一个带有IMU的真实世界设备,它可以沿每个轴(x,y,z)输出旋转。我正在尝试将这些角度转换为相机眼睛位置和向上矢量方向。如果更改了物理设备,则方向的更改应反映在摄像机位置的变化中。

我在这个映射背后的数学运算上遇到了困难,并且在我尝试过的事情上没有太多运气。我可以让单轴旋转工作,但多轴是一个问题。将偏航,俯仰和滚动从物理设备映射到相机的位置和向上矢量的任何帮助都将是惊人的。数学证明对我来说是一个很大的问题。

相机与物体和目标点之间的距离应保持不变。

radius = camera.target.distanceTo(camera.eye)
pos = get_data()
#convert to radians and cast to float
roll = float(pos['x'])*(math.pi/180.0)
pitch = float(pos['y'])*(math.pi/180.0)
yaw = float(pos['z'])*(math.pi/180.0)

x = camera.eye.x
y = camera.eye.y
z = camera.eye.z

x = x*math.cos(pitch)*math.sin(yaw)
y = y*math.cos(yaw)*math.cos(pitch)
z = z*math.sin(pitch)

eye = Point3D.create(x,y,z)

camera.eye = eye
camera.target = target      
camera.upVector = up

1 个答案:

答案 0 :(得分:0)

如果您的欧拉角表示绝对旋转,则可以计算旋转矩阵R。你如何做到这一点取决于欧拉角的定义,这应该在文档中描述。它可能是:

R = rotateY(yaw) * rotateX(pitch) * rotateZ(roll)

同样,这只是一个例子。正确的公式取决于欧拉角的顺序及其解释。

然后可以将相机的模型矩阵计算为:

cam = translation(target) * R * translation(0, 0, radius)

(或-radius用于左手坐标系)。 translation()计算翻译矩阵。

这背后的直觉是你将相机移动到目标,然后根据R旋转它,然后再移动radius

如果你有这个矩阵,摄像机的向上矢量将是它的第二列,眼睛向量将是它的第四列。如果您只需要一个视图矩阵,请使用cam的反向。

注意:上面的解释假设向量被视为列向量。如果它们被视为行向量(例如在DirectX中很常见),则必须相应地调整计算。