Javaゲーム制作記

いろいろ作ってます  

スポンサーサイト

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

3D表示完成

やった!
やっと3D表示ができました。


前後判定にはZバッファを使用しました。
Zソートよりも精密な方法です。

Zソートが奥の面から表示していくのに対し、Zバッファはピクセルを一つ一つ塗っていきます。
塗るそのピクセルに奥行き情報を記録しておき、その奥行きより手前のピクセルだけ塗っていきます。

Zソートだと面に面が突き刺さっていたりするとうまく表示できませんが、
Zバッファなら大丈夫です。


とりあえず画像↓
ちゃんとパースもかかってます。
Javaによるソフトウェアレンダリング

とりあえずそれっぽいので良しとします。
処理速度のは調べてみた結果、レンダリングの時間は 4ms(1000分の4秒。0.004秒) くらいでした。
こちらもとりあえずOK。
これにまた物理エンジンを組み合たい所ですがまだ箱しか表示できませんO| ̄|_
とりあえず円柱と円錐、球体を追加予定・・・



ちょっとポリゴンの光の色の方程式を書いておきますね。

同じようなことしようとしている方(いるのか?)の助けになればと。。。
分からないことがあったらコメントしてください。
必ず答えられるとはわかりませんが・・・



変数の定義

面の法線ベクトル :n
ライトの方向   :l
環境光rgb   :aR、aG、aB
拡散光rgb   :dR、dG、dB
鏡面光の強さ   :s
鏡面光の累乗係数 :sP

lightPower = n・l
lightSpeqular = s * pow(max(lightPower,0),sP)

colorR = aR + dR * lightPower + lightSpeqular
colorG = aG + dG * lightPower + lightSpeqular
colorB = aB + dB * lightPower + lightSpeqular

これで最終的なポリゴンの色が計算できます。
[ 2010/02/13 18:32 ] 3D | Comment(5)

3Dモデルをディスプレイに表示するまでの手順(レンダリング)の説明

前回はメモ書きでしたが今回はちゃんと解説ということで。。。

とりあえずタイトル通り3Dモデルをディスプレイに表示するまでの手順
をなるべく簡潔に解説します。

3D表示をするためにはまず3Dのモデルが必要になります。
3Dのモデルは頂点と面で構成されています。
今回はこんな三角形にしました。
3D

Z方向は全て0です。

座標系は図のようにYが上方向、Xが横方向、Zが奥行き方向です。
3D


とりあえずモデルは準備できました。
次に、モデルを写すカメラ(視点)を用意しなくてはなりません
そしてモデルの座標をカメラから見た座標に変換します。
3D

そして最後にこのモデルを・・・
Z軸方向でつぶします!
画面は2Dなので奥行き(Z軸でしたよね)は関係ありません。
するとZ方向がなくなって事実上の2Dになりました
後はこれをそのままディスプレイに表示するだけです。


なんとなくどうやっているかわかりましたでしょうか?
今までのことをまとめると、
3D座標上にカメラを置いて写真を撮り、それを表示する
ということです。

しかしこれには膨大な量の計算が必要になります。
それを高速で行うのがGPU(グラフィックスボード)です。
そしてそのGPUに命令を送るのがDirectXやOPENGLといったライブラリなわけです。
GPUにレンダリングをしてもらうことをハードウェアレンダリングといいます。

しかしJavaからはGPUを操作できないので、この処理をCPUにやってもらうわけです。
これはソフトウェアレンダリングといいます。
GPUは描画処理専用に作られていますが、CPUは描画専用ではありません。
なので、かなり重くなるわけです。
最近ではCPUもそれなりの性能になってきたので、大量のポリゴンを表示したりしない限りは特に問題はないでしょう。

________________________________________

現在この3D表示をするプログラムを製作中です。
開発はオープンソースにしたいと思っています。
[ 2010/02/12 11:05 ] Java | Comment(2)

3Dに必要な知識メモ書き

3Dを自分で表示するに当たっての必要な知識を忘れないようにメモ書きしておきます。
読みにくいですがすいません

・ベクトル

x,y,zのパラメーターを持つ。

2ベクトルの内積:x * x2 + y * y2 + z * z2

2ベクトルの外積:
x' = y * z2 - z * y2
y' = -x * z2 + z * x2
z' = x * y2 - y * x2

・行列

3D表示では4*4の要素が必要になる。
ここから引用

スケーリング
[ Sx 0 0 0 ]
[ 0 Sy 0 0 ]
[ 0 0 Sz 0 ]
[ 0 0 0 1 ]

X軸回転
[ 1 0 0 0 ]
[ 0 cosθx sinθx 0 ]
[ 0 -sinθx cosθx 0 ]
[ 0 0 0 1 ]

Y軸回転
[ cosθy 0 -sinθy 0 ]
[ 0 1 0 0 ]
[ sinθy 0 cosθy 0 ]
[ 0 0 0 1 ]

Z軸回転
[ cosθz sinθz 0 0 ]
[ -sinθz cosθz 0 0 ]
[ 0 0 1 0 ]
[ 0 0 0 1 ]

移動
[ 1 0 0 0]
[ 0 1 0 0]
[ 0 0 1 0]
[Px Py Pz 1]

掛け合わせることで一つの行列として扱うことができる

これらを全部クラス化すればできる・・・はず。
[ 2010/02/11 11:06 ] Java | Comment(0)

Javaで3Dエンジン

今まで何度かProcessingを使って3D作品を作ってきましたが、
自分で3Dを描画するシステムを作れないか?と思い製作中です。
ここのページに基礎的なことが書いてあったので参考にしてみます。

ほんとにできるのかどうか・・・
[ 2010/02/10 14:26 ] 3D | Comment(4)

3D水面シミュレーション!

3Dの水面シミュレーションが完成しました!(なぜ作ったしw
いろいろ大変で数時間かかりました・・・O| ̄|_

複雑に見えるけど、計算式は単純です。
ちなみに3DレンダリングにはProcessingを使用しました。
便利すぎるProcessingです。
Eclipseで使えるのがまたうれしい!

とまあそれはさておき
アプレットを載せておきます。
わりと重いです・・・
かくかくするかもです。。。

ではどぞ↓
[ 2010/02/08 18:30 ] ゲーム制作 | Comment(2)

Graphics2Dクラスの便利な使い方

Graphics2Dクラスの使い方を最近いろいろと知ったので書くことにしました。
まず


・Graphics2Dクラスを取得しよう

使い方を知っていても、Graphics2Dの変数がなければ意味がありませんw
取得方法は、

Graphics2D g2 = (Graphics2D) g;

簡単です。キャストするだけです。
ちなみにgはGraphicsクラスです。


・アンチエイリアス

アンチエイリアスとは図形を描いたときに見えるぎざぎざをなくすものです。
二枚の画像を用意しました。
アンチエイリアス無し

アンチエイリアス有り
下の方がきれいに見えるのがわかると思います。
下がアンチエイリアスをかけた状態です。

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);

これで図形がきれいに描画されます。
以下の方法でテキストにもアンチエイリアスをかけられます。

g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

・画像描画時に透明度を設定する

普通、図形を半透明描画するときにはColorの四番目の引数に透明度を設定します。
しかしこの方法では画像は半透明にできません。
そこで以下の方法を使います。

g2.setComposite(AlphaComposite.getInstance(
    AlphaComposite.SRC_OVER, ここに透明度を0~1で指定));

0だと完全に透明(つまり意味無し)、
1だと完全に不透明になります。
0.5あたりにするといいと思います。
ただし、これ以降の描画は全て半透明になってしまいますので、ご注意を。
元に戻す際には、

g2.setComposite(AlphaComposite.getInstance(
    AlphaComposite.SRC_OVER, 1));

としてやればOKです。

・画像の回転
Graphics2Dでは画像を回転できます。

g2.rotate(回転角度ラジアン, 回転の中心座標X, 回転の中心座標Y);

これで以降の描画は全て回転が適用されます。
ただし、これ以降全ての描画に回転が適用されてしまうので、ご注意を。
直すには、

g2.rotate(-回転角度ラジアン, 回転の中心座標X, 回転の中心座標Y);

とします。
よーするに回した分反対に回してやるということです。

____________________________________________________________

他にもtranslateやscaleなど便利なメソッドが沢山ありますが、
使い方は似ているので、調べてみると使えるかもしれません。

では今回はこの辺で。。。
[ 2010/02/06 14:21 ] Java | Comment(4)
プロフィール

saharan

Author:saharan

Twitter
検索フォーム


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