当前位置: 首页 > 面试题库 >

在网格Maya Python API中查询点

魏誉
2023-03-14
问题内容

我试图找出一种计算世界空间点是否在任意网格内部的方法。

如果不是立方体或球体,我不太确定如何计算的数学方法。

任何帮助将是巨大的!


问题答案:

可以使用简单的光线追踪技巧来测试您是在形状的内部还是外部。事实证明,2D,3D对象或什至更高尺寸的对象都具有整洁的属性。就是说,如果您朝任意方向发射任意射线,那么您将处于形状内部,并且仅当您达到形状边界和奇数次时。无需知道正常方向或其他任何信息。只知道您有几个路口。这很容易在2D中可视化,并且由于3D只是许多2D切片,同样适用于3D。

在此处输入图片说明

图1: 从任意方向的某个点发出光线,如果在内部,甚至在外部,则产生奇数次的命中,因此O 1在内部,而O
2在内部。作为一种特例,扫掠命中需要测试曲线,因为它们使2个命中在一个位置重合(O 3)。

在此处输入图片说明

图2: 网格化的曲面具有更好的边界条件,因为只有顶点命中会扫视,但是大多数跟踪引擎会忽略扫视命中,因为完全垂直的命中(O
4)会出现问题,因此在此测试中它们的行为正确。Maya跟踪器也不例外。

请注意,此方法不需要关闭曲面,但它只是有效地关闭了射线方向的缝隙,开放的曲面可能会报告怪异的结果,但它仍然有效。但是在某些情况下可以接受。

诚然,光线追踪是一项繁重的操作,没有执行加速例程,但是一旦进行了加速,它就会变得非常快。Maya
API为此提供了一种方法。请注意,首先构建加速器,然后每个后续调用都便宜得多。这是一个没有加速的快速编写的脚手架,有关如何加速的更多信息,请参阅
MFnMesh 文档。

import maya.cmds as cmd
import maya.OpenMaya as om

def test_if_inside_mesh(point=(0.0, 0.0, 0.0), dir=(0.0, 0.0, 1.0)):
    sel = om.MSelectionList()
    dag = om.MDagPath()

    #replace torus with arbitrary shape name
    sel.add("pTorusShape1")
    sel.getDagPath(0,dag)

    mesh = om.MFnMesh(dag)

    point = om.MFloatPoint(*point)
    dir = om.MFloatVector(*dir)
    farray = om.MFloatPointArray()

    mesh.allIntersections(
            point, dir,
            None, None,
            False, om.MSpace.kWorld,
            10000, False,
            None, # replace none with a mesh look up accelerator if needed
            False,
            farray,
            None, None,
            None, None,
            None
        ) 
    return farray.length()%2 == 1

#test
cmd.polyTorus()
print test_if_inside_mesh()
print test_if_inside_mesh((1,0,0))

在您的特定情况下,这可能是过大了。我假设您正在做某种拒绝采样。也可以用棱柱体构建主体,并使用重心状坐标随机化。这具有永不浪费结果的优点。但是跟踪代码通常更容易使用。



 类似资料:
  • 我目前正在努力获得一个CSS网格来处理一些较小屏幕尺寸的媒体查询。我基本上有一个两行三列的网格,在较小的屏幕尺寸下,它可以向下延伸到三行两列。我想让它进入一个网格,在一个电话大小的屏幕上有6行和一个主列。以下是我目前的代码: } 这在很大程度上是可行的。然而,出于某种奇怪的原因,尽管我在上面做了一些粗制滥造的努力,但这些框并没有集中在较小的屏幕上。下面是完整的代码笔来说明我的问题:https://

  • 网格查看让你在表中查看、更新、插入或删除数据。网格的弹出菜单提供了以下额外功能:设置字段值为 Null 或空白字符串、使用当前字段值作为一个筛选、格式化网格查看、及以更多。 使用导览栏 表查看器 提供了一个便捷的方式来浏览记录或页使用 记录或页导览栏 按钮。全部按钮用于浏览左和右到前一或下一条记录或页。 记录导览栏 按钮 描述 新建记录:输入一个新记录。在任何时候当你在表网格查看中工作,点击这个按

  • pre { white-space: pre-wrap; } 本实例演示如何从数据库得到数据,并将它们显示在数据网格(datagrid)中。然后演示如何根据用户输入的搜索关键词搜寻显示结果。 创建数据网格(DataGrid) 创建带有分页功能的数据网格(datagrid),然后添加工具栏到其中。     <table id="tt"             url="datagrid24_get

  • 问题内容: 是否可以定义一个最大列数的网格,但是当屏幕宽度改变时允许元素包装到新行上? 我有隐式类,允许行包装到新行上,但是没有最大列数。 这是使用弹性盒的一种方法的代码笔 CSS: 另一种方法是使用网格 我想要一个相当通用的解决方案,没有Java脚本或媒体查询,我想实现的目标是否可能? 问题答案: 使用flexbox,您可以简单地将a设置为容器,因为您的元素具有固定的宽度: 唯一的缺点是您需要知

  • 通过监听session对象的方式来实现在线人数的统计和在线人信息展示,并且让超时的自动销毁。 对session对象实现监听,首先必须继承HttpSessionListener类,该程序的基本原理就是当浏览器访问页面的时候必定会产生一个session对象,当关闭该页面的时候必然会删除session对象。所以每当产生一个新的session对象就让在线人数+1,当删除一个session对象就让在线人数-

  • 问题内容: Python noob,因为这是我的第一个项目,所以请原谅我。 在我单击应用程序上的“注销”之前,该网站运行良好。在那之后,网站会给我这个错误:/ login /的SiteNotExist不存在网站匹配查询。 我到处搜索,获得的唯一解决方案与设置站点框架,SITE_ID等有关。我认为计算机上的这些项目都不错,但是找不到帮助你进行检查的演练/指南。 谁能告诉我问题出在哪里以及如何解决?在

  • Python新手,因为这是我的第一个项目,所以原谅我的不熟悉。 在我点击应用程序上的“注销”之前,该网站一直运行良好。之后,网站会给我这个错误:DoesNotExist at/login/Site匹配查询不存在。 我到处搜索,得到的唯一解决方案是建立站点框架、SITE_ID等。我认为我电脑上的这些项目都很好,但是我找不到一个演练/指南来帮助我检查它们。 有人能告诉我问题是什么以及如何解决它吗?提前

  • 我参考了以下链接,用于查询超分类器Fabric网络中的分类器: http://hyperledger-fabric.readthedocs.io/en/release/write_first_app.html 在上面的链接中,他们给出了git-hub链接,在这个链接中我已经完成了所有的步骤,比如,-启动网络-运行查询到分类帐的节点脚本,比如invoke.js,query.js 但是在那个脚本中,他