【问题标题】:SketchUp entities mirrored with "flip along (axis)" not reflected in transform matrix用“沿(轴)翻转”镜像的 SketchUp 实体未反映在变换矩阵中
【发布时间】:2013-07-29 23:00:29
【问题描述】:

问题更新在底部....

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

我在进行某些组件/组转换时遇到了问题,并将其追踪到镜像或对某些轴应用了“翻转”的几何体。简而言之,不尊重翻转。我找不到任何 SU Ruby 方法来确定任何给定实体是否应用了这种翻转。

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

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

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

注 2)虽然我认为这是一个 SketchUp Ruby API 问题,但我用 Three.js 标记了这个问题,以防我在镜像和矩阵方面明显遗漏了一些东西..

注 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;。但是对于翻转和以其他方式旋转或缩放的项目没有解决方案:(

【问题讨论】:

  • 让我困惑的一件事,转换矩阵不能喂给 Three.js 吗?
  • 是的,我目前正在将矩阵提供给 Three.js,除了这些翻转的组件外,它大部分都可以工作。图中的模型非常复杂,所有的棕榈树叶和东西,还有里面的家具,都是由组件和组的深层次结构组成的,它们都有自己的变换。鉴于渲染不是一团糟,我必须做正确的事情..确实令人费解的是它不适用于翻转的东西,因为所需的数据显然确实存在于矩阵中。
  • 考虑到内置的 Three.js ColladaLoader 显示出与 SketchUp 导出的 DAE 相同的问题,这让我怀疑 Three.js 中的 Matrix4 实现在涉及负比例时只会感到困惑。或类似的东西。这真的超出了我的专业领域:)
  • Three.js 不支持负比例。 stackoverflow.com/questions/16469270/…
  • 啊,这就解释了。

标签: three.js sketchup


【解决方案1】:

使用我的 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

【讨论】:

  • 非常感谢!这会有所帮助,尽管它还没有完全发挥作用。使用您的转换检查器,我看到,在索引 0、5 或 10 上应用 -1 转换将翻转相应轴上的几何图形。因此,对于基本几何,我可以检查变换矩阵 0、5 或 10 是否为负,以查看它是否在该轴上翻转。如果组件首先翻转,然后任意旋转,则该检查不再起作用。或者它可以认为组件仅在旋转时被翻转。
  • 啊,是的,你说得对。发现这篇文章从概念上描述了人们需要做什么:robertblum.com/articles/2005/02/14/decomposing-matrices
  • 好的,试试这个新的例子。
  • 再次感谢,你真棒!新示例似乎确实像宣传的那样工作:) 它并没有立即解决更复杂的情况,但它们可能是因为单独的小问题 - 矩阵和翻转轴转换为 three.js、嵌套转换和可能的问题与获取矩阵变换有关,并且这种翻转的东西(负比例)在 Three.js 中一起工作。所以我需要一些时间来尝试将其改编为代码,使用各种模型进行测试并确认它是解决方案..
  • @StefanAgartsson - 是的,X_AXIS 是 SketchUp 为 (1, 0, 0) 定义的常量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 2015-03-10
  • 2021-09-19
相关资源
最近更新 更多