“看”功能返回的视图矩阵具有错误的前向位置? (Python实现)

时间:2019-02-27 02:13:17

标签: python opengl graphics

我正在尝试了解gluLookAt的实现,在Python中遵循。

import numpy as np

def lookAt(center, target, up):
    f = (target - center); f = f/np.linalg.norm(f)
    s = np.cross(f, up); s = s/np.linalg.norm(s)
    u = np.cross(s, f); u = u/np.linalg.norm(u)

    m = np.zeros((4, 4))
    m[0, :-1] = s
    m[1, :-1] = u
    m[2, :-1] = -f
    m[-1, -1] = 1.0

    return m

# test case 1
center = np.array([0.0, 0.0, 0.0])
target = np.array([0.0, 0.0, -1.0])
up = np.array([0.0, 1.0, 0.0])

view = lookAt(center, target, up)
print('c: {}, t: {}, up: {}'.format(center, target, up))
print('view: \n', view)
print('forward: \n', -view[2, :-1])
print('\n')

# test case 2
center = np.array([0.0, 0.0, 0.0])
target = np.array([-1.0, 0.0, 0.0])
up = np.array([0.0, 1.0, 0.0])

view = lookAt(center, target, up)
print('c: {}, t: {}, up: {}'.format(center, target, up))
print('view: \n', view)
print('forward: \n', -view[2, :-1])

这是输出:

c: [0. 0. 0.], t: [ 0.  0. -1.], up: [0. 1. 0.]
view: 
 [[ 1. -0.  0.  0.]
 [ 0.  1.  0.  0.]
 [-0. -0.  1.  0.]
 [ 0.  0.  0.  1.]]
forward: 
 [-0. -0. -1.]


c: [0. 0. 0.], t: [-1.  0.  0.], up: [0. 1. 0.]
view: 
 [[ 0.  0. -1.  0.]
 [ 0.  1.  0.  0.]
 [ 1. -0. -0.  0.]
 [ 0.  0.  0.  1.]]
forward: 
 [ -1. -0.  0.]

我的问题是:为什么当我指定摄像机位置[0,0,0]指向[0,0,-1]并向上[0,1,0]时,我得到一个第三列是[0,0,1,0]而不是[0,0,-1,0]的变换矩阵?根据下图,我希望第三列代表前向矢量,在上述示例中,前向矢量应为[0,0,-1,0]。

enter image description here

我希望我可以方便地提取视图矩阵的第三列,并将其用作正向向量以用于translate转换,例如,假设我想将照相机向正向平移。

1 个答案:

答案 0 :(得分:3)

您显示的代码使用右手坐标系,其中(相机系统中的)视图方向沿负z方向。这就是为什么

public class SyncReentry {
    public static void main(String[] args) {
        synchronized (SyncReentry.class) {
            synchronized (SyncReentry.class) {
                // ...write synchronized block for ever
            }
        }
    }
}

因此,只需否定该条目即可获得前进方向。

请记住,查找功能通常会创建一个视图矩阵,该视图矩阵是相机模型矩阵的逆矩阵。那么,前进方向实际上是取反的第三行(不是第三列)。顺便说一下,这也是您的代码所做的。