実際のワーピングの計算では、これは非常に複雑になる可能性があります。ここから始めてみませんか?。
これを適用する方法について説明します。変形をどのように行うかについての数学がすでにわかっていると仮定します。
2つの方法:
1)すべてのフレームで、シリンダーモデルのすべての頂点にアクセスし、何らかの方法でオフセットします。
2)レンダリングするときに、頂点シェーダーで頂点をオフセットします。OpenGL ES 2.0は頂点シェーダーをサポートしています。ある意味であなたは運がいいです。
画面に表示されたオブジェクトのみをワープしますか、それともオブジェクトをワープして、ゲーム内のすべてのオブジェクトが変形したことを認識しますか?
あなたが頂点シェーダでオブジェクトをワープした場合、その前の表示/ラスタライズにのみ、すぐに起こるので、この手段のゲームオブジェクトのどれも変形について知っているんだろう。単にスクリーンセーバーを作成している場合、または変形が小さすぎてオブジェクトの衝突可能な形状に影響を与えない場合は、これで問題ありません。
頂点シェーダーで ジオメトリをワープすると、モデルの元の頂点は実際には移動しません(それらは移動しているように見えます)。
頂点シェーダーの変形
変形していない:
変形した
これは、cgチュートリアルの第6章からのものです(プログラム#14)。
この変形を生成するシェーダーコードは次のようなものです。
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
ご覧のとおり、これは表示の直前に発生します(頂点シェーダーはGPUで発生します)。したがって、CPUコードは、変換された頂点の位置にアクセスする方法がありません(GPUからCPUにデータを送信する方法があります(主にテクスチャを介して))。そこには行きません)。