OpenGL/GLM-计算截头体问题
OpenGL/GLM - Calculating frustum problems
我正在尝试计算截头体,以进行一些简单的边界框测试。
这是我的功能:
void CFrustum::calculateFrustum(glm::mat4* mat)
{
// Calculate the LEFT side
m_Frustum[LEFT][A] = *glm::value_ptr(mat[0][3]) + *glm::value_ptr(mat[0][0]);
m_Frustum[LEFT][B] = *glm::value_ptr(mat[1][3]) + *glm::value_ptr(mat[1][0]);
m_Frustum[LEFT][C] = *glm::value_ptr(mat[2][3]) + *glm::value_ptr(mat[2][0]);
m_Frustum[LEFT][D] = *glm::value_ptr(mat[3][3]) + *glm::value_ptr(mat[3][0]);
// Calculate the RIGHT side
m_Frustum[RIGHT][A] = *glm::value_ptr(mat[0][3]) - *glm::value_ptr(mat[0][0]);
m_Frustum[RIGHT][B] = *glm::value_ptr(mat[1][3]) - *glm::value_ptr(mat[1][0]);
m_Frustum[RIGHT][C] = *glm::value_ptr(mat[2][3]) - *glm::value_ptr(mat[2][0]);
m_Frustum[RIGHT][D] = *glm::value_ptr(mat[3][3]) - *glm::value_ptr(mat[3][0]);
// Calculate the TOP side
m_Frustum[TOP][A] = *glm::value_ptr(mat[0][3]) - *glm::value_ptr(mat[0][1]);
m_Frustum[TOP][B] = *glm::value_ptr(mat[1][3]) - *glm::value_ptr(mat[1][1]);
m_Frustum[TOP][C] = *glm::value_ptr(mat[2][3]) - *glm::value_ptr(mat[2][1]);
m_Frustum[TOP][D] = *glm::value_ptr(mat[3][3]) - *glm::value_ptr(mat[3][1]);
// Calculate the BOTTOM side
m_Frustum[BOTTOM][A] = *glm::value_ptr(mat[0][3]) + *glm::value_ptr(mat[0][1]);
m_Frustum[BOTTOM][B] = *glm::value_ptr(mat[1][3]) + *glm::value_ptr(mat[1][1]);
m_Frustum[BOTTOM][C] = *glm::value_ptr(mat[2][3]) + *glm::value_ptr(mat[2][1]);
m_Frustum[BOTTOM][D] = *glm::value_ptr(mat[3][3]) + *glm::value_ptr(mat[3][1]);
// Calculate the FRONT side
m_Frustum[FRONT][A] = *glm::value_ptr(mat[0][3]) + *glm::value_ptr(mat[0][2]);
m_Frustum[FRONT][B] = *glm::value_ptr(mat[1][3]) + *glm::value_ptr(mat[1][2]);
m_Frustum[FRONT][C] = *glm::value_ptr(mat[2][3]) + *glm::value_ptr(mat[2][2]);
m_Frustum[FRONT][D] = *glm::value_ptr(mat[3][3]) + *glm::value_ptr(mat[3][2]);
// Calculate the BACK side
m_Frustum[BACK][A] = *glm::value_ptr(mat[0][3]) - *glm::value_ptr(mat[0][2]);
m_Frustum[BACK][B] = *glm::value_ptr(mat[1][3]) - *glm::value_ptr(mat[1][2]);
m_Frustum[BACK][C] = *glm::value_ptr(mat[2][3]) - *glm::value_ptr(mat[2][2]);
m_Frustum[BACK][D] = *glm::value_ptr(mat[3][3]) - *glm::value_ptr(mat[3][2]);
// Normalize all the sides
NormalizePlane(m_Frustum, LEFT);
NormalizePlane(m_Frustum, RIGHT);
NormalizePlane(m_Frustum, TOP);
NormalizePlane(m_Frustum, BOTTOM);
NormalizePlane(m_Frustum, FRONT);
NormalizePlane(m_Frustum, BACK);
}
现在,在有人告诉我列/行的顺序错误之前,我已经试过了,但没有成功。
我从固定函数模式切换到这样获取矩阵:
glGetFloatv( GL_PROJECTION_MATRIX, proj );
glGetFloatv( GL_MODELVIEW_MATRIX, modl );
实际传递矩阵。在这一点上,我唯一渲染的是世界顶点,我怀疑问题是我的边界框位置没有考虑到我在世界中的偏移量。
这是我创建的矩阵:
cameraMatrix = glm::lookAt(position, position+direction, up);
projectionMatrix = glm::perspective(50.0f, 4.0f / 3.0f, 0.1f, 1000.f);
viewMatrix = projectionMatrix * cameraMatrix;
因为我现在唯一渲染的是具有绝对位置的全局顶点,所以我不使用模型矩阵。
我确信我的box vs截头体代码是正确的。有人看到我的计算代码有错误吗?或者知道我确实需要转换绑定框顶点吗?
谢谢。
如果你的边界框在世界坐标中,那么你应该把你的viewMatrix传递给calculateFrustum。
将viewMatrix传递给calculateFrustum将生成世界空间中的平面。
如果将projectionMatrix传递给calculateFrustum,则在执行交叉测试之前,必须将cameraMatrix应用于边界框。
我一直在尝试做同样的事情,尝试使用这些代码并发现了问题。这是常见的指针混淆。
这是纠正方法的第一行:
m_Frustum[LEFT][A] = (*mat)[0][3] + (*mat)[0][0];
相关文章:
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- C++理解计算字符变量的问题
- 使用指针计算堆栈问题的大 O 表示法
- 使用 cblas_dgemm 计算伪逆的问题
- 我应该如何在C++中使用结构体解决输入失败的问题?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 成绩计算问题
- 关于骰子概率计算的一个C++问题
- 我想知道我将如何实现 + 运算符重载.我已经从我上一个问题中计算出 += 运算符重载
- 在 64 位 Linux armv8 计算机上编译 32 位二进制文件时遇到问题
- 在C 中显示小数点,计算问题
- 计算最大成对产品C 的问题
- 优化递归问题以计算超级数字
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 传递数组和计算平均C++的问题
- 谁可以帮助解释我的代码中出了什么问题.计算C ++中的数组
- UE4 波浪水材质和网格体问题
- OpenGL/GLM-计算截头体问题
- c++模板和结构体问题