BoundingBox的Transform函数触发Access Violation写入错误求助
分析视锥体剔除中BoundingBox::Transform的访问违规错误
看起来你遇到的是典型的空指针/未初始化内存访问导致的写入错误,报错里的0x00000038是一个极低的内存地址,说明你尝试写入的内存区域根本没被正确分配或初始化。咱们一步步拆解问题:
核心问题1:transVertex未正确初始化
你代码里直接使用了transVertex[k],但如果transVertex是BoundingBox类中的指针成员(比如D3DXVECTOR3* transVertex;),你没有给它分配8个D3DXVECTOR3的内存空间,那它就是个野指针,写入时必然触发访问违规。如果是数组,也可能存在声明大小错误的问题。
核心问题2:循环中错误访问顶点元素
你在循环里写的transVertex->x等价于transVertex[0].x,但你明明在遍历k从0到7,应该用transVertex[k].x才对!不然每次循环都只在比较第一个顶点的值,而且如果transVertex是指针,k不为0时还会出现越界访问。
核心问题3:边界值未初始化
循环开始前,你没给xMin、yMin、zMin、xMax、yMax、zMax设置初始值。第一次循环时这些变量是随机垃圾值,不仅会导致min/max计算错误,甚至可能因垃圾值指向非法内存引发额外问题。
修正后的代码示例
我调整了代码,解决了上述所有问题:
// 先确保BoundingBox类中正确声明成员 class BoundingBox { private: D3DXVECTOR3 vertexes[8]; // 原始的8个边界框顶点 D3DXVECTOR3 transVertex[8]; // 变换后的顶点,直接用数组避免指针问题 float xMin, yMin, zMin; float xMax, yMax, zMax; D3DXMATRIX mat; public: void Transform(D3DXVECTOR3 pos, D3DXVECTOR3 rot, D3DXVECTOR3 sca); }; void BoundingBox::Transform(D3DXVECTOR3 pos, D3DXVECTOR3 rot, D3DXVECTOR3 sca) { D3DXQUATERNION rotationQuaternion; // 先计算旋转四元数,再传入矩阵变换函数 D3DXQuaternionRotationYawPitchRoll(&rotationQuaternion, D3DXToRadian(rot.x), D3DXToRadian(rot.y), D3DXToRadian(rot.z)); D3DXMatrixTransformation(&mat, NULL, NULL, &sca, NULL, &rotationQuaternion, &pos); // 用第一个变换后的顶点初始化边界值 D3DXVec3Transform(&transVertex[0], &vertexes[0], &mat); xMin = xMax = transVertex[0].x; yMin = yMax = transVertex[0].y; zMin = zMax = transVertex[0].z; // 从第二个顶点开始遍历计算边界 for (int k = 1; k < 8; k++) { D3DXVec3Transform(&transVertex[k], &vertexes[k], &mat); xMin = min(transVertex[k].x, xMin); yMin = min(transVertex[k].y, yMin); zMin = min(transVertex[k].z, zMin); xMax = max(transVertex[k].x, xMax); yMax = max(transVertex[k].y, yMax); zMax = max(transVertex[k].z, zMax); } }
额外注意事项
- 如果一定要用指针类型的
transVertex,记得在类的构造函数里用new D3DXVECTOR3[8]分配内存,析构函数里用delete[]释放,避免内存泄漏和野指针。 - 确认
vertexes数组已经被正确初始化,8个顶点都有合法值,不然变换时也可能出现异常。 - 调试时可以检查
transVertex的内存地址,确认它不是空指针或指向非法区域。
内容的提问来源于stack exchange,提问作者Rodrigo Diaz
相关产品推荐
相关产品推荐

