我正在尝试使用Haskell和OpenGL实现透视投影转换。
我的顶点设置如下:
let vertices =
[ -0.3, 0.3, 0, -- Front Top Left 0
0.3, 0.3, 0, -- Front Top Right 1
0.3, -0.3, 0, -- Front Bottom Right 2
-0.3, -0.3, 0, -- Front Bottom Left 3
0.3, 0.3, 0, -- Back Top Left 4
0.3, 0, 0, -- Back Top Right 5
0.3, 0, 0, -- Back Bottom Right 6
0.3, 0.3, 0 -- Back Bottom Left 7 ]
并且,不使用转换,或仅使用视图转换,所有内容都应该显示(灰色方块)。
视图转换
view = [cos ty * cos tz, cos tz * sin tx * sin ty - cos tx * sin tz, cos tx * cos tz * sin ty + sin tx * sin tz, -cx,
cos ty * sin tz, cos tx * cos tz + sin tx * sin ty * sin tz, -1 * cos tz * sin tx + cos tx * sin ty * sin tz, -cy,
-1 * sin ty, cos ty * sin tx, cos tx * cos ty, -cz,
0, 0, 0, 1]
其中(cx, cy, cz)
是相机的位置,(tx, ty, tz)
是相机以弧度欧拉角绕轴旋转。
应用透视转换时出现问题
perspective = [scale, 0, 0, 0,
0, scale, 0, 0,
0, 0, -1 * (far + near) / diff, -1,
0, 0, -2 * near * far / diff, 0]
其中diff = far - near
和scale = 1.0 / tan (fov / 2.0)
以及fov = 0.785
。
我的远和近平面分别为10和0.01。
一旦应用,使用以下GLSL代码,不会出现任何内容(即只有黑屏)。
void main()
{
Color = color;
gl_Position = perspective * view * vec4(position, 1.0);
}
我尝试从多个不同的角度和位置查看方块,并禁用剔除。
我的透视投影矩阵或其应用有什么问题?
答案 0 :(得分:0)
这是通过转置视图矩阵来解决的。