Javaゲーム制作記

いろいろ作ってます  

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | Comment(-)

実用化に向けて・・・

Poly3Dを高速化していて分かりましたが、
「ピクセル単位での実数演算は禁物」
です。
floatをintにキャストするだけでもかなりの時間がかかります(640*480の場合307200回以上)。
実数除算なんか以ての外です(実はそれをやっていたりするわけですが・・・)。
それともう一つ
「ビット演算子やシフト演算子をうまく使う」
これも重要です。

・・・とまあ上記のことを踏まえたうえで高速化した・・・
つもりだったんですがあんまり速くなってないですねw
そのデモがこれです↓


(画像をクリックで(ry)(リンク切れ)

しかし3D迷路の方と比べると結構な差があります。
高速化したほうでは90FPSが稀に出るくらいになってました。
テクスチャのパースペクティブ補正をしないと120FPSは出ますが、
歪みが恐ろしいことになるので注意です。
[ 2010/04/07 15:31 ] 3D | Comment(5)

ソフトウェアレンダリングの革命

今まで機能重視で作ってきたPoly3Dですが、ゲームに使うには重すぎます。
(自分の環境ではホームページの3D迷路は60FPSがギリギリでした)
あらゆるJavaのパフォーマンス向上テクニックを使いましたが
実際に高速化された時間は1~2msという・・・(0.001~0.002秒)
ならばと思い一度全部作り直してみましたがやっぱり変わらず・・・
これがソフトウェアレンダリングの限界か・・・

・・・と思っていたんですが。

なんと、こんなものを見つけてしまいました。
Off-Road Rally


すごいです。
Javaのフルポリゴン3Dレースゲームです。
最初はJOGLかなんかを使ってると思ってたんですが
どうもソフトウェアレンダリングっぽいです。

画面サイズはDirectX標準の640*480、それでも問題ない速度で動いています。
すごいなぁ、このレンダラー作った人誰だろう・・・
と思っていたら、Anfy3DAPIを使っているっぽい感じです。
で、もちろんAnfy3DAPIについても調べてみました。
そしたらコアの部分のクラス数が3つだけだったんです。
余計なアクセスやオブジェクトの生成がないため、高速に動作していたのです。
オブジェクト指向の意味が薄れてしまうような気もしますが、API内だけなので多分問題ないです。


P.S.
後で気付きましたが、Anfy3DAPIではなく、jPCTを使っていたことが判明しました。
こっちはもっとすごい・・・
[ 2010/04/02 15:19 ] 3D | Comment(3)

Javaの自作エンジンまとめ

物理エンジンに続き3Dエンジンも完成(一応は)したので、
ファイル名の変更、最適化などなど、いろいろとやりました。
しかしEclipseはクラス名の変更(参照元も一括で)を自動でしてくれるので本当に助かります!

変更箇所またはファイルを右クリック→リファクタリング→名前変更でできます。


JPR2(物理エンジン)のパッケージの様子です。


もう巨大なパッケージ過ぎて何がなんだかわかりませんw
もう少し計画的に作るべきだったか・・・?
機能不足よりはマシですが・・・

ざっと機能を並べてみると、

・剛体専門!
・タイムステップごとの演算
・剛体(丸、四角、凸包多角形)
・ワームスタートによる安定化
・めり込み処理(にょりっと押し出されます)
・ジョイント(距離、回転、ドラッグ、滑車、固定)
※画像にJ2PrismaticJointというのがありますが使えません
・ジョイントにモーター(回転)
・ジョイントにリミット角度(回転)
・摩擦係数・反発係数の設定
・重力(当たり前


こんな感じです。
Box2Dと同じ・・・うわ何をするやm(ry


続いてはPoly3D(3Dエンジン)の方です。



こちらはわりとすっきりと収まりました。
しかしまだちょっと機能不足です・・・
スポットライトとかバンプマッピングあたりを実装したいです。

機能一覧

・ソフトウェアレンダラー(Java3Dとかのプラグインいりません)
・Zバッファによる陰面消去
・ライティング
・フォグ(霧の表現)
・シェーディング(フラット、グーロー)
・光源の種類(平行光源、環境光、点光源)
・光源に色を設定
・マテリアル(Phongの反射モデル)
・基本図形の作成(箱、球体、円柱、トーラス(ドーナツ型のあれ))
・モデルローダー(.mqo)
・テクスチャマッピング
・テクスチャのパースペクティブコレクション(透視補正)
・バイリニアフィルタリング
・環境マッピング(球面反射マッピング、屈折マッピング)

と、こんな感じです。

※カテゴリは物理エンジンと3Dエンジンと両方ですが、3Dエンジンのほうに入れておきます。
[ 2010/03/27 17:36 ] 3D | Comment(2)

3Dエンジン 屈折マッピング!

最初はやるつもりはなかったんですが、方法を発見して実装。
下がその画像です。
ワイングラス(のつもり・・・)はメタセコでモデリングしました。



見えるでしょうか・・・
一応屈折率は変更できます。
自分の環境でギリギリ100FPSに届かず・・・
一度画面をキャプチャしてそれをテクスチャとして使っているので重いようです。
欠点は重いことと縦横の画面サイズが2の累乗じゃないといけないことです(画面をテクスチャとして使うため)。

ちなみにこの際テクスチャのバイリニアフィルタリングも実装しました。

ではアプレットです。
続きからどぞ↓
[ 2010/03/19 15:30 ] 3D | Comment(4)

グーローシェーディング+点光源!

ちょっと遅れましたが(かなり・・・?)Poly3Dのバージョン2.3(最新版)に点光源を追加しました。
ユタティーポットのデータも手に入ったので、早速赤、青、緑の点光源を配置してみました!

結果:


おお!
ティーポット恐るべしw
四角形は光源の位置です。

ちなみにグーローシェーディングなしだとこちら

やっぱりかくかくします。

さて、点光源の光の強さの求め方ですが、、、

ポリゴンの中心点をC、
ライトの位置をP、
ポリゴンの法線ベクトルをN、

とすると(いずれも全てワールド座標系)、


L = P - C
Lの正規化を行う

dot = L・N
dot = max(dot, 0)

これで求めたdotを使ってポリゴンの色を決めます。
後は平行光源と同じなので省略します...


では定番のアプレットです。
続きからどうぞ↓
[ 2010/03/16 17:34 ] 3D | Comment(2)

球状環境マッピング テクスチャ座標の求め方

なんと!
前回紹介したUV座標の求め方が間違っていた!
訂正しておきます。
正しくは

M = 2 * sqrt(r.x ^ 2 + r.y ^ 2 + (r.z + 1) ^ 2)

U = r.x / M + 0.5
V = r.y / M + 0.5

※フェイクマッピングの場合は短縮できます

あ、r は視線の反射ベクトルです。
反射ベクトルはよく書いてあるけど環境マッピングのテクスチャ座標はどこにも書いてない・・・
ので載せました。
今度これで実装しよう。
[ 2010/03/14 15:03 ] 3D | Comment(0)
プロフィール

saharan

Author:saharan

Twitter
検索フォーム


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。