- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 openGL,但这基本上是一道数学题。我正在尝试计算投影矩阵,我在 View 平面 R(x,y,z) 和该平面的法向量 N(n1,n2,n3) 上有一个点。我也知道眼睛位于 (0,0,0),我猜用技术术语来说它是透视引用点。我怎样才能从这些数据中得出透视投影?我知道如何以常规方式获取 FOV、宽高比以及近平面和远平面。
最佳答案
我认为您将这个问题放在“opengl”标签下造成了一些困惑。问题在于,在计算机图形学中,术语投影 并不是严格的数学意义上的理解。
在数学中,投影被定义为(以下不是确切的数学定义,只是我自己的解释)当应用两次时不会进一步改变结果。想想看。当您将 3d 空间中的一个点投影到 2d 平面(仍在该 3d 空间中)时,每个点的投影最终都会落在该平面上。但是已经在该平面上的点不再移动,因此您可以根据需要多次应用它,而无需进一步改变结果。
计算机图形学中的经典“投影”矩阵不会这样做。它们转换空间的方式是将一般平截头体映射到立方体(或长方体)。为此,您基本上需要所有参数来描述视锥体,通常是纵横比、视野角、到近平面和远平面的距离,以及投影方向和中心点(后两者通常是隐含的)按惯例定义)。对于一般情况,还存在水平和垂直不对称分量(将其视为投影仪的“镜头移位”)。所有这些都是计算机图形学中典型的投影矩阵所代表的。
根据您提供的参数构建这样的矩阵实际上是不可能的,因为您缺少很多参数。另外 - 我认为这是一种揭示 - 你已经给出了一个 View 平面。但是到目前为止讨论的投影矩阵没有定义一个 View 平面 - 任何平行于近平面或远平面并且在相机前面的平面都可以想象为观察平面(在相机后面也可以,但是图像会被镜像), 如果你需要的话。但从严格意义上讲,如果所有投影点也最终位于该平面上,那么它只会是一个“ View 平面”——计算机图形透视矩阵明确地不会这样做。相反,它保留了它们的 3d 距离信息 - 这也意味着操作是可逆的,而经典数学投影通常不是。
综上所述,我只是猜测您正在寻找的是从 3D 空间到 2D 平面的透视投影,而不是用于计算机图形的透视变换。您需要的所有参数只是视点和平面。请注意,这正是您给出的内容:投影中心应为原点,R
和 N
定义平面。
这样的投影也可以用 4x4 齐次矩阵表示。您的问题中没有定义一件事:法线的方向。我再次假设标准数学约定并假设 View 平面定义为 <N,x> + d = 0
.来自使用 R
在那个等式中,我们可以得到 d = -N_x*R_x - N_y*R_y - N_z*R_z
.所以投影矩阵就是
( 1 0 0 0 )
( 0 1 0 0 )
( 0 0 1 0 )
(-N_x/d -N_y/d -N_z/d 0 )
这个矩阵有几个属性。有一个零列,所以它是不可逆的。另请注意,对于每个点 (s*x, s*y, s*z, 1)
你应用它,结果(除以结果 w
之后,当然)是一样的,不管 s
是什么是 - 所以原点和 (x,y,z)
之间的直线上的每个点将导致相同的投影点 - 这就是透视投影应该做的。最后注意 w=(N_x*x + N_y*y + N_z*z)/-d
,所以对于满足上述平面方程的每个点,w= -d/-d = 1
将导致。结合其他维度的恒等变换,正好说明这样一个点是不变的。
关于opengl - 根据视平面计算透视投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376001/
我正在尝试获得一个按钮,按下该按钮时会改变颜色。当再次按下时,它应该变回原来的颜色。我究竟做错了什么? 我的模板中的按钮: export default { data: {
我是一名优秀的程序员,十分优秀!