OpenGl 中的投影(z 轴错误)
Projection in OpenGl (bug with z-axis)
我不知道为什么,但我的 z 轴似乎有问题(它似乎使值翻了一番之类的)
这应该是一个立方体
不过好像是"bigger in depth"哪里不对
我的pr_Matrix:
mat4 mat4::prespective(float fov, float aspectRatio, float near, float far){
mat4 result;
float yScale = 1.0f / tan(toRadians(fov/2.0f));
float xScale = yScale / aspectRatio;
float frustumLength = far - near;
result.elements[0 + 0 * 4] = xScale;
result.elements[1 + 1 * 4] = yScale;
result.elements[2 + 2 * 4] = -(far + near) / frustumLength;
result.elements[3 + 2 * 4] = -1.0f;
result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;
return result;
}
我的ml_Matrix:
maths::mat4 &ProjectionMatrix(){
maths::mat4 m_ProjM = maths::mat4::identity();
m_ProjM *= maths::mat4::translation(m_Position);
m_ProjM *= maths::mat4::rotation(m_Rotation.x, maths::vec3(1, 0, 0));
m_ProjM *= maths::mat4::rotation(m_Rotation.y, maths::vec3(0, 1, 0));
m_ProjM *= maths::mat4::rotation(m_Rotation.z, maths::vec3(0, 0, 1));
maths::mat4 scale_matrix = maths::mat4(m_Scale);
scale_matrix.elements[3 + 3 * 4] = 1.0f;
m_ProjM *= scale_matrix;
return m_ProjM;
}
我的vw_matrix(相机)
void update(){
maths::mat4 newMatrix = maths::mat4::identity();
newMatrix *= maths::mat4::rotation(m_Pitch, maths::vec3(1, 0, 0));
newMatrix *= maths::mat4::rotation(m_Yaw, maths::vec3(0, 1, 0));
newMatrix *= maths::mat4::translation(maths::vec3(-m_Pos.x, -m_Pos.y, -m_Pos.z));
m_ViewMatrix = newMatrix;
}
我在glsl代码中的矩阵乘法:
vec4 worldPosition = ml_matrix * vec4(position, 1.0);
vec4 positionRelativeToCamera = vw_matrix * worldPosition;
gl_Position = pr_matrix * positionRelativeToCamera;
编辑: 我想我明白了! (一旦我有时间会仔细检查数学)大多数教程(所以,我的代码源)使用 mat4::prespective(float fov, float aspectRatio, float near, float far),他们没有说的是"fov" 表示 "fovy"(所以 "vertical field of view"),结果似乎通过这个简单的更改复制了 "usual fov in games":
float xScale = 1.0f / tan(toRadians(fov/2.0f));
float yScale = xScale * aspectRatio;
感谢您将其指出为 fov 问题 Henk De Boer
我的猜测是在声明时:
mat4 result;
您正在调用将矩阵初始化为恒等式的默认构造函数。
那么在后续设置矩阵的代码中,需要调用:
result.elements[3 + 3 * 4] = 0.0f;
另外,为了它的价值,在我的代码中有几行:
result.elements[3 + 2 * 4] = -1.0f;
result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;
没有否定。 TBH,我不确定这是否值得担心。
这只是 FOV 的结果,您提供的 FOV 会极大地改变图像的外观。你选择什么是个人品味的问题。要获得自然感觉的场景,45-60 之间的任何值都很好,但您可以增强它以使场景感觉更直接或动作节奏更快。观察下图如何具有两次完全相同的几何形状,但右侧的底座以 90 度 FOV 进一步突出到视口中。
我不知道为什么,但我的 z 轴似乎有问题(它似乎使值翻了一番之类的)
这应该是一个立方体
不过好像是"bigger in depth"哪里不对
我的pr_Matrix:
mat4 mat4::prespective(float fov, float aspectRatio, float near, float far){
mat4 result;
float yScale = 1.0f / tan(toRadians(fov/2.0f));
float xScale = yScale / aspectRatio;
float frustumLength = far - near;
result.elements[0 + 0 * 4] = xScale;
result.elements[1 + 1 * 4] = yScale;
result.elements[2 + 2 * 4] = -(far + near) / frustumLength;
result.elements[3 + 2 * 4] = -1.0f;
result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;
return result;
}
我的ml_Matrix:
maths::mat4 &ProjectionMatrix(){
maths::mat4 m_ProjM = maths::mat4::identity();
m_ProjM *= maths::mat4::translation(m_Position);
m_ProjM *= maths::mat4::rotation(m_Rotation.x, maths::vec3(1, 0, 0));
m_ProjM *= maths::mat4::rotation(m_Rotation.y, maths::vec3(0, 1, 0));
m_ProjM *= maths::mat4::rotation(m_Rotation.z, maths::vec3(0, 0, 1));
maths::mat4 scale_matrix = maths::mat4(m_Scale);
scale_matrix.elements[3 + 3 * 4] = 1.0f;
m_ProjM *= scale_matrix;
return m_ProjM;
}
我的vw_matrix(相机)
void update(){
maths::mat4 newMatrix = maths::mat4::identity();
newMatrix *= maths::mat4::rotation(m_Pitch, maths::vec3(1, 0, 0));
newMatrix *= maths::mat4::rotation(m_Yaw, maths::vec3(0, 1, 0));
newMatrix *= maths::mat4::translation(maths::vec3(-m_Pos.x, -m_Pos.y, -m_Pos.z));
m_ViewMatrix = newMatrix;
}
我在glsl代码中的矩阵乘法:
vec4 worldPosition = ml_matrix * vec4(position, 1.0);
vec4 positionRelativeToCamera = vw_matrix * worldPosition;
gl_Position = pr_matrix * positionRelativeToCamera;
编辑: 我想我明白了! (一旦我有时间会仔细检查数学)大多数教程(所以,我的代码源)使用 mat4::prespective(float fov, float aspectRatio, float near, float far),他们没有说的是"fov" 表示 "fovy"(所以 "vertical field of view"),结果似乎通过这个简单的更改复制了 "usual fov in games":
float xScale = 1.0f / tan(toRadians(fov/2.0f));
float yScale = xScale * aspectRatio;
感谢您将其指出为 fov 问题 Henk De Boer
我的猜测是在声明时:
mat4 result;
您正在调用将矩阵初始化为恒等式的默认构造函数。
那么在后续设置矩阵的代码中,需要调用:
result.elements[3 + 3 * 4] = 0.0f;
另外,为了它的价值,在我的代码中有几行:
result.elements[3 + 2 * 4] = -1.0f;
result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;
没有否定。 TBH,我不确定这是否值得担心。
这只是 FOV 的结果,您提供的 FOV 会极大地改变图像的外观。你选择什么是个人品味的问题。要获得自然感觉的场景,45-60 之间的任何值都很好,但您可以增强它以使场景感觉更直接或动作节奏更快。观察下图如何具有两次完全相同的几何形状,但右侧的底座以 90 度 FOV 进一步突出到视口中。