1

下部にある質問の更新....

Ruby でカスタムの SketchUp エクスポート プラグインを作成しています。次に、エクスポートされたデータを使用して、Three.js でジオメトリを再作成します。

一部のコンポーネント/グループの変換で問題が発生し、ミラーリング、または一部の軸に「フリップアロング」が適用されたジオメトリまで追跡しました。簡単に言えば、裏返しは尊重されません。特定のエンティティにこの反転が適用されているかどうかを調べるための SU Ruby メソッドが見つかりません。

変換行列を取得して変換することはできますが (この質問の方法を参照してください)、これらの反転されたオブジェクトでは機能しません。結果の例を次に示します。モデルの残りの部分は問題ありませんが、ボートは明らかにボートの半分を反転して作成されており、この写真ではそれらがいたるところに表示されています。

乱雑なボート

これらの反転したジオメトリを適切に考慮するにはどうすればよいですか? SU Ruby には別のマトリックスやエンティティ フラグがありますか?

注 1) 組み込みの SketchUp Collada エクスポータ (Three.js ColladaLoader でロードする場合) で同様のバグのある動作を観察しました。

注 2) これは SketchUp Ruby API の問題だと思いますが、ミラーリングとマトリックスに関して明らかな不足がある場合に備えて、Three.js でタグ付けしました。

注 3) 形状が反転/反転ツールの代わりにスケール ツールを使用して反転/ミラー化されている場合 (実質的に同じ結果)、それらは正しく機能します。

アップデート:

この情報を適用するのにまだ苦労していますが、この情報に基づいて近づいています。

更新#2:

Thomthom のおかげで、回転していないオブジェクトに対して正しい反転を検出して適用することができました。単純な回転/スケーリング/反転していないコンポーネントの場合、マトリックスは次のとおりです。

 1.0, 0.0, 0.0
 0.0, 1.0, 0.0
 0.0, 0.0, 1.0

反転 (ミラーリング) コンポーネントの場合、マトリックスは次のようになります。

-1.0, 0.0, 0.0
 0.0, 1.0, 0.0
 0.0, 0.0, 1.0

そのため、その反転を簡単に検出でき、すべて問題ありません。

しかし、同じコンポーネント (反転していない) をいくつかの軸で任意に回転させると、マトリックスは次のようになります。

 -0.33, -0.58,  0,74
  0.87, -0.50,  0,00
  0.37,  0.64,  0,67

これは私のエクスポーター/インポーターで正しく機能し、Three.js 側でこのマトリックスを再適用できます。

しかし、すでに回転したコンポーネントもミラーリングされている場合、マトリックスは次のようになります。

  0.33,  0.58, -0.74
  0.87, -0.50,  0.00
  0.37,  0.64,  0.67

このマトリックスを Three.js で正しく動作させることができず、コンポーネントがミラーリングされないため、図に示されている動作が発生します。

だから、私は何をすべきかわからない。object.scale.x = object.scale.x * -1;より単純なケース (反転のみ、回転またはスケーリングなし) を検出し、そのようなコンポーネントに対してたとえば Three.js を設定することで、正しい結果を得ることができました。しかし、反転されているか、回転またはスケーリングされているアイテムの解決策はありません:(

4

1 に答える 1

3

Transformation Inspector を使用して、SketchUp マトリックスを 4x4 グリッドで視覚化します: http://extensions.sketchup.com/en/content/transformation-inspector

これを使用して、任意の軸に沿ってフリップしたときにどのマトリックス エントリが変更されたかがわかります。 * **X に沿ってフリップ:** インデックス #1 * **Y に沿ってフリップ:** インデックス #5 * **Z に沿ってフリップ:** インデックス#10

Martin Rinehart は、SketchUp での変換の内訳を書いています: http://www.martinrinehart.com/models/tutorial/tutorial_t.html


方向を指定して反転した軸を見つける:

module TransformationHelper

  def flipped_x?
    dot_x, dot_y, dot_z = axes_dot_products()
    dot_x < 0 && flipped?(dot_x, dot_y, dot_z)
  end

  def flipped_y?
    dot_x, dot_y, dot_z = axes_dot_products()
    dot_y < 0 && flipped?(dot_x, dot_y, dot_z)
  end

  def flipped_z?
    dot_x, dot_y, dot_z = axes_dot_products()
    dot_z < 0 && flipped?(dot_x, dot_y, dot_z)
  end

  private

  def axes_dot_products
    [
      xaxis.dot(X_AXIS),
      yaxis.dot(Y_AXIS),
      zaxis.dot(Z_AXIS)
    ]
  end

  def flipped?(dot_x, dot_y, dot_z)
    dot_x * dot_y * dot_z < 0
  end

end


module Example

  def self.inspect_flipped
    tr = Sketchup.active_model.selection[0].transformation
    tr.extend(TransformationHelper)

    puts "X Flipped: #{tr.flipped_x?.inspect}"
    puts "Y Flipped: #{tr.flipped_y?.inspect}"
    puts "Z Flipped: #{tr.flipped_z?.inspect}"
  end

end
于 2013-07-31T22:44:19.767 に答える