我似乎编写了一个及时倒退的类。请允许我解释一下:
我有一个函数,OrthogonalCamera::project()
它将矩阵设置为某个值。然后,我打印出该矩阵的值。
cam.project();
std::cout << "My Projection Matrix: " << std::endl << ProjectionMatrix::getMatrix() << std::endl;
cam.project()
将矩阵推入 ProjectionMatrix 的堆栈(我正在使用 std::stack 容器),并且ProjectionMatrix::getMatrix()
只返回堆栈的顶部元素。如果我只运行这段代码,我会得到以下输出:
2 0 0 0
0 7.7957 0 0
0 0 -0.001 0
-1 -1 -0.998 1
但是,如果我在调用后将这些代码运行到行std::cout
float *foo = new float[16];
Mat4 fooMatrix = foo;
然后我得到这个输出:
2 0 0 0
0 -2 0 0
0 0 -0.001 0
-1 1 -0.998 1
我的问题如下:我可能会做什么,这样在我打印一个值后执行的代码会改变正在打印的值?
我正在使用的一些功能:
static void load(Mat4 &set)
{
if(ProjectionMatrix::matrices.size() > 0)
ProjectionMatrix::matrices.pop();
ProjectionMatrix::matrices.push(set);
}
static Mat4 &getMatrix()
{
return ProjectionMatrix::matrices.top();
}
和
void OrthogonalCamera::project()
{
Mat4 orthProjection = { { 2.0f / (this->r - this->l), 0, 0, -1 * ((this->r + this->l) / (this->r - this->l)) },
{ 0, 2.0f / (this->t - this->b), 0, -1 * ((this->t + this->b) / (this->t - this->b)) },
{ 0, 0, -2.0f / (this->farClip - this->nearClip), -1 * ((this->farClip + this->nearClip) / (this->farClip - this->nearClip)) },
{ 0, 0, 0, 1 } }; //this is apparently the projection matrix for an orthographic projection.
orthProjection = orthProjection.transpose();
ProjectionMatrix::load(orthProjection);
}
编辑:谁格式化了我的代码,谢谢。我对这里的格式不太好,现在看起来好多了:)
进一步编辑:我已经验证了 fooMatrix 的初始化在我调用 std::cout后正在运行。
UPTEENTH 编辑:这是初始化 fooMatrix 的函数:
typedef Matrix<float, 4, 4> Mat4;
template<typename T, unsigned int rows, unsigned int cols>
Matrix<T, rows, cols>::Matrix(T *set)
{
this->matrixData = new T*[rows];
for (unsigned int i = 0; i < rows; i++)
{
this->matrixData[i] = new T[cols];
}
unsigned int counter = 0; //because I was too lazy to use set[(i * cols) + j]
for (unsigned int i = 0; i < rows; i++)
{
for (unsigned int j = 0; j < cols; j++)
{
this->matrixData[i][j] = set[counter];
counter++;
}
}
}
g第64次编辑:这不仅仅是输出问题。我实际上必须在其他地方使用矩阵的值,它的值与所描述的行为一致(无论我是否打印它)。
树第三次编辑:通过调试器运行它又给了我一个不同的价值:
-7.559 0 0 0
0 -2 0 0
0 0 -0.001 0
1 1 -0.998 1
a(g 64 , g 64 )th 编辑:在 linux 上编译不存在问题。仅在带有 MinGW 的 Windows 上。会不会是编译器错误?那会让我很难过。
最终编辑:它现在可以工作了。我不知道我做了什么,但它有效。我已经确定我使用的是最新版本,它没有确保因果关系仍然有效的代码,并且它可以工作。感谢您帮助我解决这个问题,stackoverflow 社区。和往常一样,你一直乐于助人,容忍我的迟钝。我将对任何可能导致这种不可预测性的未定义行为或指针错误保持高度警惕。