4

境界球の半径を 2 つの方法で計算することができましたが、希望どおりの結果が得られません。「ピクセル」の完全な境界球は必要ありませんが、現在持っているものよりも優れたものが欲しいです。

私は Wavefront .obj モデルを使用しており、これらのモデルの境界球半径を計算するために、現在のモデルの寸法を抽出します (Nate Robbins の GLM ライブラリを使用しています)。これにより、各軸の寸法が得られます。

最初のアプローチ: 各軸を 2 で割ると、各軸の半径が得られます。最大のものは、境界球に使用するものです。これは、私のプロジェクトに固有のほとんどのオブジェクトで機能します。立方体のようなものではうまくいきません。基本的に、立方体があり、このアプローチで半径を計算すると、球は立方体の角を外側に残します。

2 番目のアプローチ: 各軸を 2 で割ると、各軸の半径が得られます。次に、境界球の半径を取得するためにこれを行います。

r = SQRT(x*x + y*y + z*z)

しかし、これは私にかなり大きな半径を与えます。オブジェクトは球に完全に囲まれますが、球はかなり大きく、必要以上に大きくなっています。

上記の式で何が間違っているのかわかりませんが、私が知る限り、うまくいくはずです。でも明らかに間違ってる…

4

3 に答える 3

6

2 番目のアプローチでは、境界ボックスの境界球が得られるはずですが、発見したように、ボックス以外の場合は必要以上に大きくなります。

モデル ポイントを変換して、既にあるバウンディング ボックスの寸法を使用して原点を中心に配置し、個々の頂点ごとsqrt(x*x + y*y + z*z)に、式を使用してそのポイントの原点からの半径を計算することで、より優れた境界球を見つけることができます。それらのいずれかが最大のものは、境界球の半径です。

これは最適な境界球ではないことに注意してください。そのためには、モデルの凸包を見つけ、回転キャリパーなどを使用して球の最適な中心点を選択する必要があります。

2D で表示するには、赤いアウトラインが形状の境界ボックスであり、青い円がボックスの境界円です。ポリゴンの頂点を使用し、ボックスを中心とする改善された円は緑色です。黒い多角形のどの点も青い円に接触していないことに注意してください。

ポリゴン (黒)、境界ボックス (赤)、ポリゴンの境界円 (緑)、ボックスの境界円 (青)

于 2011-05-21T17:33:37.497 に答える
1

簡単な方法の 1 つは、 Miniballを使用してモデルの境界球を正確に計算することです。単一のヘッダーのみで構成されているため、プロジェクトへの統合は簡単です。ただし、GPL の下でライセンスされているため、問題になる可能性があります。例:

#include "Miniball.h"

// ...

Miniball<3> boundingSphere;

// Iterate over all vertices in the model
for (int vertexId = 0; vertexId < model.getNumVertices(); ++vertexId) {
  // Convert vertex position to Miniball point type
  Point<3> point;
  for (int dim = 0; dim < 3; ++dim) {
    point[dim] = model.getVertex(vertexId)[dim];
  }
  // Add point to bounding sphere
  boundingSphere.check_in(point);
}
// Actually calculate the sphere
boundingSphere.build();

// Get back the results
Point<3> center = boundingSphere.center();
double radiusSq = boundingSphere.squared_radius();
于 2011-05-21T18:35:43.607 に答える
0

球体なら一軸で計算すればいいじゃないですか。私はここからかなり離れているかもしれませんが、定義上、球は同じ幅、高さ、深さを持っているのではないでしょうか? では、ある軸の半径 = 別の軸の半径 = 別の軸の半径?

于 2011-05-21T17:26:10.047 に答える