シェルピンスキーの三角形に似ていますが、3Dでシェルピンスキーのピラミッドを実装しようとしています。
ピラミッドに関するすべてのデータを含むこの構造があります。
typedef struct
{
GLfloat xUp;
GLfloat yUp;
GLfloat zUp;
GLfloat base;
GLfloat height;
}pyramid;
次に、3つのサブピラミッドを計算する関数を作成しました。
void findSubPyramids( pyramid pyr, pyramid subs[3])
{
for(int i=0; i<3; i++)
{
subs[i].height=pyr.height/2.0;
subs[i].base=pyr.base/2.0;
}
memcpy(subs,&pyr,3*sizeof(GLfloat));
subs[1].yUp= pyr.yUp-pyr.height/2.0;
subs[1].xUp= pyr.xUp+pyr.base/4.0;
subs[1].zUp= pyr.zUp-pyr.base/4.0;
subs[2].yUp= subs[1].yUp;
subs[2].xUp= pyr.xUp-pyr.base/4.0;
subs[2].zUp= subs[1].zUp;
}
しかし、このアルゴリズムの実装は間違っています。下部にある2つのサブピラミッドのzUp座標に問題があります。実際、ピラミッドは希望どおりに描画されていません。
しかし、gluPerspectiveの代わりにglOrthoを使用すると、ピラミッドは正常に描画されます。gluPerspectiveと使用する関数は正しいことはわかっていますが、アルゴリズムが間違っています。
ここで、すべてのサブピラミッドを計算するアルゴリズムを実装します。
void drawSierpinskyPyramid (pyramid pyr)
{
assert(EQUAL(pyr.height, pyr.base));
if(pyr.base > 4.0)
{
setRandomColor();
pyramid subs[3];
drawPyramid(pyr);
findSubPyramids(pyr, subs);
for(int i=0; i<3; i++)
{
drawSierpinskyPyramid(subs[i]);
}
}
}
何が悪いのかわかりません。