私は私はマトリックスを利用したいクラスのマトリックスと別のクラスのカメラを持っている私のMatrixクラスは次のようになります。私はポインタの仕組みを誤解していますか?
class Matrix4f {
public:
Matrix4f() {
this->setMatrix(EMPTY);
}
Matrix4f(Matrix4f &m2) {
this->setMatrix(m2.matrix);
}
static Matrix4f& Matrix4f::identity() {
Matrix4f& identity = Matrix4f() ;
identity.setMatrix(IDENTITY);
return identity;
}
void setMatrix(float f[4][4]) {
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 4; c++) {
this->matrix[r][c] = f[r][c];
}
}
}
Matrix4f& operator=(const Matrix4f &m2) {
this->setMatrix(m2.matrix);
}
private:
float matrix[4][4];
static float EMPTY[4][4] = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }
}; // initialize an empty array (all zeros);
static float IDENTIY[4][4] = {
{ 1, 0, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 0, 1, 0 },
{ 0, 0, 0, 1 }
}; // initialize a identity (array)
}
そして私は私のカメラのクラスでこれを持っている:
class Camera {
public:
Camera() {
this->calculateProjection();
}
Matrix4f* getProjection() {
return this->projection;
}
private:
Matrix4f* projection;
Matrix4f* calculateProjection() {
this->projection = &Matrix4f::identity();
// modify this->projection...
return this->projection;
}
}
カメラのインスタンスを作成してその投影を取得しようとすると、オブジェクトが破損しているように見えます(マトリックスは完全に大きな負の数で埋められます)。
私のコードがこのような誤動作を引き起こしているのは本当に混乱しています。
私は、コンパイラによって自動的に削除される参照を処理することはかなり確信しています。そして、それは恒等行列を扱うと思うが、実際には意味をなさない。
単位行列を投影行列にコピーしないでください。単位行列がガベージコレクションされるかどうかは関係ありません。
は、私は())(calculateProjectionを返す私は実際に単位行列が新たなMatrix4fを(作成することのいずれか ことで、このコードの作品を作ることができることを発見)して、それを返すOR getProjectionを作ります。
問題は、私は本当にどちらかをしたくないということです。
私はアイデンティティが新しいMatrix4fを構築するのを望ましくありません。なぜなら、それを破壊することに対処しなければならず、そのメソッドが高価であるため、getProjection()をcalculateProjection()したくないからです。 Projectionマトリクスは決して変化しません。あなたの
Matrix4f& Matrix4f::identity() {
Matrix4f& identity = Matrix4f() ;
identity.setMatrix(IDENTITY);
return identity;
}
「同一性」とは何ですか? – deviantfan
そして、なぜカメラでポインタを使用していますか? – deviantfan
クラス「Matrix」または「Matrix4f」の名前は何ですか? – Nawaz