2016-06-14 13 views
0

これは少しの背景情報が必要だと思います: 私はMinecraftをしばらく改造していましたが、私はいつも自分のゲームを作ろうと思っていたので、新しくリリースされたLWJGL3を掘り起こし始めました。はい、私はそれがちょっとレベルだとわかっています。私はエンジンやものを使うべきです...確かに、私はすでにいくつかのエンジンを試しましたが、私がやりたいことと決して一致しないので、私はその問題に取り組みたいと決めました。 これまでのところ、メッシュをレンダリングしたり、「カメラ」などを移動する方法を理解しています。学習曲線を喜んで利用しています。最新のOpenGLで「オンザフライ」で簡単なアニメーションを作成する方法はありますか?

しかし、実際には、すべてのチュートリアルでモデルを読み込んで骨格アニメーションなどを作成する方法が説明されていますが、実際にはそうしたくないと思います。 Minecraftコードで作業することの多くはひどいものでしたが、Javaコードからモデルやアニメーションを作成する方法が好きでした。確かに、それは現実的な超に見えませんでしたが、私はBlenderとどちらも素晴らしいとは言えないので、私は "古典的な"モデルとアニメーションが助けになるとは思っていません。とにかく、そのコードでは、ボックスを回転させてクリーチャーをプレイヤーに見せるようにすることができました。私はMinecraftが即時モードを使用していたので、洞機能を使って足と腕(私の場合は翼) Javaはグラフィックカードに各頂点を描画する場所を直接伝えることができます。

実際の質問:最新の(3.3+)OpenGLでダイナミックアニメーションを作成する良い方法はありますか?私のモデルは基本的にシェイプ(ボックスなど)の階層構造になっていて、その場でそれらを回転できるようにしたいと考えています。しかし、私はどのようにそれを整理するか分からない。各サブ形状のすべての平行移動/回転行列を保存しますか?モデルが持つことができるサブ形状の量には厳しい制限がありますか?誰かがそれを試してみましたか?

編集:明確にするために、私が何をしたか、このようなものに見えた:

モデル作成:https://github.com/TheOnlySilverClaw/Birdmod/blob/master/src/main/java/silverclaw/birds/client/model/ModelOstrich.java モデルは、コンストラクタ内箱の束として作成され、スケールと回転を設定レンダリングしsetRotationAngles方法を。

答えて

1

基礎を理解するために、openglチュートリアルに従ってください。

"Learning Modern 3D Graphics Programming"、特にthis chapterをお勧めします。複数の関節を持つ1つのロボットアームを動かします。

enter image description here

私はJOGL hereを使用してJavaでポートをしましたが、あなたはLWJGLを超えるポートを簡単にすることができます。

+0

私はすでに[このLWJGL3-book](https://www.gitbook.com/book/lwjglgamedev/3d-game-development-with-lwjgl/詳細)とOpenGLチュートリアルの束が、私が探しているものが含まれているようです、ありがとう。 – Silverclaw

0

はい、いいえ。

シェイプの階層を持ち、それぞれに相対的な変形を保存することができます。 たとえば、「プレイヤー」は100,100,10(プレーヤーがいる場所)への翻訳を持つことができます。そして、「ヘッド」サブコンポーネントの翻訳は0,0,5(z軸上でちょっと高い) 。

これらは行列として格納できます(変換、ローテーション、スケーリングをエンコードすることができます)。glPushMatrixとglPop行列を使用して、OpenGLで管理されているスタックに行列を追加したり削除したりできます。

draw()機能(またはあなたがそれを呼び出す何でも)のようなものになります。これはあなたの階層セットアップを与える

glPushMatrix(); 
glMultMatrix(my_transform); // You can also just have glTranslate, glRotate or anything else. 
// Draw my mesh 
for (child : children) { child.draw(); } 
glPopMatrix(); 

オブジェクトは、親と一緒に移動するように。あるいは、メインメモリにスタックを持ち、乗算を自分で行うこともできます(ライブラリを使用します)。 OpenGLスタックには制限(実装に依存)があるかもしれないと思いますが、あなた自身で処理する場合、唯一の制限は使用できるRAMの量です。一度すべての行列が乗算されると、レンダリングは同じ時間内に実行されます。つまり、メッシュが階層内にどれだけ深くあるかはパフォーマンスに関係ありません。

実際のアニメーションでは、中間変換を計算する必要があります。例えば、かわいいアニメーションの場合、おそらくカメラが低い位置にジャンプするだけでなく、その間に数フレームを置くことが望ましいでしょう。開始位置と終了位置の間に時間ベースの線形補間を使用してこれを行うことができますが、これは単純なアニメーションのみを対象とし、依然として自分で実装する必要があります。

自分で実装する必要があるものは、もっと複雑なもの(骨のリンクに基づいてメッシュを変更するもの)です。

+0

ありがとうございます。あなたの答えは、Minecraft/LWJGL2.xがやっていた "古い"プッシュ/ popMatrix操作をカバーしていますが、シェーダーベースのOpenGLでは利用できません。 – Silverclaw

+0

はい、これらの呼び出しは廃止されましたが、そのコンセプトは残っています – elect

1

あなたが探しているのは正確に骨格アニメーションですが、唯一の違いは骨のアニメーションをロードしたくないのに、その場で変換を計算/生成したいということです。

基本的には、骨の階層とそれに付随するジオメトリがあります。このジオメトリを「厳密に」操作したいので、メッシュ/トランスフォームをGPU(古典的な方法)に送信する前に、モデルまたはワールド空間で新しいトランスフォームを計算してから、新しく計算された行列gpuのジオメトリを標準的な方法で描画します。

Sorinによれば、各変換を計算するには、親ボーンの変換と親変換の変換を考慮して変換を累積するだけで済みます。

関連する問題