我正在尝试使用opengl在c ++中设置一个工作相机 - 我想自己实现它,而不是使用glm。
我试图在很长一段时间内找到我的错误,尝试了很多不同的方法,但它不能正常工作。 vector& matrix是在我在大学(row-major)的框架中实现的。
我想,将相机设置在+10 @ z轴并将对象放在原点时至少应显示任何内容。但它只是一个蓝色的窗口。如果我只是将ViewMatrix * ModelMatrix加载到顶点着色器,我得到一个矩形,这很好。
我不确定我是否理解了近距离和远距离平面 - 值是关于摄像机的位置,对吗?所以例如使相机位于z = 10,并且zn = 2& zf = 20,表示平面实际位于zn = 8和zf = -10,右边?
void Camera::calcProjMatrix() {
float s = 1.0f / (_alpha * tanf(_beta / 2.0f * M_PI / 180.0f ));
float frustum = _zf - _zn;
_projectionMatrix = matrix<float, 4, 4>(0);
_projectionMatrix._11 = s;
_projectionMatrix._22 = s * _alpha;
_projectionMatrix._33 = -(_zf + _zn) / frustum;
_projectionMatrix._34 = -(2 * _zf * _zn) / frustum;
_projectionMatrix._43 = -1;
}
void Camera::calcViewMatrix() {
vector<float, 3> zAxis = normalize(_pos - _target);
vector<float, 3> xAxis = normalize(cross(_up, zAxis));
vector<float, 3> yAxis = cross(zAxis, xAxis);
vector<float, 4> row1 = vector<float, 4>(xAxis.x, yAxis.x, zAxis.x, 0);
vector<float, 4> row2 = vector<float, 4>(xAxis.y, yAxis.y, zAxis.y, 0);
vector<float, 4> row3 = vector<float, 4>(xAxis.z, yAxis.z, zAxis.z, 0);
vector<float, 4> row4 = vector<float, 4>(-dot(xAxis, _pos), -dot(yAxis, _pos), -dot(zAxis, _pos), 1);
_viewMatrix = matrix<float, 4, 4>();
_viewMatrix = matrix<float, 4, 4>::from_rows(row1, row2, row3, row4);
}
我正在使用以下参数创建相机:
vector<float, 3> position = vector<float, 3>(0.1f, 0.1f, 10);
vector<float, 3> up = vector<float, 3>(0, 1, 0);
vector<float, 3> target = vector<float, 3>(0, 0, 0);
float beta = 45.0f;
float zn = 2.0f; float zf = 30.0f;
float alpha = 4.0f / 3.0f;
camera = Camera(position, up, target, alpha, beta, zn, zf);
渲染循环:( modelmatrix是标识矩阵)
matrix<float, 4, 4> mv = camera.getViewMatrix() * cube.getModelMatrix();
matrix<float, 4, 4> mvp = camera.getProjMatrix() * mv;
shader.loadMatrix4f("mvp", GL_TRUE, mvp._m);
顶点着色器:
#version 410
layout(location=0) in vec3 position;
uniform mat4 mvp;
void main()
{
gl_Position = mvp * vec4(position, 1.0f);
}
感谢您的帮助!