math - 如何计算变换矩阵

标签 math graphics rotation

我正在从固定点渲染网格模型的 View ,即我实际上将相机放置在世界空间中的已知坐标处。例如,请参见下图: enter image description here

我会将相机放置在我知道坐标的每个红色顶点处。如何计算出相机的变换矩阵?例如,如果我希望将其移动到的位置是(x,y,z),那么我知道翻译显然是[x,y,z]。但是,它还必须面对 (0,0,0) 这意味着它必须旋转,我只是不知道如何计算这个旋转。

我本质上是想恢复相机的 4x4 变换矩阵,它看起来像

|r11 r12 r13 0|
|r21 r22 r23 0|
|r31 r32 r33 0|
| x   y   z  1|

感谢任何帮助

最佳答案

通常,您有与其状态相关联的相机方向。该方向通常被捕获为法线 View (VPN) 和 View 向上矢量 (VUV)。有时,拥有右 View 向量 (VRV) 或左 View 向量 (VLV) 可能很有用(但不是必需的),它们只是另外两个向量的叉积。

为了将相机从一个位置 V0 = (x, y, z) 旋转到另一个 V1 = (x', y', z') 在让它保持朝向 (0, 0, 0) 的视角的同时,您只需将变换的旋转部分应用于各个 View 向量。由于您只是在球体表面上旋转相机位置,因此这应该保留相机所指向的点。

要计算此值,旋转向量为 R = V0×V1 (可能顺序错误......但这应该给你一个想法)并且角度由 θ = cos-1[(V0V1)/||V0|| ||V1||]。您可以使用 QuaternionsAngle-Axis Rotation Matrix旋转相机的位置和方向。

或者,如果您使用 OpenGL,则有一个函数可以为您完成此操作。它的名字叫gluLookat 。我不知道它是否已被弃用,取而代之的是其他东西,但在当时,它非常有用。

关于math - 如何计算变换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019968/

相关文章:

java - 使用 Java 计算标准差?

c++ - 二阶线性递推方程的矩阵表示

user-interface - Racket 中的游戏编程

java - 处理三角函数代码不起作用

javascript - 为什么当我在最后一个 else 语句中更改 slaying 时,浏览器会崩溃

c# - 随机分配不同面值的纸币以匹配总面值

c++ - 从正交投影平滑过渡到透视投影?

java - 如何在 Piccolo2D 中的形状上打洞?

rotation - 在 Three.js 中保持基于父/其他对象坐标系的对象旋转?

cocoa - NSImageViews 中的图像随机颠倒