- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
开始进行 Maya C++ API 插件开发。我只想创建一个插件,当插件作为一种 hello world 插件运行时,它会生成一个单位大小为 1 的立方体。
我该怎么做?似乎严重缺乏关于如何做简单事情的教程。我查看了 Maya API C++ 示例,但没有关于我能看到的示例所执行的操作的描述。
最佳答案
我使用 Python API 2.0 创建了这个示例,因此您可以在脚本编辑器中执行它并使用它,然后再使用 C++ API,因为它并没有真正为您提供相同的灵 active 。
import maya.cmds as mc
import maya.api.OpenMaya as OpenMaya
mesh = OpenMaya.MFnMesh()
# Simple unitCube coordinates
vertices = []
vertices.append(OpenMaya.MPoint(1, 1, 1)) # 0
vertices.append(OpenMaya.MPoint(1, -1, 1)) # 1
vertices.append(OpenMaya.MPoint(1, -1, -1)) # 2
vertices.append(OpenMaya.MPoint(1, 1, -1)) # 3
vertices.append(OpenMaya.MPoint(-1, -1, 1)) # 4
vertices.append(OpenMaya.MPoint(-1, 1, 1)) # 5
vertices.append(OpenMaya.MPoint(-1, 1, -1)) # 6
vertices.append(OpenMaya.MPoint(-1, -1, -1)) # 7
# Number of vertices per polygon
polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
# How each group of N vertices per polygon is connected.
#
# Because for each vertex I have specified the list index number, I can use the
# same number to uniquely identify each face of the polygon to actually build
# the connection between each vertex.
polygonConnects = []
# First polygon
polygonConnects.append(0)
polygonConnects.append(1)
polygonConnects.append(2)
polygonConnects.append(3)
# Second polygon
polygonConnects.append(0)
polygonConnects.append(5)
polygonConnects.append(4)
polygonConnects.append(1)
# Third polygon
polygonConnects.append(5)
polygonConnects.append(6)
polygonConnects.append(7)
polygonConnects.append(4)
# Fourth polygon
polygonConnects.append(6)
polygonConnects.append(3)
polygonConnects.append(2)
polygonConnects.append(7)
# Fifth polygon
polygonConnects.append(0)
polygonConnects.append(3)
polygonConnects.append(6)
polygonConnects.append(5)
# Sixth polygon
polygonConnects.append(1)
polygonConnects.append(4)
polygonConnects.append(7)
polygonConnects.append(2)
mesh.create(vertices, polygonCounts, polygonConnects)
在这个例子中:
MFnMesh 是处理网格及其操作的 API 类。
您可以在此处找到更完整的文档:
基本上,要生成您自己的网格,您需要三样东西:
所以,在立方体中我们将有:
6 * 4
个元素,因为每个面都有 4 个顶点。在单位立方体情况下,第一个数组非常简单且不言自明:
vertices = []
vertices.append(OpenMaya.MPoint(1, 1, 1)) # 0
vertices.append(OpenMaya.MPoint(1, -1, 1)) # 1
vertices.append(OpenMaya.MPoint(1, -1, -1)) # 2
vertices.append(OpenMaya.MPoint(1, 1, -1)) # 3
vertices.append(OpenMaya.MPoint(-1, -1, 1)) # 4
vertices.append(OpenMaya.MPoint(-1, 1, 1)) # 5
vertices.append(OpenMaya.MPoint(-1, 1, -1)) # 6
vertices.append(OpenMaya.MPoint(-1, -1, -1)) # 7
如您所见,我有 8 个顶点,每个顶点都有相对于原点的特定坐标。
第二个数组也很简单。
polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
我在这里定义了我的立方体每个面都有 4 个顶点(因此由四边形组成)。
最后一个数组。
有了这个,您不仅会描述需要使用女巫顶点来绘制每个 4 面,还会帮助您根据顶点 ID 的插入顺序定义每个面的法线方向。
polygonConnects = []
# First polygon
polygonConnects.append(0)
polygonConnects.append(1)
polygonConnects.append(2)
polygonConnects.append(3)
# Second polygon
polygonConnects.append(0)
polygonConnects.append(5)
polygonConnects.append(4)
polygonConnects.append(1)
# Third polygon
polygonConnects.append(5)
polygonConnects.append(6)
polygonConnects.append(7)
polygonConnects.append(4)
# Fourth polygon
polygonConnects.append(6)
polygonConnects.append(3)
polygonConnects.append(2)
polygonConnects.append(7)
# Fifth polygon
polygonConnects.append(0)
polygonConnects.append(3)
polygonConnects.append(6)
polygonConnects.append(5)
# Sixth polygon
polygonConnects.append(1)
polygonConnects.append(4)
polygonConnects.append(7)
polygonConnects.append(2)
因此,第一个面是用顶点构建的:[0, 1, 2, 3]
并且由于它们在空间中的位置,此顺序还定义了此面的法线点到 [1, 0, 0]
。
所有其他面都一样。
最后一行:
mesh.create(vertices, polygonCounts, polygonConnects)
简单地告诉 MFnMesh
对象创建一个具有给定属性的新网格。
在这个例子中,我没有为这个单位立方体构建 UV,以避免增加这个例子的复杂性。
因此,如果您在选中立方体的情况下打开 UV 编辑器,则不会显示任何 UV。
这没什么大不了的,因为您可以按照自己喜欢的方式创建 UV 和展开多边形,但是如果您甚至想创建 UV,过程几乎相同,除了您还需要调用方法 assignUV
实际将 UV 应用到多边形。
警告
这个过程只创建网格,以及其他任何东西。
这意味着当您执行此代码时,视口(viewport)中的网格将为绿色,这意味着没有着色器分配给该网格。
带有完整示例的片段 https://gist.github.com/andrearastelli/fb297e6cac8cb745e90c273e7ff53a1d
关于c++ - 如何在 Maya API C++ 中创建多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286385/
我是一名优秀的程序员,十分优秀!