ニートが頑張るブログ

ニートが現実逃避するために創作活動など色々とカオスに頑張ってみる
ニートが頑張るブログ TOP  >  ニートメソッド >  楕円の扁平率の近似について本気出して考えてみた その2

楕円の扁平率の近似について本気出して考えてみた その2

楕円

というわけで実際の扁平率の求め方の話。

実際は、
人に伝える気0のタダの個人的メモみたいなモンです。


 



さて、3D空間上に、こんなふうに円が
Y軸を法線にしてならんでいたとして、
その楕円を、円のスプライトの_yscaleをいじるだけで
近似的に表現できたら、こんなに嬉しいことはない。


そんな必要から考え始めたことです。


んでは、実際にどうするか。

まず考えられることは、
円の前後左右の頂点の位置を求めること。
そして、その_x成分の差、_y成分の差が分かれば、
それがそのまま使えるじゃないか、と考えました。

楕円

でも、↑こんな風に単純に
x座標とz座標にプラスした座標では駄目なのです。

Y軸方向のカメラの傾き(Yrot)によって全く結果が変わります。

楕円

だから、このように
Yrotによって計算されるYcosやYsinを、
x座標、z座標にプラスマイナスした4点を考えます。
これだと、どうカメラアングルをくるくるしても、
楕円の扁平率を計算するための座標は一定です。

楕円

そんでまぁ、最終的には2箇所の点の座標が出れば十分だと分かります。
それがこのXYって書いてある場所ですね。


そしてこっから先が
更に人に伝える気が0なチラシの裏の呪文
(解読するためにはニートの3Dライブラリが必要)

あと言っておくと、
up0が実際の円のスプライト
up1がXの文字のスプライト
up2がYの文字のスプライトです。



x = _root.xx*(rx-_root.rx) + _root.zx*(rz-_root.rz);
y = _root.xy*(rx-_root.rx) + _root.yy*(ry-_root.ry) + _root.zy*(rz-_root.rz);
z = _root.xz*(rx-_root.rx) + _root.yz*(ry-_root.ry) + _root.zz*(rz-_root.rz);
p = _root.p/(_root.p+z); //画面上のxyzとパースを求める

up0._x = x*p;
up0._y = y*p; //円のスプライトを動かす
up0._xscale =up0._yscale = 100*p;


x2=rx-_root.Ycos*40;
z2=rz+_root.Ysin*40;
x = _root.xx*(x2-_root.rx) + _root.zx*(z2-_root.rz);
y = _root.xy*(x2-_root.rx) + _root.yy*(ry-_root.ry) + _root.zy*(z2-_root.rz);
z = _root.xz*(x2-_root.rx) + _root.yz*(ry-_root.ry) + _root.zz*(z2-_root.rz);
p = _root.p/(_root.p+z); //画面上のxyzとパースを求める

up1._x = x*p;
up1._y = y*p; //xの文字を動かす


x3=rx+_root.Ysin*40;
z3=rz+_root.Ycos*40;
x = _root.xx*(x3-_root.rx) + _root.zx*(z3-_root.rz);
y = _root.xy*(x3-_root.rx) + _root.yy*(ry-_root.ry) + _root.zy*(z3-_root.rz);
z = _root.xz*(x3-_root.rx) + _root.yz*(ry-_root.ry) + _root.zz*(z3-_root.rz);
p = _root.p/(_root.p+z); //画面上のxyzとパースを求める

up2._x = x*p;
up2._y = y*p; //yの文字を動かす

aho= (up2._y - up0._y) / (up1._x - up0._x); //これが扁平率

up0._yscale *= aho; //実際に平べったくする 終わり



↑この呪文を動かしてみると、↓こんな感じに動きます。




でも実際はこんな風に文字を表示させる必要はないし、
いらない計算は全部切り詰めることになる。

すると、いろんなモノがポコポコと消えていき、
最終的に、扁平率を求めるための何かになります。

それが↓こんな感じ。


x = _root.xx*(rx-_root.rx) + _root.zx*(rz-_root.rz);
y = _root.xy*(rx-_root.rx) + _root.yy*(ry-_root.ry) + _root.zy*(rz-_root.rz);
z = _root.xz*(rx-_root.rx) + _root.yz*(ry-_root.ry) + _root.zz*(rz-_root.rz);
p = _root.p/(_root.p+z); //画面上のxyzとパースを求める

up0._x = x*p;
up0._y = y*p; //円のスプライトを動かす
up0._xscale = 100*p;

y += _root.xy*_root.Ysin + _root.zy*_root.Ycos;
z += _root.xz*_root.Ysin + _root.zz*_root.Ycos;
p2 = _root.p/(_root.p+z);
aho= ( y*p2 - up0._y ) ; //これが今回言いたいこと全部

up0._yscale = aho*100; //実際に平べったくする 終わり




それにしても
これはかなり不完全です。
(前の記事でも書いてるけど)

「3D空間上の、任意の平面の円の形状を楕円として近似するための、定理」
みたいなの、無いんですかね?


以上レポっす。チラシの裏すんません。
関連記事
[ 2010/09/19 19:40 ] ニートメソッド | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

月別カレンダー
09 ≪│2017/10│≫ 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -