SketchUp为什么变换向量和变换点不同?

当我写代码的时候,这给我带来了很多困惑和头疼。 如果你用Geom::Vector3d#transform(transform)或Geom::Transformation#*(vector)翻译一个向量,你会得到等价的矩阵运算TV,但是如果你用Geom::Point3d#transform(transform)或Geom::Transformation#*(point)翻译一个点,你会得到等价的矩阵运算PT。这有什么意义? 我猜您所指的Ruby API中没有任何方法。你可能想提到Vector3d#transform-instance_method 1… 很可能我不是最好的解释,但是有一点我认识到: 如果你同时检查Geom::Vector3d和Geom::Point3d构造函数的细节… #initialize(x, y, z) ⇒ Geom::Vector3dvs#initialize(x, y, z) ⇒ Geom::Vector3d Parameters: x (Numeric) y (Numeric) z (Numeric) 或者: #initialize(array3d) ⇒ Geom::Point3dvs#initialize(array3d) ⇒ Geom::Vector3d Parameters: array3d (Array(Numeric, Numeric, = [100,200,300] #only the context will tell what it is 你不应该对矩阵运算的相似性感到惊讶。 我希望会有另一位真正的专家谁会解释得更好…dezmo: 我想在Ruby API中没有你所指的方法。你也许想提一下Vector3d#transform-instance_method… 嗯,是的,是的昨晚和API打了一个长夜…我更新了问题。dezmo: …矩阵运算的相似性不应该让你感到惊讶。 问题是使用向量类似于将变换矩阵乘以向量矩阵(TV),但使用点的变换类似于将点乘以变换矩阵(PT),我本以为它们都是后者,而不是后者不一样。那个,或者可以用更清晰的习惯用法来控制顺序,例如Vector3d#*(transformation)/Point3d#*(transformation)代表VT/PT和Transformation#*(vector)/Transformation#*(point)代表TV/TP和所有通过名为transform的成员函数进行的向量/点变换都是VT/PT. 我甚至不确定将变换矩阵乘以向量/点会得到什么结果(但话说回来,我的矩阵代数已经生锈了。阿德里安: 嗯,是的。昨晚和API打了一个长夜…我更新了问题。 供将来参考并与Ruby语言一起使用: 通常只引用使用::范围运算符作为方法前缀的模块或类方法。例如…… Sketchup::active_model() …并使用#代替点或范围运算符,例如方法。也就是说… Geom::Vector3d#transform() 这样我们马上就能知道讨论的是哪种方法。我们可以在文档中的适当部分找到类的方法定义。(类方法通常列在实例方法之上。)在Ruby核心文档1中,您将看到这一点。 dezmo: …您不应该对矩阵操作的相似性感到惊讶。 dezmo得到的是SketchUp API,他们在类中编写了许多方法,以交替使用数组、向量、点和变换。通常使用一个简单的文本数组来表示一个用于转换的向量,API方法接受这一点。例如: # Where old_pt is a Geom::Point3d> adrianh: I\"m not even sure what the point of multiplying a transformation matrix to a vector/point would even get you … ADD: The result is a new Geom::Point3d1对象比旧对象高出(Z方向)32***英寸。 此代码可能会稍微清除一些内容(或=Geom::改造。新建(偏移量)tr.至.每个|片(4){| a | pa}#通过变换和Arrayputs的\"点操作\"putspt1.transform(tr)putspt1.transform转换Point3d对象(偏移量)putspt1型+ 偏移量到#a#Vector3d类用于表示三维空间中的向量。#SketchUp中的向量有方向和长度,但不是起点https://ruby.sketchup.com/Geom/Vector3d.html#%2B-instance#u method###这里的含义是,如果您通过transform方法翻译一个向量,您可以原封不动地返回该向量,但是,您可以向向量添加一个数组#以获得上一个示例中所示的预期结果示例#通过puts\"Vector operations\"puts vc1.transform(tr)puts vc1.transform转换vector3d对象(偏移量)输入vc1+偏移量 我假设line1将与Z轴平行,但不是!!!最后,我明白了Sketchup认为点2是一个向量,而不是一个点。 。(\"default\"不是在文档中写的,你必须自己去发现… Since both variable above (point1 , point2)当前是一个数组,这里的上下文将第二个\"point2\"解释为向量。这条线将穿过point1,方向是一个45°的向量。 但是,\"第二形式\"是一个由两个点组成的数组,方向是从point1到point2(0,0,10) ,如果你在第en预期结果更清晰…DanRathbun: 供将来参考并与Ruby语言一起使用: 谢谢。我来自C++背景,所以这对我来说是新的。我将更新上面的帖子。DanRathbun: ***38***对象比旧对象高出(Z方向)39***英寸一个。 哦,这是一个有趣的未记录的操作。我想你需要这样做这个> 数组可以在所有地方使用***40***对象吗?或者这是针对***41***的?我注意到数组在某些上下文中可以用来表示点或向量,但在另一些上下文中它会导致错误,使使用不一致,至少(也许)乍一看?它肯定没有完整的文档记录。majid866: 我假设line1将与Z轴平行,但不是!!!最后,我理解了Sketchup把point2看作一个向量,而不是一个点。 。(\"default\"不是在文档中写的,你必须自己去发现… ***42***)当前是一个数组,这里的上下文将第二个\"point2\"解释为向量。线将穿过***43***,方向是45°向量。 但是\"第二形式\"是两个点的数组,其中***45***是行形式的点,***46***是变换矩阵。但是,则矩阵乘法是不可传递的,因此在这种情况下指定了***47***一种让人以为你是把变换矩阵和点相乘的方法,事实并非如此(你是把点和变换相乘),然而,你实际上是把变换和向量相乘,这是一种更进一步的方法惊喜。来了有计算机科学和数学背景,我很惊讶这个API是如何实现的构造。上下文,这个API到处都是。 现在,考虑到我刚才所说的,请把我在其他文章中所说的作为上下文重读,也许你会明白我的意思。adrianh: 我注意到数组在某些上下文中可以用来表示点或向量,但在其他上下文中它会导致错误,使使用不一致,至少(也许)乍一看?SketchUp API扩展了核心Ruby***48***类,因此。具体来说,它包含的方法允许数组的行为与Geom::Vector3d或Geom::Point3d对象(可以认为是3个坐标值的数组)一样。因此,可以使用Array类代替Geom::Point3d或Geom::Vector3d传递坐标值。 好吗?现在许多API方法文档都会列出Point3ds、Vector3ds和Array作为选项。但是,API团队在文档中这样做并不是一个硬性规定(稍后将详细介绍)。 当我们发现一个方法需要一个点或一个向量,但不需要数组时,我们在API issue Tracker中打开一个问题,通常它会得到修复。adrianh: 是否可以在所有需要***49***对象的地方使用数组?或者这是针对***50***的? 我可以说它可以用在其他地方…例如: - ***52*** - ***53***> - ***58*** 这个模型只是一个不完美的比喻。平移变换改变对象的位置,但不改变方向。你怎么能改变风吹向田野的位置?它没有一个开始的位置。它是一个方向,而不是一个位置。 对于位置或点,旋转变换也会出现类似的情况。旋转构造函数需要位置、向量和角度。位置和向量定义了一个几何li是旋转轴。如果你试着旋转一个位于那条线上的点,它的位置不会改变。作为向量的同一个三元组将通过旋转来旋转(除非向量平行于旋转轴)。矩阵运算对位置和方向的影响是故意不同的。 你说:阿德里安: 为什么不呢?我自己就想对一个向量做这样一个操作,我必须对一个向量进行一次又一次的难看的转换。 你可以用duck类型限制一些,但不是所有难看的转换,包括\".tou a\"方法。但是,如果开始将数组用作Point3d或Vector3d,则需要进行测试,以了解如何处理数组。最好让Vector3d类有一个\"tou pt\"强制转换,Point3d有一个\"tou vec\"强制转换。 可以使用精化2… ***73*** ***74*** 精炼。有趣我有空的时候会进一步调查的时间。Thx. 我知道其他一些API,比如Unity,使用单个vector类表示方向和位置。在这些情况下,您可以选择在乘法时是否应该考虑转换的转换部分。 在SketchUp Ruby API中,不同的类表示方向和位置。在创建对象时,已经可以选择如何进行乘法了。 我认为这两种设计都是有效的,但是如果您习惯了另一种设计,那么这两种设计都会让人困惑。SketchUp最初是为\"我们其他人\"创建的一个三维建模器。这个程序被设计得比现有的程序更直观,所需的技术知识更少,我认为这也可以从API设计中看出。如果你在大学里学的是线性代数,把矩阵和N维向量当作抽象的数学概念来思考是有意义的,但是如果你没有或没有什么专业的数学知识,用像位置这样的视觉概念来思考,方向和\"坐标系中的差异\"更有意义。 我的建议是,在创建对象时要明确它所代表的内容。对所有方向使用Vector3d,对所有位置和变换使用Point3ds应该是\"神奇的\"工作。adrianh: 无论如何。看起来我问的只是每个人的问题。我通过我的矩阵代数理解了这些变换,我在很多年前就做过矩阵代数。要变换一个点,需要将点/向量作为行矩阵,并将其与变换矩阵相乘。因此***75***,其中***76***是行形式的点,***77***是变换矩阵。然而,矩阵乘法是不可传递的,因此***78***的指定方式使人认为你是将变换矩阵与点相乘,事实并非如此(你是将点与变换相乘)。然而,实际上是将一个变换与一个向量相乘,这是另一个惊喜。来自计算机科学和数学背景,我很惊讶这个API是如何构造的。在上下文中,这个API有点到处都是。 现在,考虑到我刚才所说的,请把我在其他文章中所说的作为上下文重读,也许你会明白我的意思。 是的,我同意。让变换的乘法运算符***79***接受点/向量/平面是很奇怪的。 我个人从未使用过这些重载。我只使用***80***运算符与其他矩阵相乘。我在点和向量对象上使用显式***81***方法。 我不确定这些重载背后的原因是什么。它们都是旧代码,早在SketchUp开发团队中就有人使用过,所以这已经被历史所遗忘了。我们现在被它困住了。 另一件事我有点抱怨,那就是我们把***82***的意思说得太多了。它可以表示点、向量、直线、平面、变换等,有时很方便,但也会导致不幸的歧义。对于线和平面的概念,你可以使用数组。我更喜欢专用型的。但在这一点上,现有的代码和逻辑太多了,我怀疑引入新类型的价值有多大。 可能是最初的实现者添加了***83***转换重载,以允许平面和线进行转换。因为他们没有自己的类型,唯一的方法就是这种向后语法(***84***)。 这也可能是代码重复使用的错误。点和向量类内部没有转换方法。API层为***85***和***86***伸出援手。可能API的原始实现者不知道这不知道操作顺序很重要。目前未知。 实现看起来是这样的:

SketchUp在扩展仓库中更改扩展的价格不再是即时的…为什么?

我想把这个假期所有的分机都降价,但由于新分机仓库的变动,我不能降价。以前更改插件的成本非常容易,现在需要永远的时间。可以像以前那样更改吗?谢谢!现在是否需要您创建一个新草稿并再次进行审阅?办公室已在假期关闭,因此我们目前正在积压处理审阅队列。它应该很快就会恢复正常。我们正在计划清理编辑/提交过程,以便再次只有一个新的RBZ需要一个新的草稿和审阅。tt琰su:现在是否需要您创建一个新草稿并再次审阅?是的...

日期:2021-06-26 02:00:03 浏览:583

SketchUp访问组的实体以应用/更改材质

您好,据我所知,可以在组中添加实体。是否有任何方法可以访问组的特定面(例如:大小为1米、1米、1米的立方体,由6个面组成)并在每个面上应用不同的材料。谢谢这是完全可能的,尽管你需要使用的技巧取决于你对你想要的脸的了解程度油漆。一些示例:- 如果您自己创建了面,您可以立即应用材质>- 如果您知道感兴趣的面已经在组中,您可以检索它们>然后需要决定数组中的哪个面将接收哪个面材料。那个可以通过测试每个面的正常。注意grep将在组中找到所有的面孔,如果有其他人在场的话,这些面孔可能会包含比你想处理的更多的面孔我也是。...

日期:2021-06-26 05:00:05 浏览:723

SketchUp保持数值而不考虑单位

我已经开始开发一个插件,我希望输入框中的值以当前单位输入。当前如果我指定>如果模型是mm,它就可以工作,但是如果是英寸就不行。如果我只是有了相同的>如果模型是英寸而不是毫米就可以工作。有没有某种自动转换,我可以把@radius的值建立为当前的工作单位?Class:Length 1Class:Numeric 1我很欣赏文档的链接,但我已经了解了这一点,仍然不知道如何转换为当前单位。确保将默认的inputbox维度值设置为Sketchup长度。然后它将自动转换并保存为长度值(以英寸为单位)并以模型单位显示,自动...

日期:2021-06-26 06:00:03 浏览:990

SketchUp复制组/组件时出现持续的ID错误

rigin(在片段中设置)。对于你的mod,明显的旋转中心是短线的末端(右侧):这不是我的目标。这实际上使用了Sasquatch:此外,用户可以通过文本指定副本的数量(使用\"s\")供参考,所有本机工具都使用\"s\"表示边的数量,使用\"x\"表示副本的数量。明白了,按照建议从\"s\"更改为\"x\"。与此同时,我弄明白了为什么我的\"卷积\"代码产生了正确的转换,而你的代码却没有…在你的代码中,你添加每个新实例,同时对其执行转换,这只会导致相对于预选组的局部轴的转换,而是关于模型空间(或worlds...

日期:2021-06-26 07:00:04 浏览:747

SketchUpC点/引导点的样式是否可行?

我正在测试用点云做房子模型。导入点(dxf),SketchUp将其转换为许多cpoint。使用这些进行捕捉的建模很好。我的问题是:是否可以\"样式化\"cpoints?比如尺寸、颜色等?更多的视觉控制可能会更好。另外,API中是否有其他实体可以将这些CPoint转换为更小/更精细/更可定制的CPoint?通常,他们应该在渲染选项散列(样式)中采用指导色的颜色,如果\"按标记颜色\"处于禁用状态。如果\"按标记颜色\"处于启用状态,则他们将使用层/标记颜色显示。实验表明,指定材质不会使他们按材质显示。(即,指...

日期:2021-06-26 07:00:04 浏览:656

SketchUp如何获取html值

从HTML对话框获取值时出现问题。This is callback function at sketchup.add_action_callback(\"receiveValue\") { |not_used, id, val|receive_value(id,val)}def receive_value(id,>I try to get input value like this, but I can\"t get>I can\"t get dlgValues, so I checked the size...

日期:2021-06-26 12:00:03 浏览:816

SketchUp如何判断V-Ray渲染是否已完成

你好!我正在使用V-Ray自动渲染,但遇到了一个问题,即无法知道渲染何时完成。目前我渲染场景,然后等待20秒,更改模型的材质,然后再次渲染,但如果渲染在5秒内完成,这是一个非常无效的系统。到目前为止,我已经完成了尝试了live_scene.renderer?布尔值和几个VRay::Renderer::IDLE_变量,但没有成功。问题是,在从扩展渲染循环时,布尔值不会更改,因此代码总是超时,即使渲染更快完成。下面是一些示例+=1if i>20puts\"超时渲染\"BreakEndModel.commi...

日期:2021-06-26 14:00:01 浏览:1169

SketchUp rubyapi:将工具栏停靠到其他工具栏

我已经创建了自己的工具栏,但是我不知道如何将它自动停靠到行上,所有其他工具栏都已经位于行上(在下拉菜单下)。有什么提示吗?DanRathbun在post#2中解决的用户必须进行对接。您所能做的就是调用#restore。用户必须进行对接。你所能做的就是打电话给#restore4...

日期:2021-06-26 15:00:04 浏览:819

SketchUp从多个曲面创建多个组

大家晚上好,我有一张约2000个小表面的图纸,我想分组制作,然后推拉。创建曲面后,如果图形是新的,下面的脚本工作得非常好。当我只选择第二个或第三个曲面时,它仍然运行得很快,但是当我选择了一个并且在脚本中有一个以前创建的组时,它只以一半甚至更少的速度运行,脚本变成\"没有响应\",但最终在后台运行一段时间后它就完成了。即使我重新启动sketchup甚至pc并重新运行脚本,它仍然很慢。当我分解所有组并进行另一个选择时,脚本又变快了。如果我做错了什么,也许有人能告诉我。我的笔记本电脑有16 GB内存,图形卡是,并...

日期:2021-06-26 20:00:05 浏览:637

SketchUp有没有办法加快添加面和边的速度?

我正在创建一个进口商。我用实体添加面以及实体添加边导入一个模型,但是要花很多时间。54234个面需要11秒来添加面85417个边需要9秒来添加边这是一个简单的模型。对于复杂模型,创建面和边的时间太长,无法接受。我怎样才能加快速度?谢谢。您是否创建了撤消操作并在操作过程中关闭了UI?- Sketchup::Model#start_operation- Sketchup::Model#commit_operation您是否考虑过创建虚拟多边形网格…- Geom::PolygonMesh4class…然后在操作中...

日期:2021-06-27 00:00:03 浏览:853