0

私は、物理センサーの向き (クォータニオン形式) を読み取り、その結果、画面上のオブジェクトを回転させる小さな OpenGL デモに取り組んでいます。今、四元数形式の回転を回転 4x4 行列に変換しようとしています。それを行う小さなアルゴリズムをオンラインで見つけました。ただし、C++ 関数に配列を渡す方法がわからないため、クォータニオンを行列に処理するのに苦労しています。

だから私はこれをやろうとしています:

#include "MatrixMath.h"

// somewhere in my render loop
float aRotationMatrix[16];
readRotation(aRotationMatrix);

readRotation関数は次のように定義されます。

void readRotation(float *a4x4Flat16Matrix){
   sQuaternionReader.read();
   float aQuaternion[4];

   aQuaternion[0] = sQuaternionReader.getQuarternionX();
   aQuaternion[1] = sQuaternionReader.getQuarternionY();
   aQuaternion[2] = sQuaternionReader.getQuarternionZ();
   aQuaternion[3] = sQuaternionReader.getQuarternionW();

   float *aMatrix = a4x4Flat16Matrix;

   fromQuaternionToMatrix(aQuaternion, aMatrix);  // this is declared faulty by the linker

}

コンパイルしようとすると、リンカーから次のエラーが表示されます。

./src/main/CupNPlate.cpp:151: error: undefined reference to 'fromQuaternionToMatrix(float*, float*)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [CupNPlate] Error 1

fromQuaternionToMatrix関数は「MatrixMath.h」という名前のファイルで宣言されています。

#ifndef MATRIXMATH_H_
#define MATRIXMATH_H_

void fromQuaternionToMatrix( float *aQuaternion,
         float *a4x4Flat16Matrix );

#endif

「MatrixMath.cpp」という名前のファイルに実装されています。

#include "MatrixMath.h"

void fromQuaternionToMatrix( float *aQuaternion,
         float *a4x4Flat16Matrix ){
   // x := 0, y := 1, z := 2, w := 3
   float x2 = aQuaternion[0] * aQuaternion[0];
   float y2 = aQuaternion[1] * aQuaternion[1];
   float z2 = aQuaternion[2] * aQuaternion[2];
   float xy = aQuaternion[0] * aQuaternion[1];
   float xz = aQuaternion[0] * aQuaternion[2];
   float yz = aQuaternion[1] * aQuaternion[2];
   float wx = aQuaternion[3] * aQuaternion[0];
   float wy = aQuaternion[3] * aQuaternion[1];
   float wz = aQuaternion[3] * aQuaternion[2];

   a4x4Flat16Matrix[0] =  1.0f - 2.0f * (y2 + z2);
   a4x4Flat16Matrix[1] =  2.0f * (xy - wz);
   a4x4Flat16Matrix[2] =  2.0f * (xz + wy);
   a4x4Flat16Matrix[3] =  0.0f;

   a4x4Flat16Matrix[4] =  2.0f * (xy + wz);
   a4x4Flat16Matrix[5] =  1.0f - 2.0f *(x2 + z2);
   a4x4Flat16Matrix[6] =  2.0f * (yz - wx);
   a4x4Flat16Matrix[7] =  0.0f;

   a4x4Flat16Matrix[8] =  2.0f * (xz - wy);
   a4x4Flat16Matrix[9] =  2.0f * (yz + wx);
   a4x4Flat16Matrix[10] =  1.0f - 2.0f * (x2 + y2);
   a4x4Flat16Matrix[11] =  0.0f;

   a4x4Flat16Matrix[12] =  0.0f;
   a4x4Flat16Matrix[13] =  0.0f;
   a4x4Flat16Matrix[14] =  0.0f;
   a4x4Flat16Matrix[15] =  1.0f;
}

リンカーは教えてくれますundefined reference to 'fromQuaternionToMatrix(float*, float*)'が、私の関数のシグネチャは正確fromQuaternionToMatrix( float *aQuaternion, float *a4x4Flat16Matrix )に であるため、何について泣き言を言っているのかわかりません。コンパイラは私にエラーを与えません。

4

1 に答える 1

2

問題は関数の署名ではなく、どの実装にもリンクできないことです。

関数に間違った引数を渡すと、コンパイル時エラーが発生します。ここで得られるのは、リンク時のエラーです。リンカーは、次のように宣言された関数の実装を見つけることができません。fromQuaternionToMatrix(float*, float*)

Visual Studio (他のアイデアについてはコメントできません) では、.cppファイルがプロジェクトに追加されていることを確認する必要があります。それ以外の場合、ライブラリを使用している場合は、プロジェクト設定またはコードでライブラリを参照する必要があります。

#pragma comment(lib, "LibFileName");
于 2012-08-21T08:28:22.413 に答える