我有这个obj文件(也尝试过其他更多的3D模型):
Triangle
v 0 0 0
v 0 0.5 0
v 1 0 0
f 1 2 3
我使用以下顶点着色器:
uniform mat4 projection;
attribute vec4 pos;
void main(void)
{
gl_Position = projection* pos;
}
超级简单。如果我只使用uniform_Projection =单位矩阵运行它,我会看到一个三角形,向上0.5和1。似乎没错。
现在,我想做的是使用相机ala gluLookAt以及一些透视投影。这就是我感到困惑的地方。
在世界坐标中,三角形位于上方的顶点位置。所以,让我们选择一个眼睛和一个观察点。 eye =(0,0,3),lookAt =(0,0,0)。基本上我们希望眼睛处于起源。因此,我们必须将世界原点移动到眼睛位置(即使它是单位矩阵,也要这样做):
| 1 0 0 0 | | 1 0 0 0 | | 1 0 0 0 |
| 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
| 0 0 1 -3| | 0 0 1 0 | | 0 0 1 -3|
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |
繁荣,三角形消失了......我所做的就是沿着原始相机的方向移动世界。 eye =(0,0,3)仍然消失了......超级困惑:S我已经关闭了任何形式的剔除等。有人可以向我解释这是如何工作的吗?
因为后来我的想法如下:
v = normalize(lookat-eye)
r = normalize(crossProduct(v, up));
u = crossProduct(r, v);
viewMatrix = |r1 r2 r3 -eye1|
|u1 u2 u3 -eye1|
|v1 v2 v3 -eye1|
|0 0 0 1 |
作为一个投影矩阵,我正在思考(来自我的讲座):
projMatrix = |1 0 0 0|
|0 1 0 0|
|0 0 1 0|
|0 0 -1/d 1|
或者这个链接: gluPerspective was removed in OpenGL 3.1, any replacements? 不能说我现在完全理解他们中的任何一个。
对我而言,似乎我不了解坐标系如何运作的一些关键部分。
答案 0 :(得分:1)
你对这个矩阵的问题:
| 1 0 0 0 | | 1 0 0 0 | | 1 0 0 0 |
| 0 1 0 0 | * | 0 1 0 0 | = | 0 1 0 0 |
| 0 0 1 -3| | 0 0 1 0 | | 0 0 1 -3|
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |
你是否翻译了它,但你根本没有调整剪裁平面。默认身份投影矩阵在Z轴上从-1剪辑到1。你已经将你的眼睛转换为Z = 3,所以你的新剪裁平面从4到2,你的三角形在这个范围之外,所以它被剪裁了。
因此,如果你想要移动你的眼睛,你需要一个新的投影矩阵。既然你在谈论透视,我建议你自己从gluPerspective实现方程式,或者下载一个为你生成投影矩阵的库,比如OpenGL Mathematics