You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:37:17