1

希望简单的答案,但我无法得到它。

我有一个我写的 3D 渲染引擎。

我有相机位置、观察位置和向上向量。

我希望能够向左、向右、向上和向下“倾斜”相机。就像固定三脚架上的相机一样,您可以抓住手柄并将其向上、向下、向左、向右等倾斜。

数学难倒我。我已经能够进行向前/向后推车和向上/向下/向左/向右平移,但无法计算出矢量数学以使其倾斜。

对于左右倾斜,我想围绕相机位置旋转观察位置,但我需要考虑向上矢量,否则旋转不知道要转哪个轴。

我需要的数学/算法是......

相机=(cx,cy,cz)看=(lx,ly,lz)向上=(ux,uy,uz)

RotatePointAroundVector(lx,ly,lz,ux,uy,uz,amount)

任何人都可以协助所涉及的数学吗?

非常感谢。

4

3 回答 3

2

您可以在相机前面制作一个点,然后围绕相机旋转(使用 trig)并使用您的 lookat() 旋转相机。

一旦您必须开始使用滚动(围绕 Z 旋转),这将不起作用。所以你可能想创建一个基于四元数的相机类。这个链接帮助了我:gpwiki.org/Quaternion...

于 2010-01-15T12:28:56.950 回答
0

它在数学上可能不是最优的,但您可以将相机的观察向量分解为三个向量 - 两个定义水平面,一个向上向量。

为了得到水平面,你可以得到一个向量作为向上向量和相机到观察向量的叉积。然后,您可以通过对 up 和刚刚找到的向量进行点积来获得另一个正交向量。不要忘记标准化你的三个向量。

接下来将相机的点积与您的三个向量一起查看向量,然后围绕水平面进行旋转(将向量视为坐标轴)。

很抱歉把这一切都用语言表达出来。我希望这有帮助。

于 2010-01-15T03:46:55.880 回答
0

基本上,您可以可视化相机的局部坐标系

局部 Z是观察向量(从相机中心到观察点)并且“进入屏幕”。局部 Y将朝向屏幕上方。如果您保持相机向上矢量垂直于相机观察矢量,则向上矢量也是局部 Y。局部 X将垂直于其他两个轴(这是它们归一化后的叉积)。

左右旋转是围绕局部 Y 轴(偏航)旋转观察向量的问题。上下旋转是围绕局部 X 轴(俯仰)旋转上矢量和观察矢量的问题。“倾斜头部”左右是围绕局部 Z 轴(坡度)向上旋转矢量的问题。

每次更改查看向量或向上向量时,都需要重新计算局部轴。

于 2010-06-14T01:09:42.840 回答