ニートが頑張るブログ

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

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

3D楕円近似3D楕円近似
この左右の楕円群の違いが分かりますかね。

左は、全ての楕円の扁平率が一定です。
右は、カメラからの距離に応じて扁平率が変わっています。
それなりにそれっぽいですね。

これを実現する方法を考えていました。
要は、楕円の擬似3D的近似方法です。

条件としては、
Paraflaのスプライト上の
_x、_y、_xscale、_yscaleだけで、
平面上の円の軌跡を近似すること。

任意のx、y、z座標地点で
X軸の角度、Y軸の角度が分かっていれば、
扁平率がバシッと求まるような感じで。


実際にグリグリしてみると、
左のやり方の嘘臭さが分かると思います。



方向キーで歩いたり、マウスで視点グリグリしたり


この扁平率のちぢみ方の推定を、今まで自分は妥協していました。
今までは、左のような単純なやり方で表現していました。
X軸の傾きから計算されるsinで、遠近感に関係なく
一括して縮めていました。
_yscale=_xscale*Xsin;
(こんな感じ。まぁ、ムチャクチャ軽いとは言えます)


肝心の、その扁平率を求めるための式とかは
あとで備忘録的に書くと思います。


 

世の中を観察していれば
経験的に分かる事なのですが
モノは、遠ざかれば遠ざかるほど
分数関数的に小さくなっていきます。

しかし、平面の扁平率などは、
そう単純にはいかない。

よって今まで、
その扁平率を計算するのを放置していました。


ちなみに円は、
どんなにパースをかけても、
楕円以外のモノには変形しません。(射影変換である限り?)
楕円

楕円

「楕円に物凄いパースをかければ楕円以外の何ものかになるのではないか」
と思っている人もいるようですが、
↑実際はこのとおり。
中心は離れますが、こうして、
パースをかけた楕円は別の楕円になるのです。


この勘違いのせいで異次元になっているマンガとか、意外と多いです。
(主にお皿とか、コップのフチとかにおいて)



さらに実際は、このように↓
上下の扁平率プラス、回転もかかります。


実はこの角度がクセモノ。
「Y軸方向の角度で行けるだろ?」と思ってる人いるでしょうが、
違うのです。

円柱

これを見てもらえば分かると思います。
オレンジ色の線が、
実際に近似すべき楕円の短軸と長軸です。

短軸が、Y軸方向の線とは角度が違うのが分かるでしょう。
ここまで来ると、もうお手上げ。
今の自分には理解出来ない。



まぁ、そんな感じで、
真に擬似3Dを極めれれば、
_x、_y、_xscale、_yscale、_rotationを駆使して
3D空間上で円が変形した楕円は完璧に表現できるハズなのですが、

アホのニートには流石に無理なので、
今回は_yscaleを、扁平率的に縮めるだけの方法なのです。



それにしても、
この、扁平率を求めるってのは結構大事だと思う。


自分が作ってるフラでも、
影とか、広がる血とか、
とにかく、地面上に落ちるエフェクトとかは、
かなり恩恵を受けると思う。


結局今のところ、Flashの3Dゲームの主人公の影なんて、
お粗末なグラデーションの楕円
置いておくぐらいしかないと思うし。

関連記事
[ 2010/09/16 19:21 ] ニートメソッド | TB(0) | CM(2)
ごめんね
人が真剣になっているとつい茶々を入れたくなるのが私の悪い癖。

画面上の四角ってなんなんでしょうね?
たとえば針穴写真みたいに、一点から出た線を平面上に写像したものなんでしょうか。
それともパノラマ写真のような円筒の上に写像したものを平らに広げたものなんでしょうか。
あるいはプラネタリウムのように球面上に写像したものを、さらに地球儀から地図に変換したみたいに平面状に写像したもの(超広角の魚眼レンズで撮った写真みたいな感じ)なんでしょうか。

CGには、かつてオシロスコープやシンクロスコープ(ついでに航空現況表示装置)の系統のベクターグラフィックスと、ピクセルマップが基本のラスターグラフィックスの二系統がありました。で、ゲームグラフィックスの形状生成エンジンの発想は、一般に前者のベクター系に近いものなんですが、リアル3D系の映画なんかだと後者のラスターグラフィックスが主流で、その基本原理みたいになっているのが、いわゆるレイ・トレーシング(光線追跡法)、通称“レイトレ”です。

昨今のCGはレイトレが主流なんですが、レイトレっつーのはもともとレンズの設計法から来ていまして、CGでいうレイトレというのは「いま眼に入ってきてる光はどこから来たんだ?」という、本来の(光学系設計用の)レイトレから見ると時間的逆回しを行なっています。そんなわけで、CGで使うレイトレは、日本語では「視線追跡法」と呼ばれたりします。

てなワケで、一般的なCGは、ともすればパースがつきすぎて「ぐにょーん」「びろーん」になっちゃう画像を、むりやり普通の写真っぽく見せるために努力していたりするわけです。

反面、アニメの場合は「絵」ですから、M.C.エッシャーの作品のようなパースつけ放題の作画も可能なわけで、パトレイバー2の『おもひでのベイブリッジ』のカラオケ画像再生場面みたいなコトもできてしまいます。

スクリーンサイズが同じだけど画角が違う、というのを効果として使った例っちゅーのもありまして、スピルバーグの『ジョーズ』では海岸にサメが現れる場面で、ブロディ署長(ロイ・シャイダー)の上半身のアップを、ドリー(台車)でカメラを引きながらズームで拡大する、というコトをやってます。ただなんとなくそこにいた人間が、突然発生した“状況”における役割にコミットされる瞬間、つーのをうまく表現してました。

てなワケで、そのあたりを真面目にやろうとすると、ツールの特性の問題にぶちあたって非常にヤヤコシイことになったりもします。

お気をつけください。
[ 2010/09/16 22:01 ] [ 編集 ]
コメ返信
> Mr.Moto さん


>画面上の四角ってなんなんでしょうね?

分かります。
これは、どういう疑問なのか、というのはよく分かりますw


>たとえば針穴写真みたいに、一点から出た線を平面上に写像したものなんでしょうか。
>それともパノラマ写真のような円筒の上に写像したものを平らに広げたものなんでしょうか。
>あるいはプラネタリウムのように球面上に写像したものを、さらに地球儀から地図に変換したみたいに
>平面状に写像したもの(超広角の魚眼レンズで撮った写真みたいな感じ)なんでしょうか。


まぁ自分もよくわかってないのですが、
どういう変換かってことになると思います。


自分がFlashでやっているのは、
「視点は一点で、平面のスクリーン?に投影したら、どうなるか」
みたいな感じで、多分3D表現としては一番単純なモノだと思います。
「射影変換」にあたると思います。


モノの大きさ= スクリーンから視点への距離 / そのモノから視点への距離
みたいな感じです。
距離が2倍になれば、半分の大きさに見えるワケです。
人間の目も、その点は同じでしょう。

これを式で書いた部分が、
_root.p/(_root.p+z);
になります。

人間の目で言えば、
目の網膜から、目のレンズへの距離がpにあたると思います。?

でも、人間の目はレンズがかかってますし、
網膜もスクリーンのように平面ではなくて球なので、
人間の目は単純な射影変換で無いのだと思います。
そのため、「画面上の四角」は、ゲームのグラフィックとは違った
歪み方をしてくるのだと思います。
魚眼レンズ。人眼レンズ。


>レイトレ
まぁ自分はそんな高度なこと出来るワケもなく
せいぜい理屈を理解するくらいです。
もしくは、3DCGのレンダラを選ぶときの問題でしょうか。

自分はvidroというのを使ったりしていますが、
これは、レイトレなのか。
調べてみると、グローバル・イルミネーションという分類のようです。サッパリ。



>パトレイバー2
一箇所、物凄い魚眼のパースをかけてあるシーンがありましたね。
他の押尾作品でもそういう演出があったような。


>スクリーンサイズが同じだけど画角が違う、というのを効果として使った例っちゅーのもありまして

まさに攻殻機動隊のなんかのシーンで
画角がウニョーと変わる演出があった気がします。(ゴーストダイブするとき?)


あと、自分は画角ではなく、
_root.pという変数一個で管理しているつもりです。

それを弄りまくって、リアルタイムにパースを滅茶苦茶にしたりも出来ます。

カマキリゲーで死んだ時の崩壊がそれだったりします。

[ 2010/09/20 21:05 ] [ 編集 ]
コメントの投稿












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

月別カレンダー
10 ≪│2017/11│≫ 12
- - - 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 - -