使用"镜像的SketchUp实体(轴)"没有反映在变换矩阵中

时间:2013-07-29 23:53:32

标签: three.js sketchup

底部的问题更新......

我正在Ruby中编写一个自定义SketchUp导出插件。然后,我使用导出的数据在Three.js中重新创建几何体。

我遇到了一些组件/组转换的麻烦,并将其跟踪到镜像,或者为某些轴应用了“翻转”的几何体。简单地说,翻转并不受尊重。我找不到任何SU Ruby方法来确定是否有任何给定实体应用此翻转。

我可以得到一个转换矩阵,并将其转换(参见this question of mine how),但它不适用于这些翻转的对象。这是一个示例结果;模型的其余部分很好,但船显然是用翻转的半船创建的,在这张照片中它们出现在整个地方:

messy boat

如何正确考虑这些翻转的几何图形?他们在SU Ruby中有某种独立的矩阵或实体标志吗?

注1)我在内置的SketchUp Collada导出器中观察到类似的错误行为(当使用Three.js ColladaLoader加载它们时)。

注2)虽然我认为这是一个SketchUp Ruby API问题,但是我用Three.js标记了这个问题,以防万一我在镜像和Matrixes方面有一些明显的缺失。

注3)如果使用缩放工具翻转/镜像几何图形而不是翻转工具(实际上是相同的结果),它们可以正常工作。

更新:

仍在努力应用这些信息,但根据这些信息越来越近了:http://sketchucation.com/forums/viewtopic.php?f=6&t=3083

更新#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中正确地使用此矩阵,并且组件永远不会被镜像,从而导致可以在图片中看到的行为。

所以,我不知道该怎么做。通过检测更简单的情况(仅翻转,不旋转或缩放),然后在Three.js中为这些组件设置示例object.scale.x = object.scale.x * -1;,我能够获得正确的结果。但是对于翻转和旋转或缩放的物品都没有解决方案:(

1 个答案:

答案 0 :(得分:3)

使用我的Transformation Inspector在4x4网格中可视化SketchUp矩阵: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