ブロックのペイントと選択のために、レイ ピッキング アルゴリズムを実装しようとしています (したがって、かなりの精度が必要です)。最初はレイ キャスティングの実装を使用しましたが、十分に正確ではないと感じました (交差テストに問題があった可能性はありますが)。とにかく、深度バッファーを使用して選択し、マウス座標をワールド座標に変換してみることにしました。以下の実装:
glm::vec3 Renderer::getMouseLocation(glm::vec2 coordinates) {
float depth = deferredFBO->getDepth(coordinates);
// Calculate the width and height of the deferredFBO
float viewPortWidth = deferredArea.z - deferredArea.x;
float viewPortHeight = deferredArea.w - deferredArea.y;
// Calculate homogenous coordinates for mouse x and y
float windowX = (2.0f * coordinates.x) / viewPortWidth - 1.0f;
float windowY = 1.0f - (2.0f * coordinates.y) / viewPortHeight;
// cameraToClip = projection matrix
glm::vec4 cameraCoordinates = glm::inverse(cameraToClipMatrix)
* glm::vec4(windowX, windowY, depth, 1.0f);
// Normalize
cameraCoordinates /= cameraCoordinates.w;
glm::vec4 worldCoordinates = glm::inverse(worldToCameraMatrix)
* cameraCoordinates;
return glm::vec3(worldCoordinates);
}
問題は、値が簡単に ±3 単位 (ブロックの幅は 1 単位) になり、ニア クリッピング プレーンに非常に近い場合にのみ十分な精度が得られることです。
不正確さは、単精度浮動小数点数の使用に起因するものですか、それとも私の計算の何らかのステップに起因するのでしょうか? 倍精度値を使用すると役に立ちますか? OpenGL は深度バッファーに対してもそれをサポートしていますか?
最後に、この方法がうまくいかない場合、どのポリゴンが選択されたかを正確に識別するためにカラー ID を使用するのが最善でしょうか?