JavaScriptで独自の3Dエンジンを展開し、キャンバス描画のみを使用し、WebGLは使用していません。これは別のMinecraftクローンです。私は箱が大好きです、私を判断しないでください。
これまでのところ、すべてが素晴らしく機能しますが、1つのことを除いて:3Dでは、いくつかの頂点が近くのクリッピングプレーンの背後に移動すると、画面上の投影が奇妙になります(プレーンをトレースするために使用される他の頂点が前面にあると仮定)。
これらのポイントをクリップしてみましたが、これらの頂点を使用するサーフェスの谷を見ることができます。WebGL / OpenGLでは、グラフィックカードがこれらのポイントを処理し、プレーンが正しくレンダリングされますが、ハードウェアにアクセスできないため、これを自分でコーディングする必要があります。
私はそれをどうすればよいのかよく分かりませんが、現在最後に思いついたのは、プレイヤーの近くのクリッピング平面の後ろにあるポイントの投影を逆にすることです。これは、正面にあるスクリーンにポイントを投影する必要があるため、論理的に思えます頂点の。
私の考えは次のとおりです。
以下は、何が起こるかを説明するための画像です。
遠くから見ると、青いボックスは完璧にレンダリングされます。
頂点のいくつかがプレイヤーのクリッピングプレーンの背後にある場合、逆投影を行いますが、正しく見えません。
focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;
顔の描画に使用されるすべての頂点がプレーヤーの背後にあるため、背後の灰色のボックスは完全に削除されます。
これは、ルックアップまたはダウンしたときに起こることです。
私はこの背後にある数学をどうすればいいのかわかりません。誰かがすでに同じ問題に遭遇し、助けてくれることを望んでいます。
lineTo(x,y)
関数が呼び出されるようにする方法があればいいのにと思っていました。