8

3D重心のようなものもありますか?はっきりさせておきますが、私はこのサイトとWebの両方で過去2日間重心について読んだり読んだりしているので、ウィキペディアを含むこのトピックに関する既存の投稿を完全に認識しています。

そうは言っても、私がやろうとしていることを説明させてください。基本的に、エッジや頂点を選択したいのですが、面は取得しません。次に、オブジェクトを3D図心位置に配置します。

私が望まないことをお話しします:

  • 頂点の平均は、より詳細なメッシュを持つ任意の方向に引っ張られすぎます。
  • バウンディングボックスの中心。このシナリオではすでに何かが機能しているためです。

重心についての提案は受け付けていますが、頂点またはエッジだけでは、特にエッジループを選択しただけの場合は、どのような種類の質量も定義されないため、これがどのように機能するかわかりません。

キックについては、 @ Emileのコードを参照として使用して、私が作成したPyMELをいくつか紹介しますが、正常に機能しているとは思いません。

from pymel.core import ls, spaceLocator
from pymel.core.datatypes import Vector
from pymel.core.nodetypes import NurbsCurve

def get_centroid(node):
    if not isinstance(node, NurbsCurve):
        raise TypeError("Requires NurbsCurve.")
    centroid = Vector(0, 0, 0)
    signed_area = 0.0
    cvs = node.getCVs(space='world')
    v0 = cvs[len(cvs) - 1]
    for i, cv in enumerate(cvs[:-1]):
        v1 = cv
        a = v0.x * v1.y - v1.x * v0.y
        signed_area += a
        centroid += sum([v0, v1]) * a
        v0 = v1
    signed_area *= 0.5
    centroid /= 6 * signed_area
    return centroid

texas = ls(selection=True)[0]
centroid = get_centroid(texas)
print(centroid)
spaceLocator(position=centroid)
4

4 に答える 4

8

理論的には、パーツをそれぞれ位置とボリューム値centroid = SUM(pos*volume)/SUM(volume)を持つ有限ボリュームに分割する場合。posvolume

これはまさに、複合部品の重心を見つけるために行われる計算です。

于 2011-01-28T02:47:17.007 に答える
3

3D重心だけでなく、n次元重心もあります。その式は、引用したWikipediaの記事の「積分式による」セクションに記載されています。

おそらく、この積分の設定に問題がありますか?あなたは自分の形を定義していません。

[編集]あなたのコメントに応えて、この答えを強化します。エッジと頂点の観点から形状を説明したので、多面体であると想定します。ポリエドロンをピラミッドに分割し、ピラミッドの図心を見つけることができます。次に、形状の図心が図心の図心になります(この最後の計算はja72の式を使用して行われます)。

私はあなたの形が凸状であると仮定します(中空部分はありません---そうでない場合はそれを凸状の塊に分割します)。内部のポイントを選択し、頂点にエッジを描画することで、ピラミッドに分割(三角形分割)できます。次に、形状の各面がピラミッドのベースになります。ピラミッドの図心の公式があります(これを調べることができます。顔の図心から内部の点までの距離は1/4です)。次に、言われたように、あなたの形状の重心は、他の答えで与えられているように、重心の重心--- ja72の有限計算であり、積分ではありません---です。

これはHughBothwellの答えと同じアルゴリズムですが、1/3ではなく1/4が正しいと思います。おそらく、この説明の検索用語を使用して、どこかに潜んでいるコードを見つけることができます。

于 2011-01-28T02:27:27.850 に答える
2

私はその質問が好きです。重心は正しく聞こえますが、問題は、各頂点の質量はどれくらいかということです。

頂点を含む各エッジの平均の長さを使用してみませんか?これにより、密なメッシュで領域が適切に補正されます。

于 2011-01-28T02:10:18.483 に答える
1

頂点から顔情報を再作成する必要があります(基本的にはドロネー三角形分割)。

頂点が凸包を定義している場合は、オブジェクト内の任意の点Aを選択できます。オブジェクトを、頂点Aと各面をベースとするピラミッド型プリズムのコレクションとして扱います。

各面について、面積Faと2次元重心Fcを見つけます。その場合、プリズムの質量は体積に比例し(== 1/3ベース*高さ(面に垂直なFc-Aの成分))、すべてのプリズムで同じことを行う限り、比例定数を無視できます。重心は(2/3 A + 1/3 Fc)、つまり頂点から底辺の2d重心までの3分の1です。

次に、重心点の質量加重平均を実行して、オブジェクト全体の3D重心を見つけることができます。

同じプロセスが非凸包、または船体の外側のAでも機能するはずですが、面の計算が問題になる可能性があります顔の利き手に注意する必要があります。

于 2011-01-28T03:17:26.790 に答える