我正在尝试了解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]。
我希望我可以方便地提取视图矩阵的第三列,并将其用作正向向量以用于translate
转换,例如,假设我想将照相机向正向平移。
答案 0 :(得分:3)
您显示的代码使用右手坐标系,其中(相机系统中的)视图方向沿负z方向。这就是为什么
public class SyncReentry {
public static void main(String[] args) {
synchronized (SyncReentry.class) {
synchronized (SyncReentry.class) {
// ...write synchronized block for ever
}
}
}
}
因此,只需否定该条目即可获得前进方向。
请记住,查找功能通常会创建一个视图矩阵,该视图矩阵是相机模型矩阵的逆矩阵。那么,前进方向实际上是取反的第三行(不是第三列)。顺便说一下,这也是您的代码所做的。