何がやりたいかと言うと、
文字とか図形とかを台形変形、即ち、
奥行を考慮した、即ち、
パース的に表示させたいってことです。
今回は1点透視または2点透視の場合を考えます。
3点透視もそんなに難しくないけど、それは次にしときます。
簡単な概要は以下の図。
さて、どんな関数を作ればいいかというと、
平面的にn分割した点が、台形的にどの位置に位置するかを算定したいんです。
もしかして、、便利な数式とかあるんでしょうか?
きっとあるとは思うのですが、やりたいことは所詮ディスプレイ上なので、
テーブル+直線補完程度でもいいのかな。速度的にも有利だし。
そーでなければ、透視図的な計算をしなくちゃならなくなるんで。

さて、どんな関数を作ればよいかというと、
実際には下図のように、
対角線の交点はちょうど2分割の位置にあるということだけで
これをだんだん狭めていって、求める位置に近づけるようにします。

10回やれば1024分割、24回やれば16777216分割できるわけなので、
計算量は大して増えません。
で、、10分割する座標を出して表示させてみました。
で、codeはどうなるかというと、
こんな感じで。
文字とか図形とかを台形変形、即ち、
奥行を考慮した、即ち、
パース的に表示させたいってことです。
今回は1点透視または2点透視の場合を考えます。
3点透視もそんなに難しくないけど、それは次にしときます。
簡単な概要は以下の図。
さて、どんな関数を作ればいいかというと、
平面的にn分割した点が、台形的にどの位置に位置するかを算定したいんです。
もしかして、、便利な数式とかあるんでしょうか?
きっとあるとは思うのですが、やりたいことは所詮ディスプレイ上なので、
テーブル+直線補完程度でもいいのかな。速度的にも有利だし。
そーでなければ、透視図的な計算をしなくちゃならなくなるんで。

さて、どんな関数を作ればよいかというと、
実際には下図のように、
対角線の交点はちょうど2分割の位置にあるということだけで
これをだんだん狭めていって、求める位置に近づけるようにします。

10回やれば1024分割、24回やれば16777216分割できるわけなので、
計算量は大して増えません。
で、、10分割する座標を出して表示させてみました。
で、codeはどうなるかというと、
while(true){
tC = (tA + tB)/2;
vCrossPoint(xa1,ya1, xa4,ya4, xa2,ya2, xa3,ya3,&xx,&yy);
vCrossPoint(xa1,ya1, xa3,ya3, xx,0, xx,100,&xa5,&ya5);
vCrossPoint(xa2,ya2, xa4,ya4, xx,0, xx,100,&xa6,&ya6);
if(fabs(tC - t) < d) break;
if(t < tC){ // 左側
xa3 = xa5;
xa4 = xa6;
ya3 = ya5;
ya4 = ya6;
tB = tC;
}else{
xa1 = xa5;
xa2 = xa6;
ya1 = ya5;
ya2 = ya6;
tA = tC;
}
}
こんな感じで。
コメント
コメントを投稿